06adc8f838f441a7d5c89c749dab1be7339a7432
[binutils-gdb.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 Free Software Foundation,
3 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' && !strcmp (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' && !strcmp ("__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 psymtab_include_list[includes_used++] = namestring;
271 if (includes_used >= includes_allocated)
272 {
273 char **orig = psymtab_include_list;
274
275 psymtab_include_list = (char **)
276 alloca ((includes_allocated *= 2) *
277 sizeof (char *));
278 memcpy ((PTR)psymtab_include_list, (PTR)orig,
279 includes_used * sizeof (char *));
280 }
281
282 #endif /* DBXREAD_ONLY */
283 continue;
284
285 case N_SOL:
286 /* Mark down an include file in the current psymtab */
287
288 SET_NAMESTRING();
289
290 /* In C++, one may expect the same filename to come round many
291 times, when code is coming alternately from the main file
292 and from inline functions in other files. So I check to see
293 if this is a file we've seen before -- either the main
294 source file, or a previously included file.
295
296 This seems to be a lot of time to be spending on N_SOL, but
297 things like "break c-exp.y:435" need to work (I
298 suppose the psymtab_include_list could be hashed or put
299 in a binary tree, if profiling shows this is a major hog). */
300 if (pst && !strcmp (namestring, pst->filename))
301 continue;
302 {
303 register int i;
304 for (i = 0; i < includes_used; i++)
305 if (!strcmp (namestring, psymtab_include_list[i]))
306 {
307 i = -1;
308 break;
309 }
310 if (i == -1)
311 continue;
312 }
313
314 psymtab_include_list[includes_used++] = namestring;
315 if (includes_used >= includes_allocated)
316 {
317 char **orig = psymtab_include_list;
318
319 psymtab_include_list = (char **)
320 alloca ((includes_allocated *= 2) *
321 sizeof (char *));
322 memcpy ((PTR)psymtab_include_list, (PTR)orig,
323 includes_used * sizeof (char *));
324 }
325 continue;
326
327 case N_LSYM: /* Typedef or automatic variable. */
328 case N_STSYM: /* Data seg var -- static */
329 case N_LCSYM: /* BSS " */
330 case N_ROSYM: /* Read-only data seg var -- static. */
331 case N_NBSTS: /* Gould nobase. */
332 case N_NBLCS: /* symbols. */
333
334 SET_NAMESTRING();
335
336 p = (char *) strchr (namestring, ':');
337
338 /* Skip if there is no :. */
339 if (!p) continue;
340
341 switch (p[1])
342 {
343 case 'T':
344 if (p != namestring) /* a name is there, not just :T... */
345 {
346 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
347 STRUCT_NAMESPACE, LOC_TYPEDEF,
348 objfile->static_psymbols, CUR_SYMBOL_VALUE);
349 if (p[2] == 't')
350 {
351 /* Also a typedef with the same name. */
352 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
353 VAR_NAMESPACE, LOC_TYPEDEF,
354 objfile->static_psymbols, CUR_SYMBOL_VALUE);
355 p += 1;
356 }
357 }
358 goto check_enum;
359 case 't':
360 if (p != namestring) /* a name is there, not just :T... */
361 {
362 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
363 VAR_NAMESPACE, LOC_TYPEDEF,
364 objfile->static_psymbols, CUR_SYMBOL_VALUE);
365 }
366 check_enum:
367 /* If this is an enumerated type, we need to
368 add all the enum constants to the partial symbol
369 table. This does not cover enums without names, e.g.
370 "enum {a, b} c;" in C, but fortunately those are
371 rare. There is no way for GDB to find those from the
372 enum type without spending too much time on it. Thus
373 to solve this problem, the compiler needs to put out separate
374 constant symbols ('c' N_LSYMS) for enum constants in
375 enums without names, or put out a dummy type. */
376
377 /* We are looking for something of the form
378 <name> ":" ("t" | "T") [<number> "="] "e"
379 {<constant> ":" <value> ","} ";". */
380
381 /* Skip over the colon and the 't' or 'T'. */
382 p += 2;
383 /* This type may be given a number. Also, numbers can come
384 in pairs like (0,26). Skip over it. */
385 while ((*p >= '0' && *p <= '9')
386 || *p == '(' || *p == ',' || *p == ')'
387 || *p == '=')
388 p++;
389
390 if (*p++ == 'e')
391 {
392 /* We have found an enumerated type. */
393 /* According to comments in read_enum_type
394 a comma could end it instead of a semicolon.
395 I don't know where that happens.
396 Accept either. */
397 while (*p && *p != ';' && *p != ',')
398 {
399 char *q;
400
401 /* Check for and handle cretinous dbx symbol name
402 continuation! */
403 if (*p == '\\')
404 p = next_symbol_text ();
405
406 /* Point to the character after the name
407 of the enum constant. */
408 for (q = p; *q && *q != ':'; q++)
409 ;
410 /* Note that the value doesn't matter for
411 enum constants in psymtabs, just in symtabs. */
412 ADD_PSYMBOL_TO_LIST (p, q - p,
413 VAR_NAMESPACE, LOC_CONST,
414 objfile->static_psymbols, 0);
415 /* Point past the name. */
416 p = q;
417 /* Skip over the value. */
418 while (*p && *p != ',')
419 p++;
420 /* Advance past the comma. */
421 if (*p)
422 p++;
423 }
424 }
425 continue;
426 case 'c':
427 /* Constant, e.g. from "const" in Pascal. */
428 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
429 VAR_NAMESPACE, LOC_CONST,
430 objfile->static_psymbols, CUR_SYMBOL_VALUE);
431 continue;
432 default:
433 /* Skip if the thing following the : is
434 not a letter (which indicates declaration of a local
435 variable, which we aren't interested in). */
436 continue;
437 }
438
439 case N_FUN:
440 case N_GSYM: /* Global (extern) variable; can be
441 data or bss (sigh FIXME). */
442
443 /* Following may probably be ignored; I'll leave them here
444 for now (until I do Pascal and Modula 2 extensions). */
445
446 case N_PC: /* I may or may not need this; I
447 suspect not. */
448 case N_M2C: /* I suspect that I can ignore this here. */
449 case N_SCOPE: /* Same. */
450
451 SET_NAMESTRING();
452
453 p = (char *) strchr (namestring, ':');
454 if (!p)
455 continue; /* Not a debugging symbol. */
456
457
458
459 /* Main processing section for debugging symbols which
460 the initial read through the symbol tables needs to worry
461 about. If we reach this point, the symbol which we are
462 considering is definitely one we are interested in.
463 p must also contain the (valid) index into the namestring
464 which indicates the debugging type symbol. */
465
466 switch (p[1])
467 {
468 case 'c':
469 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
470 VAR_NAMESPACE, LOC_CONST,
471 objfile->static_psymbols, CUR_SYMBOL_VALUE);
472 continue;
473 case 'S':
474 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
475 ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
476 VAR_NAMESPACE, LOC_STATIC,
477 objfile->static_psymbols, CUR_SYMBOL_VALUE);
478 continue;
479 case 'G':
480 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
481 /* The addresses in these entries are reported to be
482 wrong. See the code that reads 'G's for symtabs. */
483 ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
484 VAR_NAMESPACE, LOC_STATIC,
485 objfile->global_psymbols, CUR_SYMBOL_VALUE);
486 continue;
487
488 case 't':
489 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
490 VAR_NAMESPACE, LOC_TYPEDEF,
491 objfile->static_psymbols, CUR_SYMBOL_VALUE);
492 continue;
493
494 case 'f':
495 #ifdef DBXREAD_ONLY
496 /* Kludges for ELF/STABS with Sun ACC */
497 last_function_name = namestring;
498 if (pst && pst->textlow == 0)
499 pst->textlow = CUR_SYMBOL_VALUE;
500 #if 0
501 if (startup_file_end == 0)
502 startup_file_end = CUR_SYMBOL_VALUE;
503 #endif
504 /* End kludge. */
505 #endif /* DBXREAD_ONLY */
506 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
507 VAR_NAMESPACE, LOC_BLOCK,
508 objfile->static_psymbols, CUR_SYMBOL_VALUE);
509 continue;
510
511 /* Global functions were ignored here, but now they
512 are put into the global psymtab like one would expect.
513 They're also in the misc fn vector...
514 FIXME, why did it used to ignore these? That broke
515 "i fun" on these functions. */
516 case 'F':
517 #ifdef DBXREAD_ONLY
518 /* Kludges for ELF/STABS with Sun ACC */
519 last_function_name = namestring;
520 if (pst && pst->textlow == 0)
521 pst->textlow = CUR_SYMBOL_VALUE;
522 #if 0
523 if (startup_file_end == 0)
524 startup_file_end = CUR_SYMBOL_VALUE;
525 #endif
526 /* End kludge. */
527 #endif /* DBXREAD_ONLY */
528 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
529 VAR_NAMESPACE, LOC_BLOCK,
530 objfile->global_psymbols, CUR_SYMBOL_VALUE);
531 continue;
532
533 /* Two things show up here (hopefully); static symbols of
534 local scope (static used inside braces) or extensions
535 of structure symbols. We can ignore both. */
536 case 'V':
537 case '(':
538 case '0':
539 case '1':
540 case '2':
541 case '3':
542 case '4':
543 case '5':
544 case '6':
545 case '7':
546 case '8':
547 case '9':
548 continue;
549
550 default:
551 /* Unexpected symbol. Ignore it; perhaps it is an extension
552 that we don't know about.
553
554 Someone says sun cc puts out symbols like
555 /foo/baz/maclib::/usr/local/bin/maclib,
556 which would get here with a symbol type of ':'. */
557 continue;
558 }
559
560 case N_EXCL:
561 #ifdef DBXREAD_ONLY
562
563 SET_NAMESTRING();
564
565 /* Find the corresponding bincl and mark that psymtab on the
566 psymtab dependency list */
567 {
568 struct partial_symtab *needed_pst =
569 find_corresponding_bincl_psymtab (namestring, CUR_SYMBOL_VALUE);
570
571 /* If this include file was defined earlier in this file,
572 leave it alone. */
573 if (needed_pst == pst) continue;
574
575 if (needed_pst)
576 {
577 int i;
578 int found = 0;
579
580 for (i = 0; i < dependencies_used; i++)
581 if (dependency_list[i] == needed_pst)
582 {
583 found = 1;
584 break;
585 }
586
587 /* If it's already in the list, skip the rest. */
588 if (found) continue;
589
590 dependency_list[dependencies_used++] = needed_pst;
591 if (dependencies_used >= dependencies_allocated)
592 {
593 struct partial_symtab **orig = dependency_list;
594 dependency_list =
595 (struct partial_symtab **)
596 alloca ((dependencies_allocated *= 2)
597 * sizeof (struct partial_symtab *));
598 memcpy ((PTR)dependency_list, (PTR)orig,
599 (dependencies_used
600 * sizeof (struct partial_symtab *)));
601 #ifdef DEBUG_INFO
602 fprintf (stderr, "Had to reallocate dependency list.\n");
603 fprintf (stderr, "New dependencies allocated: %d\n",
604 dependencies_allocated);
605 #endif
606 }
607 }
608 else
609 error ("Invalid symbol data: \"repeated\" header file not previously seen, at symtab pos %d.",
610 symnum);
611 }
612 #endif /* DBXREAD_ONLY */
613 continue;
614
615 case N_RBRAC:
616 #ifdef HANDLE_RBRAC
617 HANDLE_RBRAC(CUR_SYMBOL_VALUE);
618 continue;
619 #endif
620 case N_EINCL:
621 case N_DSLINE:
622 case N_BSLINE:
623 case N_SSYM: /* Claim: Structure or union element.
624 Hopefully, I can ignore this. */
625 case N_ENTRY: /* Alternate entry point; can ignore. */
626 case N_MAIN: /* Can definitely ignore this. */
627 case N_CATCH: /* These are GNU C++ extensions */
628 case N_EHDECL: /* that can safely be ignored here. */
629 case N_LENG:
630 case N_BCOMM:
631 case N_ECOMM:
632 case N_ECOML:
633 case N_FNAME:
634 case N_SLINE:
635 case N_RSYM:
636 case N_PSYM:
637 case N_LBRAC:
638 case N_NSYMS: /* Ultrix 4.0: symbol count */
639 case N_DEFD: /* GNU Modula-2 */
640
641 case N_OBJ: /* useless types from Solaris */
642 case N_OPT:
643 case N_ENDM:
644 /* These symbols aren't interesting; don't worry about them */
645
646 continue;
647
648 default:
649 /* If we haven't found it yet, ignore it. It's probably some
650 new type we don't know about yet. */
651 complain (&unknown_symtype_complaint,
652 local_hex_string (CUR_SYMBOL_TYPE));
653 continue;
654 }