]> Git Repo - binutils.git/blob - gdb/partial-stab.h
* gdb.stabs/wierd{.def,.exp,-aout.S,-xcoff.S}: Add common block test.
[binutils.git] / gdb / partial-stab.h
1 /* Shared code to pre-read a stab (dbx-style), when building a psymtab.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
3    Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 /* The following need to be defined:
22    SET_NAMESTRING() --Set namestring to name of symbol.
23    CUR_SYMBOL_TYPE --Type code of current symbol.
24    CUR_SYMBOL_VALUE --Value field of current symbol.  May be adjusted here.
25  */
26
27 /* End of macro definitions, now let's handle them symbols!  */
28
29       switch (CUR_SYMBOL_TYPE)
30         {
31           char *p;
32           /*
33            * Standard, external, non-debugger, symbols
34            */
35
36         case N_TEXT | N_EXT:
37         case N_NBTEXT | N_EXT:
38           CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
39           goto record_it;
40
41         case N_DATA | N_EXT:
42         case N_NBDATA | N_EXT:
43           CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
44           goto record_it;
45
46         case N_BSS | N_EXT:
47         case N_NBBSS | N_EXT:
48         case N_SETV | N_EXT:            /* FIXME, is this in BSS? */
49           CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS);
50           goto record_it;
51
52         case N_ABS | N_EXT:
53         record_it:
54 #ifdef DBXREAD_ONLY
55           SET_NAMESTRING();
56
57         bss_ext_symbol:
58           record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
59                                  CUR_SYMBOL_TYPE, objfile); /* Always */
60 #endif /* DBXREAD_ONLY */
61           continue;
62
63           /* Standard, local, non-debugger, symbols */
64
65         case N_NBTEXT:
66
67           /* We need to be able to deal with both N_FN or N_TEXT,
68              because we have no way of knowing whether the sys-supplied ld
69              or GNU ld was used to make the executable.  Sequents throw
70              in another wrinkle -- they renumbered N_FN.  */
71
72         case N_FN:
73         case N_FN_SEQ:
74         case N_TEXT:
75 #ifdef DBXREAD_ONLY
76           CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
77           SET_NAMESTRING();
78           if ((namestring[0] == '-' && namestring[1] == 'l')
79               || (namestring [(nsl = strlen (namestring)) - 1] == 'o'
80                   && namestring [nsl - 2] == '.')
81 #ifdef GDB_TARGET_IS_HPPA
82               /* some cooperation from gcc to get around ld stupidity */
83               || (namestring[0] == 'e' && STREQ (namestring, "end_file."))
84 #endif
85               )
86             {
87 #ifndef GDB_TARGET_IS_HPPA
88               if (objfile -> ei.entry_point <  CUR_SYMBOL_VALUE &&
89                   objfile -> ei.entry_point >= last_o_file_start)
90                 {
91                   objfile -> ei.entry_file_lowpc = last_o_file_start;
92                   objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE;
93                 }
94 #endif
95               if (past_first_source_file && pst
96                   /* The gould NP1 uses low values for .o and -l symbols
97                      which are not the address.  */
98                   && CUR_SYMBOL_VALUE >= pst->textlow)
99                 {
100                   END_PSYMTAB (pst, psymtab_include_list, includes_used,
101                                symnum * symbol_size, CUR_SYMBOL_VALUE,
102                                dependency_list, dependencies_used);
103                   pst = (struct partial_symtab *) 0;
104                   includes_used = 0;
105                   dependencies_used = 0;
106                 }
107               else
108                 past_first_source_file = 1;
109               last_o_file_start = CUR_SYMBOL_VALUE;
110             }
111 #endif /* DBXREAD_ONLY */
112           continue;
113
114         case N_DATA:
115 #ifdef DBXREAD_ONLY
116           CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
117           SET_NAMESTRING ();
118           /* Check for __DYNAMIC, which is used by Sun shared libraries. 
119              Record it even if it's local, not global, so we can find it.
120              FIXME:  this might want to check for _DYNAMIC and the current
121                      symbol_leading_char.  */
122           if (namestring[8] == 'C' && STREQ ("__DYNAMIC", namestring))
123             goto record_it;
124
125           /* Same with virtual function tables, both global and static.  */
126           {
127             char *tempstring = namestring;
128             if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
129               tempstring++;
130             if (VTBL_PREFIX_P ((tempstring)))
131               goto record_it;
132           }
133 #endif /* DBXREAD_ONLY */
134           continue;
135
136         case N_UNDF | N_EXT:
137 #ifdef DBXREAD_ONLY
138           if (CUR_SYMBOL_VALUE != 0) {
139             /* This is a "Fortran COMMON" symbol.  See if the target
140                environment knows where it has been relocated to.  */
141
142             CORE_ADDR reladdr;
143
144             SET_NAMESTRING();
145             if (target_lookup_symbol (namestring, &reladdr)) {
146               continue;         /* Error in lookup; ignore symbol for now.  */
147             }
148             CUR_SYMBOL_TYPE ^= (N_BSS^N_UNDF);  /* Define it as a bss-symbol */
149             CUR_SYMBOL_VALUE = reladdr;
150             goto bss_ext_symbol;
151           }
152 #endif /* DBXREAD_ONLY */
153           continue;     /* Just undefined, not COMMON */
154
155         case N_UNDF:
156 #ifdef DBXREAD_ONLY
157           if (processing_acc_compilation && bufp->n_strx == 1) {
158             /* Deal with relative offsets in the string table
159                used in ELF+STAB under Solaris.  If we want to use the
160                n_strx field, which contains the name of the file,
161                we must adjust file_string_table_offset *before* calling
162                SET_NAMESTRING().  */
163             past_first_source_file = 1;
164             file_string_table_offset = next_file_string_table_offset;
165             next_file_string_table_offset =
166               file_string_table_offset + bufp->n_value;
167             if (next_file_string_table_offset < file_string_table_offset)
168               error ("string table offset backs up at %d", symnum);
169   /* FIXME -- replace error() with complaint.  */
170             continue;
171           }
172 #endif /* DBXREAD_ONLY */
173           continue;
174
175             /* Lots of symbol types we can just ignore.  */
176
177         case N_ABS:
178         case N_BSS:
179         case N_NBDATA:
180         case N_NBBSS:
181           continue;
182
183           /* Keep going . . .*/
184
185           /*
186            * Special symbol types for GNU
187            */
188         case N_INDR:
189         case N_INDR | N_EXT:
190         case N_SETA:
191         case N_SETA | N_EXT:
192         case N_SETT:
193         case N_SETT | N_EXT:
194         case N_SETD:
195         case N_SETD | N_EXT:
196         case N_SETB:
197         case N_SETB | N_EXT:
198         case N_SETV:
199           continue;
200
201           /*
202            * Debugger symbols
203            */
204
205         case N_SO: {
206           unsigned long valu = CUR_SYMBOL_VALUE;
207           static int prev_so_symnum = -10;
208           static int first_so_symnum;
209           char *p;
210           
211           past_first_source_file = 1;
212
213           if (prev_so_symnum != symnum - 1)
214             {                   /* Here if prev stab wasn't N_SO */
215               first_so_symnum = symnum;
216
217               if (pst)
218                 {
219                   END_PSYMTAB (pst, psymtab_include_list, includes_used,
220                                symnum * symbol_size, valu,
221                                dependency_list, dependencies_used);
222                   pst = (struct partial_symtab *) 0;
223                   includes_used = 0;
224                   dependencies_used = 0;
225                 }
226             }
227
228           prev_so_symnum = symnum;
229
230           /* End the current partial symtab and start a new one */
231
232           SET_NAMESTRING();
233
234           valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
235
236           /* Some compilers (including gcc) emit a pair of initial N_SOs.
237              The first one is a directory name; the second the file name.
238              If pst exists, is empty, and has a filename ending in '/',
239              we assume the previous N_SO was a directory name. */
240
241           p = strrchr (namestring, '/');
242           if (p && *(p+1) == '\000')
243             continue;           /* Simply ignore directory name SOs */
244
245           /* Some other compilers (C++ ones in particular) emit useless
246              SOs for non-existant .c files.  We ignore all subsequent SOs that
247              immediately follow the first.  */
248
249           if (!pst)
250             pst = START_PSYMTAB (objfile, section_offsets,
251                                  namestring, valu,
252                                  first_so_symnum * symbol_size,
253                                  objfile -> global_psymbols.next,
254                                  objfile -> static_psymbols.next);
255           continue;
256         }
257
258         case N_BINCL:
259 #ifdef DBXREAD_ONLY
260           /* Add this bincl to the bincl_list for future EXCLs.  No
261              need to save the string; it'll be around until
262              read_dbx_symtab function returns */
263
264           SET_NAMESTRING();
265
266           add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
267
268           /* Mark down an include file in the current psymtab */
269
270           goto record_include_file;
271
272 #else /* DBXREAD_ONLY */
273           continue;
274 #endif
275
276         case N_SOL:
277           /* Mark down an include file in the current psymtab */
278
279           SET_NAMESTRING();
280
281           /* In C++, one may expect the same filename to come round many
282              times, when code is coming alternately from the main file
283              and from inline functions in other files. So I check to see
284              if this is a file we've seen before -- either the main
285              source file, or a previously included file.
286
287              This seems to be a lot of time to be spending on N_SOL, but
288              things like "break c-exp.y:435" need to work (I
289              suppose the psymtab_include_list could be hashed or put
290              in a binary tree, if profiling shows this is a major hog).  */
291           if (pst && STREQ (namestring, pst->filename))
292             continue;
293           {
294             register int i;
295             for (i = 0; i < includes_used; i++)
296               if (STREQ (namestring, psymtab_include_list[i]))
297                 {
298                   i = -1; 
299                   break;
300                 }
301             if (i == -1)
302               continue;
303           }
304
305         record_include_file:
306
307           psymtab_include_list[includes_used++] = namestring;
308           if (includes_used >= includes_allocated)
309             {
310               char **orig = psymtab_include_list;
311
312               psymtab_include_list = (char **)
313                 alloca ((includes_allocated *= 2) *
314                         sizeof (char *));
315               memcpy ((PTR)psymtab_include_list, (PTR)orig,
316                       includes_used * sizeof (char *));
317             }
318           continue;
319
320         case N_LSYM:            /* Typedef or automatic variable. */
321         case N_STSYM:           /* Data seg var -- static  */
322         case N_LCSYM:           /* BSS      "  */
323         case N_ROSYM:           /* Read-only data seg var -- static.  */
324         case N_NBSTS:           /* Gould nobase.  */
325         case N_NBLCS:           /* symbols.  */
326         case N_FUN:
327         case N_GSYM:            /* Global (extern) variable; can be
328                                    data or bss (sigh FIXME).  */
329
330         /* Following may probably be ignored; I'll leave them here
331            for now (until I do Pascal and Modula 2 extensions).  */
332
333         case N_PC:              /* I may or may not need this; I
334                                    suspect not.  */
335         case N_M2C:             /* I suspect that I can ignore this here. */
336         case N_SCOPE:           /* Same.   */
337
338           SET_NAMESTRING();
339
340           p = (char *) strchr (namestring, ':');
341           if (!p)
342             continue;           /* Not a debugging symbol.   */
343
344
345
346           /* Main processing section for debugging symbols which
347              the initial read through the symbol tables needs to worry
348              about.  If we reach this point, the symbol which we are
349              considering is definitely one we are interested in.
350              p must also contain the (valid) index into the namestring
351              which indicates the debugging type symbol.  */
352
353           switch (p[1])
354             {
355             case 'S':
356               CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
357               ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
358                                         VAR_NAMESPACE, LOC_STATIC,
359                                         objfile->static_psymbols,
360                                         CUR_SYMBOL_VALUE,
361                                         psymtab_language, objfile);
362               continue;
363             case 'G':
364               CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
365               /* The addresses in these entries are reported to be
366                  wrong.  See the code that reads 'G's for symtabs. */
367               ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
368                                         VAR_NAMESPACE, LOC_STATIC,
369                                         objfile->global_psymbols,
370                                         CUR_SYMBOL_VALUE,
371                                         psymtab_language, objfile);
372               continue;
373
374             case 'T':
375               if (p != namestring)      /* a name is there, not just :T... */
376                 {
377                   ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
378                                        STRUCT_NAMESPACE, LOC_TYPEDEF,
379                                        objfile->static_psymbols,
380                                        CUR_SYMBOL_VALUE,
381                                        psymtab_language, objfile);
382                   if (p[2] == 't')
383                     {
384                       /* Also a typedef with the same name.  */
385                       ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
386                                            VAR_NAMESPACE, LOC_TYPEDEF,
387                                            objfile->static_psymbols,
388                                            CUR_SYMBOL_VALUE, psymtab_language,
389                                            objfile);
390                       p += 1;
391                     }
392                 }
393               goto check_enum;
394             case 't':
395               if (p != namestring)      /* a name is there, not just :T... */
396                 {
397                   ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
398                                        VAR_NAMESPACE, LOC_TYPEDEF,
399                                        objfile->static_psymbols,
400                                        CUR_SYMBOL_VALUE,
401                                        psymtab_language, objfile);
402                 }
403             check_enum:
404               /* If this is an enumerated type, we need to
405                  add all the enum constants to the partial symbol
406                  table.  This does not cover enums without names, e.g.
407                  "enum {a, b} c;" in C, but fortunately those are
408                  rare.  There is no way for GDB to find those from the
409                  enum type without spending too much time on it.  Thus
410                  to solve this problem, the compiler needs to put out the
411                  enum in a nameless type.  GCC2 does this.  */
412
413               /* We are looking for something of the form
414                  <name> ":" ("t" | "T") [<number> "="] "e"
415                  {<constant> ":" <value> ","} ";".  */
416
417               /* Skip over the colon and the 't' or 'T'.  */
418               p += 2;
419               /* This type may be given a number.  Also, numbers can come
420                  in pairs like (0,26).  Skip over it.  */
421               while ((*p >= '0' && *p <= '9')
422                      || *p == '(' || *p == ',' || *p == ')'
423                      || *p == '=')
424                 p++;
425
426               if (*p++ == 'e')
427                 {
428                   /* We have found an enumerated type.  */
429                   /* According to comments in read_enum_type
430                      a comma could end it instead of a semicolon.
431                      I don't know where that happens.
432                      Accept either.  */
433                   while (*p && *p != ';' && *p != ',')
434                     {
435                       char *q;
436
437                       /* Check for and handle cretinous dbx symbol name
438                          continuation!  */
439                       if (*p == '\\')
440                         p = next_symbol_text ();
441
442                       /* Point to the character after the name
443                          of the enum constant.  */
444                       for (q = p; *q && *q != ':'; q++)
445                         ;
446                       /* Note that the value doesn't matter for
447                          enum constants in psymtabs, just in symtabs.  */
448                       ADD_PSYMBOL_TO_LIST (p, q - p,
449                                            VAR_NAMESPACE, LOC_CONST,
450                                            objfile->static_psymbols, 0,
451                                            psymtab_language, objfile);
452                       /* Point past the name.  */
453                       p = q;
454                       /* Skip over the value.  */
455                       while (*p && *p != ',')
456                         p++;
457                       /* Advance past the comma.  */
458                       if (*p)
459                         p++;
460                     }
461                 }
462               continue;
463             case 'c':
464               /* Constant, e.g. from "const" in Pascal.  */
465               ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
466                                    VAR_NAMESPACE, LOC_CONST,
467                                    objfile->static_psymbols, CUR_SYMBOL_VALUE,
468                                    psymtab_language, objfile);
469               continue;
470
471             case 'f':
472 #ifdef DBXREAD_ONLY
473               /* Kludges for ELF/STABS with Sun ACC */
474               last_function_name = namestring;
475               if (pst && pst->textlow == 0)
476                 pst->textlow = CUR_SYMBOL_VALUE;
477 #if 0
478               if (startup_file_end == 0)
479                 startup_file_end = CUR_SYMBOL_VALUE;
480 #endif
481               /* End kludge.  */
482 #endif /* DBXREAD_ONLY */
483               ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
484                                    VAR_NAMESPACE, LOC_BLOCK,
485                                    objfile->static_psymbols, CUR_SYMBOL_VALUE,
486                                    psymtab_language, objfile);
487               continue;
488
489               /* Global functions were ignored here, but now they
490                  are put into the global psymtab like one would expect.
491                  They're also in the minimal symbol table.  */
492             case 'F':
493 #ifdef DBXREAD_ONLY
494               /* Kludges for ELF/STABS with Sun ACC */
495               last_function_name = namestring;
496               if (pst && pst->textlow == 0)
497                 pst->textlow = CUR_SYMBOL_VALUE;
498 #if 0
499               if (startup_file_end == 0)
500                 startup_file_end = CUR_SYMBOL_VALUE;
501 #endif
502               /* End kludge.  */
503 #endif /* DBXREAD_ONLY */
504               ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
505                                    VAR_NAMESPACE, LOC_BLOCK,
506                                    objfile->global_psymbols, CUR_SYMBOL_VALUE,
507                                    psymtab_language, objfile);
508               continue;
509
510               /* Two things show up here (hopefully); static symbols of
511                  local scope (static used inside braces) or extensions
512                  of structure symbols.  We can ignore both.  */
513             case 'V':
514             case '(':
515             case '0':
516             case '1':
517             case '2':
518             case '3':
519             case '4':
520             case '5':
521             case '6':
522             case '7':
523             case '8':
524             case '9':
525               continue;
526
527             default:
528               /* Unexpected symbol.  Ignore it; perhaps it is an extension
529                  that we don't know about.
530
531                  Someone says sun cc puts out symbols like
532                  /foo/baz/maclib::/usr/local/bin/maclib,
533                  which would get here with a symbol type of ':'.  */
534               complain (&unknown_symchar_complaint, p[1]);
535               continue;
536             }
537
538         case N_EXCL:
539 #ifdef DBXREAD_ONLY
540
541           SET_NAMESTRING();
542
543           /* Find the corresponding bincl and mark that psymtab on the
544              psymtab dependency list */
545           {
546             struct partial_symtab *needed_pst =
547               find_corresponding_bincl_psymtab (namestring, CUR_SYMBOL_VALUE);
548
549             /* If this include file was defined earlier in this file,
550                leave it alone.  */
551             if (needed_pst == pst) continue;
552
553             if (needed_pst)
554               {
555                 int i;
556                 int found = 0;
557
558                 for (i = 0; i < dependencies_used; i++)
559                   if (dependency_list[i] == needed_pst)
560                     {
561                       found = 1;
562                       break;
563                     }
564
565                 /* If it's already in the list, skip the rest.  */
566                 if (found) continue;
567
568                 dependency_list[dependencies_used++] = needed_pst;
569                 if (dependencies_used >= dependencies_allocated)
570                   {
571                     struct partial_symtab **orig = dependency_list;
572                     dependency_list =
573                       (struct partial_symtab **)
574                         alloca ((dependencies_allocated *= 2)
575                                 * sizeof (struct partial_symtab *));
576                     memcpy ((PTR)dependency_list, (PTR)orig,
577                            (dependencies_used
578                             * sizeof (struct partial_symtab *)));
579 #ifdef DEBUG_INFO
580                     fprintf (stderr, "Had to reallocate dependency list.\n");
581                     fprintf (stderr, "New dependencies allocated: %d\n",
582                              dependencies_allocated);
583 #endif
584                   }
585               }
586             else
587               error ("Invalid symbol data: \"repeated\" header file not previously seen, at symtab pos %d.",
588                      symnum);
589           }
590 #endif /* DBXREAD_ONLY */
591           continue;
592
593         case N_RBRAC:
594 #ifdef HANDLE_RBRAC
595           HANDLE_RBRAC(CUR_SYMBOL_VALUE);
596           continue;
597 #endif
598         case N_EINCL:
599         case N_DSLINE:
600         case N_BSLINE:
601         case N_SSYM:            /* Claim: Structure or union element.
602                                    Hopefully, I can ignore this.  */
603         case N_ENTRY:           /* Alternate entry point; can ignore. */
604         case N_MAIN:            /* Can definitely ignore this.   */
605         case N_CATCH:           /* These are GNU C++ extensions */
606         case N_EHDECL:          /* that can safely be ignored here. */
607         case N_LENG:
608         case N_BCOMM:
609         case N_ECOMM:
610         case N_ECOML:
611         case N_FNAME:
612         case N_SLINE:
613         case N_RSYM:
614         case N_PSYM:
615         case N_LBRAC:
616         case N_NSYMS:           /* Ultrix 4.0: symbol count */
617         case N_DEFD:            /* GNU Modula-2 */
618
619         case N_OBJ:             /* useless types from Solaris */
620         case N_OPT:
621         case N_ENDM:
622           /* These symbols aren't interesting; don't worry about them */
623
624           continue;
625
626         default:
627           /* If we haven't found it yet, ignore it.  It's probably some
628              new type we don't know about yet.  */
629           complain (&unknown_symtype_complaint,
630                     local_hex_string (CUR_SYMBOL_TYPE));
631           continue;
632         }
This page took 0.063459 seconds and 4 git commands to generate.