diff options
author | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-07-20 02:50:15 +0000 |
---|---|---|
committer | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-07-20 02:50:15 +0000 |
commit | 164207cae3b34afb49310d07201dbf608523627a (patch) | |
tree | e390273855ca9d0ee9758d1cfb135d1d110a07c0 /gdb/minsyms.c | |
parent | 675d65db004aa4c66d7864d07c469a303eda4c12 (diff) | |
download | gdb-164207cae3b34afb49310d07201dbf608523627a.zip gdb-164207cae3b34afb49310d07201dbf608523627a.tar.gz gdb-164207cae3b34afb49310d07201dbf608523627a.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/minsyms.c')
-rw-r--r-- | gdb/minsyms.c | 77 |
1 files changed, 53 insertions, 24 deletions
diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 4b48e2e..d8488f2 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; } |