* 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.
This commit is contained in:
Jim Kingdon 1993-07-20 02:50:15 +00:00
parent 675d65db00
commit 164207cae3
3 changed files with 62 additions and 44 deletions

View File

@ -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

View File

@ -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))
{
#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?? */
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;
if (MSYMBOL_TYPE (msymbol) != mst_unknown)
found_symbol = msymbol;
else if (MSYMBOL_TYPE (msymbol) == mst_unknown &&
!trampoline_symbol)
trampoline_symbol = msymbol;
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 (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;
}

View File

@ -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;