X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fpartial-stab.h;h=e18cabbba097f0e6221562eaa2f40794fa38461c;hb=1d9d99f32d861ae85dd59689ada801cc51d3ac91;hp=b8c9de8d1fef885c7277ef380bdb1735abfb0442;hpb=27e232885db363fb545fd2f450e72d929e59b8f6;p=binutils-gdb.git diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h index b8c9de8d1fe..e18cabbba09 100644 --- a/gdb/partial-stab.h +++ b/gdb/partial-stab.h @@ -1,5 +1,6 @@ /* Shared code to pre-read a stab (dbx-style), when building a psymtab. - Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 1998 + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, + 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GDB. @@ -39,6 +40,9 @@ switch (CUR_SYMBOL_TYPE) { + static struct complaint function_outside_compilation_unit = { + "function `%s' appears to be defined outside of all compilation units", 0, 0 + }; char *p; /* * Standard, external, non-debugger, symbols @@ -197,7 +201,7 @@ switch (CUR_SYMBOL_TYPE) case N_SO: { - unsigned long valu; + CORE_ADDR valu; static int prev_so_symnum = -10; static int first_so_symnum; char *p; @@ -395,7 +399,7 @@ switch (CUR_SYMBOL_TYPE) /* See if this is an end of function stab. */ if (pst && CUR_SYMBOL_TYPE == N_FUN && *namestring == '\000') { - unsigned long valu; + CORE_ADDR valu; /* It's value is the size (in bytes) of the function for function relative stabs, or the address of the function's @@ -575,6 +579,15 @@ switch (CUR_SYMBOL_TYPE) continue; case 'f': + if (! pst) + { + int name_len = p - namestring; + char *name = xmalloc (name_len + 1); + memcpy (name, namestring, name_len); + name[name_len] = '\0'; + complain (&function_outside_compilation_unit, name); + xfree (name); + } CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); #ifdef DBXREAD_ONLY /* Kludges for ELF/STABS with Sun ACC */ @@ -582,10 +595,22 @@ switch (CUR_SYMBOL_TYPE) #ifdef SOFUN_ADDRESS_MAYBE_MISSING /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit value for the bottom of the text seg in those cases. */ - if (pst && textlow_not_set) + if (CUR_SYMBOL_VALUE == ANOFFSET (objfile->section_offsets, + SECT_OFF_TEXT (objfile))) { - pst->textlow = + CORE_ADDR minsym_valu = find_stab_function_addr (namestring, pst->filename, objfile); + /* find_stab_function_addr will return 0 if the minimal + symbol wasn't found. (Unfortunately, this might also + be a valid address.) Anyway, if it *does* return 0, + it is likely that the value was set correctly to begin + with... */ + if (minsym_valu != 0) + CUR_SYMBOL_VALUE = minsym_valu; + } + if (pst && textlow_not_set) + { + pst->textlow = CUR_SYMBOL_VALUE; textlow_not_set = 0; } #endif @@ -599,10 +624,12 @@ switch (CUR_SYMBOL_TYPE) the bounds created by N_SO symbols. If that's the case use the address of this function as the low bound for the partial symbol table. */ - if (textlow_not_set - || (CUR_SYMBOL_VALUE < pst->textlow - && CUR_SYMBOL_VALUE - != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))) + if (pst + && (textlow_not_set + || (CUR_SYMBOL_VALUE < pst->textlow + && (CUR_SYMBOL_VALUE + != ANOFFSET (objfile->section_offsets, + SECT_OFF_TEXT (objfile)))))) { pst->textlow = CUR_SYMBOL_VALUE; textlow_not_set = 0; @@ -619,6 +646,15 @@ switch (CUR_SYMBOL_TYPE) are put into the global psymtab like one would expect. They're also in the minimal symbol table. */ case 'F': + if (! pst) + { + int name_len = p - namestring; + char *name = xmalloc (name_len + 1); + memcpy (name, namestring, name_len); + name[name_len] = '\0'; + complain (&function_outside_compilation_unit, name); + xfree (name); + } CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); #ifdef DBXREAD_ONLY /* Kludges for ELF/STABS with Sun ACC */ @@ -628,8 +664,17 @@ switch (CUR_SYMBOL_TYPE) value for the bottom of the text seg in those cases. */ if (CUR_SYMBOL_VALUE == ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))) - CUR_SYMBOL_VALUE = - find_stab_function_addr (namestring, pst->filename, objfile); + { + CORE_ADDR minsym_valu = + find_stab_function_addr (namestring, pst->filename, objfile); + /* find_stab_function_addr will return 0 if the minimal + symbol wasn't found. (Unfortunately, this might also + be a valid address.) Anyway, if it *does* return 0, + it is likely that the value was set correctly to begin + with... */ + if (minsym_valu != 0) + CUR_SYMBOL_VALUE = minsym_valu; + } if (pst && textlow_not_set) { pst->textlow = CUR_SYMBOL_VALUE; @@ -646,10 +691,12 @@ switch (CUR_SYMBOL_TYPE) the bounds created by N_SO symbols. If that's the case use the address of this function as the low bound for the partial symbol table. */ - if (textlow_not_set - || (CUR_SYMBOL_VALUE < pst->textlow - && CUR_SYMBOL_VALUE - != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))) + if (pst + && (textlow_not_set + || (CUR_SYMBOL_VALUE < pst->textlow + && (CUR_SYMBOL_VALUE + != ANOFFSET (objfile->section_offsets, + SECT_OFF_TEXT (objfile)))))) { pst->textlow = CUR_SYMBOL_VALUE; textlow_not_set = 0;