X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fpartial-stab.h;h=794b370271afcb1969037129f5b46f94c4cec059;hb=2fe3b329f69ca294a8ad3f1f655df7db33a6eb65;hp=9686301b691e63e0b8eb7b599c86c30498350009;hpb=bcbf95597c9ce57a9899705d2242e6a1714f6301;p=binutils-gdb.git diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h index 9686301b691..794b370271a 100644 --- a/gdb/partial-stab.h +++ b/gdb/partial-stab.h @@ -1,6 +1,6 @@ /* Shared code to pre-read a stab (dbx-style), when building a psymtab. - Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation, - Inc. + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994 + Free Software Foundation, Inc. This file is part of GDB. @@ -35,16 +35,24 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ case N_TEXT | N_EXT: case N_NBTEXT | N_EXT: + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); + goto record_it; + + case N_DATA | N_EXT: case N_NBDATA | N_EXT: + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); + goto record_it; + + case N_BSS: + case N_BSS | N_EXT: case N_NBBSS | N_EXT: - case N_SETV | N_EXT: + case N_SETV | N_EXT: /* FIXME, is this in BSS? */ + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS); + goto record_it; + case N_ABS | N_EXT: - case N_DATA | N_EXT: - case N_BSS | N_EXT: + record_it: #ifdef DBXREAD_ONLY - - CUR_SYMBOL_VALUE += addr; /* Relocate */ - SET_NAMESTRING(); bss_ext_symbol: @@ -66,23 +74,29 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ case N_FN_SEQ: case N_TEXT: #ifdef DBXREAD_ONLY - CUR_SYMBOL_VALUE += addr; /* Relocate */ + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); SET_NAMESTRING(); if ((namestring[0] == '-' && namestring[1] == 'l') || (namestring [(nsl = strlen (namestring)) - 1] == 'o' - && namestring [nsl - 2] == '.')) + && namestring [nsl - 2] == '.') +#ifdef GDB_TARGET_IS_HPPA + /* some cooperation from gcc to get around ld stupidity */ + || (namestring[0] == 'e' && STREQ (namestring, "end_file.")) +#endif + ) { +#ifndef GDB_TARGET_IS_HPPA if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE && - objfile -> ei.entry_point >= last_o_file_start && - addr == 0) /* FIXME nogood nomore */ + objfile -> ei.entry_point >= last_o_file_start) { objfile -> ei.entry_file_lowpc = last_o_file_start; objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE; } +#endif if (past_first_source_file && pst /* The gould NP1 uses low values for .o and -l symbols which are not the address. */ - && CUR_SYMBOL_VALUE > pst->textlow) + && CUR_SYMBOL_VALUE >= pst->textlow) { END_PSYMTAB (pst, psymtab_include_list, includes_used, symnum * symbol_size, CUR_SYMBOL_VALUE, @@ -95,25 +109,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ past_first_source_file = 1; last_o_file_start = CUR_SYMBOL_VALUE; } + else + goto record_it; #endif /* DBXREAD_ONLY */ continue; case N_DATA: -#ifdef DBXREAD_ONLY - CUR_SYMBOL_VALUE += addr; /* Relocate */ - SET_NAMESTRING (); - /* Check for __DYNAMIC, which is used by Sun shared libraries. - Record it even if it's local, not global, so we can find it. - Same with virtual function tables, both global and static. */ - if ((namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0)) - || VTBL_PREFIX_P ((namestring+HASH_OFFSET))) - { - /* Not really a function here, but... */ - record_minimal_symbol (namestring, CUR_SYMBOL_VALUE, - CUR_SYMBOL_TYPE, objfile); /* Always */ - } -#endif /* DBXREAD_ONLY */ - continue; + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); + goto record_it; case N_UNDF | N_EXT: #ifdef DBXREAD_ONLY @@ -157,7 +160,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Lots of symbol types we can just ignore. */ case N_ABS: - case N_BSS: case N_NBDATA: case N_NBBSS: continue; @@ -185,152 +187,235 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ */ case N_SO: { - unsigned long valu = CUR_SYMBOL_VALUE; - /* Symbol number of the first symbol of this file (i.e. the N_SO - if there is just one, or the first if we have a pair). */ - int first_symnum = symnum; - - /* End the current partial symtab and start a new one */ + unsigned long valu; + static int prev_so_symnum = -10; + static int first_so_symnum; + char *p; - SET_NAMESTRING(); + valu = CUR_SYMBOL_VALUE + ANOFFSET (section_offsets, SECT_OFF_TEXT); - valu += addr; /* Relocate */ + past_first_source_file = 1; - if (pst && past_first_source_file) - { - /* Some compilers (including gcc) emit a pair of initial N_SOs. - The first one is a directory name; the second the file name. - If pst exists, is empty, and has a filename ending in '/', - we assume the previous N_SO was a directory name. */ - if (pst -> objfile -> global_psymbols.next - == (pst -> objfile -> global_psymbols.list + pst->globals_offset) - && pst -> objfile -> static_psymbols.next - == (pst -> objfile -> static_psymbols.list + pst->statics_offset) - && pst->filename && pst->filename[0] - && pst->filename[strlen(pst->filename)-1] == '/') { - /* Just replace the directory name with the real filename. */ - pst->filename = - (char *) obstack_alloc (&pst->objfile->psymbol_obstack, - strlen (namestring) + 1); - strcpy (pst->filename, namestring); - continue; - } - END_PSYMTAB (pst, psymtab_include_list, includes_used, - first_symnum * symbol_size, valu, - dependency_list, dependencies_used); - pst = (struct partial_symtab *) 0; - includes_used = 0; - dependencies_used = 0; + if (prev_so_symnum != symnum - 1) + { /* Here if prev stab wasn't N_SO */ + first_so_symnum = symnum; + + if (pst) + { + END_PSYMTAB (pst, psymtab_include_list, includes_used, + symnum * symbol_size, valu, + dependency_list, dependencies_used); + pst = (struct partial_symtab *) 0; + includes_used = 0; + dependencies_used = 0; + } } - else - past_first_source_file = 1; - pst = START_PSYMTAB (objfile, addr, - namestring, valu, - first_symnum * symbol_size, - objfile -> global_psymbols.next, - objfile -> static_psymbols.next); + prev_so_symnum = symnum; + + /* End the current partial symtab and start a new one */ + + SET_NAMESTRING(); + + /* Some compilers (including gcc) emit a pair of initial N_SOs. + The first one is a directory name; the second the file name. + If pst exists, is empty, and has a filename ending in '/', + we assume the previous N_SO was a directory name. */ + + p = strrchr (namestring, '/'); + if (p && *(p+1) == '\000') + continue; /* Simply ignore directory name SOs */ + + /* Some other compilers (C++ ones in particular) emit useless + SOs for non-existant .c files. We ignore all subsequent SOs that + immediately follow the first. */ + + if (!pst) + pst = START_PSYMTAB (objfile, section_offsets, + namestring, valu, + first_so_symnum * symbol_size, + objfile -> global_psymbols.next, + objfile -> static_psymbols.next); continue; } case N_BINCL: + { #ifdef DBXREAD_ONLY - /* Add this bincl to the bincl_list for future EXCLs. No - need to save the string; it'll be around until - read_dbx_symtab function returns */ + enum language tmp_language; + /* Add this bincl to the bincl_list for future EXCLs. No + need to save the string; it'll be around until + read_dbx_symtab function returns */ - SET_NAMESTRING(); - - add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE); - - /* Mark down an include file in the current psymtab */ + SET_NAMESTRING(); - psymtab_include_list[includes_used++] = namestring; - if (includes_used >= includes_allocated) - { - char **orig = psymtab_include_list; + tmp_language = deduce_language_from_filename (namestring); - psymtab_include_list = (char **) - alloca ((includes_allocated *= 2) * - sizeof (char *)); - memcpy ((PTR)psymtab_include_list, (PTR)orig, - includes_used * sizeof (char *)); - } + /* Only change the psymtab's language if we've learned + something useful (eg. tmp_language is not language_unknown). + In addition, to match what start_subfile does, never change + from C++ to C. */ + if (tmp_language != language_unknown + && (tmp_language != language_c + || psymtab_language != language_cplus)) + psymtab_language = tmp_language; -#endif /* DBXREAD_ONLY */ - continue; + add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE); - case N_SOL: - /* Mark down an include file in the current psymtab */ + /* Mark down an include file in the current psymtab */ - SET_NAMESTRING(); + goto record_include_file; - /* In C++, one may expect the same filename to come round many - times, when code is coming alternately from the main file - and from inline functions in other files. So I check to see - if this is a file we've seen before -- either the main - source file, or a previously included file. - - This seems to be a lot of time to be spending on N_SOL, but - things like "break c-exp.y:435" need to work (I - suppose the psymtab_include_list could be hashed or put - in a binary tree, if profiling shows this is a major hog). */ - if (pst && !strcmp (namestring, pst->filename)) +#else /* DBXREAD_ONLY */ continue; - { - register int i; - for (i = 0; i < includes_used; i++) - if (!strcmp (namestring, psymtab_include_list[i])) - { - i = -1; - break; - } - if (i == -1) - continue; +#endif } - psymtab_include_list[includes_used++] = namestring; - if (includes_used >= includes_allocated) + case N_SOL: + { + enum language tmp_language; + /* Mark down an include file in the current psymtab */ + + SET_NAMESTRING(); + + tmp_language = deduce_language_from_filename (namestring); + + /* Only change the psymtab's language if we've learned + something useful (eg. tmp_language is not language_unknown). + In addition, to match what start_subfile does, never change + from C++ to C. */ + if (tmp_language != language_unknown + && (tmp_language != language_c + || psymtab_language != language_cplus)) + psymtab_language = tmp_language; + + /* In C++, one may expect the same filename to come round many + times, when code is coming alternately from the main file + and from inline functions in other files. So I check to see + if this is a file we've seen before -- either the main + source file, or a previously included file. + + This seems to be a lot of time to be spending on N_SOL, but + things like "break c-exp.y:435" need to work (I + suppose the psymtab_include_list could be hashed or put + in a binary tree, if profiling shows this is a major hog). */ + if (pst && STREQ (namestring, pst->filename)) + continue; { - char **orig = psymtab_include_list; - - psymtab_include_list = (char **) - alloca ((includes_allocated *= 2) * - sizeof (char *)); - memcpy ((PTR)psymtab_include_list, (PTR)orig, - includes_used * sizeof (char *)); + register int i; + for (i = 0; i < includes_used; i++) + if (STREQ (namestring, psymtab_include_list[i])) + { + i = -1; + break; + } + if (i == -1) + continue; } - continue; - + +#ifdef DBXREAD_ONLY + record_include_file: +#endif + + psymtab_include_list[includes_used++] = namestring; + if (includes_used >= includes_allocated) + { + char **orig = psymtab_include_list; + + psymtab_include_list = (char **) + alloca ((includes_allocated *= 2) * + sizeof (char *)); + memcpy ((PTR)psymtab_include_list, (PTR)orig, + includes_used * sizeof (char *)); + } + continue; + } case N_LSYM: /* Typedef or automatic variable. */ case N_STSYM: /* Data seg var -- static */ case N_LCSYM: /* BSS " */ + case N_ROSYM: /* Read-only data seg var -- static. */ case N_NBSTS: /* Gould nobase. */ case N_NBLCS: /* symbols. */ + case N_FUN: + case N_GSYM: /* Global (extern) variable; can be + data or bss (sigh FIXME). */ + + /* Following may probably be ignored; I'll leave them here + for now (until I do Pascal and Modula 2 extensions). */ + + case N_PC: /* I may or may not need this; I + suspect not. */ + case N_M2C: /* I suspect that I can ignore this here. */ + case N_SCOPE: /* Same. */ SET_NAMESTRING(); p = (char *) strchr (namestring, ':'); + if (!p) + continue; /* Not a debugging symbol. */ + + - /* Skip if there is no :. */ - if (!p) continue; + /* Main processing section for debugging symbols which + the initial read through the symbol tables needs to worry + about. If we reach this point, the symbol which we are + considering is definitely one we are interested in. + p must also contain the (valid) index into the namestring + which indicates the debugging type symbol. */ switch (p[1]) { + case 'S': + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); + ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring, + VAR_NAMESPACE, LOC_STATIC, + objfile->static_psymbols, + CUR_SYMBOL_VALUE, + psymtab_language, objfile); + continue; + case 'G': + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); + /* The addresses in these entries are reported to be + wrong. See the code that reads 'G's for symtabs. */ + ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring, + VAR_NAMESPACE, LOC_STATIC, + objfile->global_psymbols, + CUR_SYMBOL_VALUE, + psymtab_language, objfile); + continue; + case 'T': if (p != namestring) /* a name is there, not just :T... */ { ADD_PSYMBOL_TO_LIST (namestring, p - namestring, STRUCT_NAMESPACE, LOC_TYPEDEF, - objfile->static_psymbols, CUR_SYMBOL_VALUE); + objfile->static_psymbols, + CUR_SYMBOL_VALUE, + psymtab_language, objfile); if (p[2] == 't') { /* Also a typedef with the same name. */ ADD_PSYMBOL_TO_LIST (namestring, p - namestring, VAR_NAMESPACE, LOC_TYPEDEF, - objfile->static_psymbols, CUR_SYMBOL_VALUE); + objfile->static_psymbols, + CUR_SYMBOL_VALUE, psymtab_language, + objfile); p += 1; } + /* The semantics of C++ state that "struct foo { ... }" + also defines a typedef for "foo". Unfortuantely, cfront + never makes the typedef when translating from C++ to C. + We make the typedef here so that "ptype foo" works as + expected for cfront translated code. */ + else if (psymtab_language == language_cplus) + { + /* Also a typedef with the same name. */ + ADD_PSYMBOL_TO_LIST (namestring, p - namestring, + VAR_NAMESPACE, LOC_TYPEDEF, + objfile->static_psymbols, + CUR_SYMBOL_VALUE, psymtab_language, + objfile); + } } goto check_enum; case 't': @@ -338,7 +423,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ { ADD_PSYMBOL_TO_LIST (namestring, p - namestring, VAR_NAMESPACE, LOC_TYPEDEF, - objfile->static_psymbols, CUR_SYMBOL_VALUE); + objfile->static_psymbols, + CUR_SYMBOL_VALUE, + psymtab_language, objfile); } check_enum: /* If this is an enumerated type, we need to @@ -347,9 +434,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ "enum {a, b} c;" in C, but fortunately those are rare. There is no way for GDB to find those from the enum type without spending too much time on it. Thus - to solve this problem, the compiler needs to put out separate - constant symbols ('c' N_LSYMS) for enum constants in - enums without names, or put out a dummy type. */ + to solve this problem, the compiler needs to put out the + enum in a nameless type. GCC2 does this. */ /* We are looking for something of the form ":" ("t" | "T") [ "="] "e" @@ -377,7 +463,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Check for and handle cretinous dbx symbol name continuation! */ - if (*p == '\\') + if (*p == '\\' || (*p == '?' && p[1] == '\0')) p = next_symbol_text (); /* Point to the character after the name @@ -388,7 +474,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ enum constants in psymtabs, just in symtabs. */ ADD_PSYMBOL_TO_LIST (p, q - p, VAR_NAMESPACE, LOC_CONST, - objfile->static_psymbols, 0); + objfile->static_psymbols, 0, + psymtab_language, objfile); /* Point past the name. */ p = q; /* Skip over the value. */ @@ -404,75 +491,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Constant, e.g. from "const" in Pascal. */ ADD_PSYMBOL_TO_LIST (namestring, p - namestring, VAR_NAMESPACE, LOC_CONST, - objfile->static_psymbols, CUR_SYMBOL_VALUE); - continue; - default: - /* Skip if the thing following the : is - not a letter (which indicates declaration of a local - variable, which we aren't interested in). */ - continue; - } - - case N_FUN: - case N_GSYM: /* Global (extern) variable; can be - data or bss (sigh). */ - - /* Following may probably be ignored; I'll leave them here - for now (until I do Pascal and Modula 2 extensions). */ - - case N_PC: /* I may or may not need this; I - suspect not. */ - case N_M2C: /* I suspect that I can ignore this here. */ - case N_SCOPE: /* Same. */ - - SET_NAMESTRING(); - - p = (char *) strchr (namestring, ':'); - if (!p) - continue; /* Not a debugging symbol. */ - - - - /* Main processing section for debugging symbols which - the initial read through the symbol tables needs to worry - about. If we reach this point, the symbol which we are - considering is definitely one we are interested in. - p must also contain the (valid) index into the namestring - which indicates the debugging type symbol. */ - - switch (p[1]) - { - case 'c': - ADD_PSYMBOL_TO_LIST (namestring, p - namestring, - VAR_NAMESPACE, LOC_CONST, - objfile->static_psymbols, CUR_SYMBOL_VALUE); - continue; - case 'S': - CUR_SYMBOL_VALUE += addr; /* Relocate */ - ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring, - VAR_NAMESPACE, LOC_STATIC, - objfile->static_psymbols, CUR_SYMBOL_VALUE); - continue; - case 'G': - CUR_SYMBOL_VALUE += addr; /* Relocate */ - /* The addresses in these entries are reported to be - wrong. See the code that reads 'G's for symtabs. */ - ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring, - VAR_NAMESPACE, LOC_STATIC, - objfile->global_psymbols, CUR_SYMBOL_VALUE); - continue; - - case 't': - ADD_PSYMBOL_TO_LIST (namestring, p - namestring, - VAR_NAMESPACE, LOC_TYPEDEF, - objfile->static_psymbols, CUR_SYMBOL_VALUE); + objfile->static_psymbols, CUR_SYMBOL_VALUE, + psymtab_language, objfile); continue; case 'f': + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); #ifdef DBXREAD_ONLY /* Kludges for ELF/STABS with Sun ACC */ last_function_name = namestring; - if (pst->textlow == 0) + if (pst && pst->textlow == 0) pst->textlow = CUR_SYMBOL_VALUE; #if 0 if (startup_file_end == 0) @@ -482,19 +510,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif /* DBXREAD_ONLY */ ADD_PSYMBOL_TO_LIST (namestring, p - namestring, VAR_NAMESPACE, LOC_BLOCK, - objfile->static_psymbols, CUR_SYMBOL_VALUE); + objfile->static_psymbols, CUR_SYMBOL_VALUE, + psymtab_language, objfile); continue; /* Global functions were ignored here, but now they are put into the global psymtab like one would expect. - They're also in the misc fn vector... - FIXME, why did it used to ignore these? That broke - "i fun" on these functions. */ + They're also in the minimal symbol table. */ case 'F': + CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); #ifdef DBXREAD_ONLY /* Kludges for ELF/STABS with Sun ACC */ last_function_name = namestring; - if (pst->textlow == 0) + if (pst && pst->textlow == 0) pst->textlow = CUR_SYMBOL_VALUE; #if 0 if (startup_file_end == 0) @@ -504,7 +532,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif /* DBXREAD_ONLY */ ADD_PSYMBOL_TO_LIST (namestring, p - namestring, VAR_NAMESPACE, LOC_BLOCK, - objfile->global_psymbols, CUR_SYMBOL_VALUE); + objfile->global_psymbols, CUR_SYMBOL_VALUE, + psymtab_language, objfile); continue; /* Two things show up here (hopefully); static symbols of @@ -524,14 +553,29 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ case '9': continue; - default: - /* Unexpected symbol. Ignore it; perhaps it is an extension - that we don't know about. - - Someone says sun cc puts out symbols like + case ':': + /* It is a C++ nested symbol. We don't need to record it + (I don't think); if we try to look up foo::bar::baz, + then symbols for the symtab containing foo should get + read in, I think. */ + /* Someone says sun cc puts out symbols like /foo/baz/maclib::/usr/local/bin/maclib, which would get here with a symbol type of ':'. */ continue; + + default: + /* Unexpected symbol descriptor. The second and subsequent stabs + of a continued stab can show up here. The question is + whether they ever can mimic a normal stab--it would be + nice if not, since we certainly don't want to spend the + time searching to the end of every string looking for + a backslash. */ + + complain (&unknown_symchar_complaint, p[1]); + + /* Ignore it; perhaps it is an extension that we don't + know about. */ + continue; } case N_EXCL: @@ -576,8 +620,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ (dependencies_used * sizeof (struct partial_symtab *))); #ifdef DEBUG_INFO - fprintf (stderr, "Had to reallocate dependency list.\n"); - fprintf (stderr, "New dependencies allocated: %d\n", + fprintf_unfiltered (gdb_stderr, "Had to reallocate dependency list.\n"); + fprintf_unfiltered (gdb_stderr, "New dependencies allocated: %d\n", dependencies_allocated); #endif } @@ -615,8 +659,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ case N_NSYMS: /* Ultrix 4.0: symbol count */ case N_DEFD: /* GNU Modula-2 */ - case N_OBJ: /* two useless types from Solaris */ + case N_OBJ: /* useless types from Solaris */ case N_OPT: + case N_ENDM: /* These symbols aren't interesting; don't worry about them */ continue; @@ -624,6 +669,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ default: /* If we haven't found it yet, ignore it. It's probably some new type we don't know about yet. */ - complain (&unknown_symtype_complaint, local_hex_string(CUR_SYMBOL_TYPE)); + complain (&unknown_symtype_complaint, + local_hex_string (CUR_SYMBOL_TYPE)); continue; }