From 164207cae3b34afb49310d07201dbf608523627a Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Tue, 20 Jul 1993 02:50:15 +0000 Subject: [PATCH] * symtab.h (enum minimal_symbol_type): Add mst_file_*. * partial-stab.h [DBXREAD_ONLY]: Record statics in miminal symbols. * dbxread.c (record_minimal_symbol): Deal with statics. * minsyms.c (lookup_minimal_symbol): Prefer externals to statics. --- gdb/ChangeLog | 5 +++ gdb/minsyms.c | 77 +++++++++++++++++++++++++++++++--------------- gdb/partial-stab.h | 24 +++------------ 3 files changed, 62 insertions(+), 44 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ee7e542530b..a654c976a6d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ Mon Jul 19 11:48:57 1993 Jim Kingdon (kingdon@deneb.cygnus.com) + * symtab.h (enum minimal_symbol_type): Add mst_file_*. + * partial-stab.h [DBXREAD_ONLY]: Record statics in miminal symbols. + * dbxread.c (record_minimal_symbol): Deal with statics. + * minsyms.c (lookup_minimal_symbol): Prefer externals to statics. + * config/i386/xm-i386sco.h: Define HAVE_TERMIOS. * printcmd.c, config/pa/xm-pa.h, config/alpha/xm-alpha.h: Make it so diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 4b48e2e9c8f..d8488f221cf 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -95,6 +95,7 @@ lookup_minimal_symbol (name, objf) struct objfile *objfile; struct minimal_symbol *msymbol; struct minimal_symbol *found_symbol = NULL; + struct minimal_symbol *found_file_symbol = NULL; #ifdef IBM6000_TARGET struct minimal_symbol *trampoline_symbol = NULL; #endif @@ -112,40 +113,68 @@ lookup_minimal_symbol (name, objf) { if (SYMBOL_MATCHES_NAME (msymbol, name)) { + switch (MSYMBOL_TYPE (msymbol)) + { + case mst_file_text: + case mst_file_data: + case mst_file_bss: + /* It is file-local. If we find more than one, just + return the latest one (the user can't expect + useful behavior in that case). */ + found_file_symbol = msymbol; + break; + + case mst_unknown: #ifdef IBM6000_TARGET - /* I *think* all platforms using shared libraries (and - trampoline code) will suffer this problem. Consider a - case where there are 5 shared libraries, each referencing - `foo' with a trampoline entry. When someone wants to put - a breakpoint on `foo' and the only info we have is minimal - symbol vector, we want to use the real `foo', rather than - one of those trampoline entries. MGO */ - /* If a trampoline symbol is found, we prefer to keep looking - for the *real* symbol. If the actual symbol not found, - then we'll use the trampoline entry. Sorry for the machine - dependent code here, but I hope this will benefit other - platforms as well. For trampoline entries, we used - mst_unknown earlier. Perhaps we should define a - `mst_trampoline' type?? */ - - if (MSYMBOL_TYPE (msymbol) != mst_unknown) - found_symbol = msymbol; - else if (MSYMBOL_TYPE (msymbol) == mst_unknown && - !trampoline_symbol) - trampoline_symbol = msymbol; - + /* I *think* all platforms using shared + libraries (and trampoline code) will suffer + this problem. Consider a case where there are + 5 shared libraries, each referencing `foo' + with a trampoline entry. When someone wants + to put a breakpoint on `foo' and the only + info we have is minimal symbol vector, we + want to use the real `foo', rather than one + of those trampoline entries. MGO */ + + /* If a trampoline symbol is found, we prefer to + keep looking for the *real* symbol. If the + actual symbol not found, then we'll use the + trampoline entry. Sorry for the machine + dependent code here, but I hope this will + benefit other platforms as well. For + trampoline entries, we used mst_unknown + earlier. Perhaps we should define a + `mst_trampoline' type?? */ + + if (trampoline_symbol == NULL) + trampoline_symbol = msymbol; + break; #else - found_symbol = msymbol; + /* FALLTHROUGH */ #endif + default: + found_symbol = msymbol; + break; + } } } } } + /* External symbols are best. */ + if (found_symbol) + return found_symbol; + + /* File-local symbols are next best. */ + if (found_file_symbol) + return found_file_symbol; + + /* Symbols for IBM shared library trampolines are next best. */ #ifdef IBM6000_TARGET - return found_symbol ? found_symbol : trampoline_symbol; + if (trampoline_symbol) + return trampoline_symbol; #endif - return (found_symbol); + return NULL; } diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h index 1eea3ccee8c..35d0193742c 100644 --- a/gdb/partial-stab.h +++ b/gdb/partial-stab.h @@ -43,6 +43,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ 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: /* FIXME, is this in BSS? */ @@ -108,30 +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 += ANOFFSET (section_offsets, SECT_OFF_DATA); - 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. - FIXME: this might want to check for _DYNAMIC and the current - symbol_leading_char. */ - if (namestring[8] == 'C' && STREQ ("__DYNAMIC", namestring)) - goto record_it; - - /* Same with virtual function tables, both global and static. */ - { - char *tempstring = namestring; - if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd)) - tempstring++; - if (VTBL_PREFIX_P ((tempstring))) - goto record_it; - } -#endif /* DBXREAD_ONLY */ - continue; + goto record_it; case N_UNDF | N_EXT: #ifdef DBXREAD_ONLY @@ -175,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; -- 2.30.2