* 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:
parent
675d65db00
commit
164207cae3
|
@ -1,5 +1,10 @@
|
||||||
Mon Jul 19 11:48:57 1993 Jim Kingdon (kingdon@deneb.cygnus.com)
|
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.
|
* config/i386/xm-i386sco.h: Define HAVE_TERMIOS.
|
||||||
|
|
||||||
* printcmd.c, config/pa/xm-pa.h, config/alpha/xm-alpha.h: Make it so
|
* printcmd.c, config/pa/xm-pa.h, config/alpha/xm-alpha.h: Make it so
|
||||||
|
|
|
@ -95,6 +95,7 @@ lookup_minimal_symbol (name, objf)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
struct minimal_symbol *msymbol;
|
struct minimal_symbol *msymbol;
|
||||||
struct minimal_symbol *found_symbol = NULL;
|
struct minimal_symbol *found_symbol = NULL;
|
||||||
|
struct minimal_symbol *found_file_symbol = NULL;
|
||||||
#ifdef IBM6000_TARGET
|
#ifdef IBM6000_TARGET
|
||||||
struct minimal_symbol *trampoline_symbol = NULL;
|
struct minimal_symbol *trampoline_symbol = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@ -112,40 +113,68 @@ lookup_minimal_symbol (name, objf)
|
||||||
{
|
{
|
||||||
if (SYMBOL_MATCHES_NAME (msymbol, name))
|
if (SYMBOL_MATCHES_NAME (msymbol, name))
|
||||||
{
|
{
|
||||||
#ifdef IBM6000_TARGET
|
switch (MSYMBOL_TYPE (msymbol))
|
||||||
/* I *think* all platforms using shared libraries (and
|
{
|
||||||
trampoline code) will suffer this problem. Consider a
|
case mst_file_text:
|
||||||
case where there are 5 shared libraries, each referencing
|
case mst_file_data:
|
||||||
`foo' with a trampoline entry. When someone wants to put
|
case mst_file_bss:
|
||||||
a breakpoint on `foo' and the only info we have is minimal
|
/* It is file-local. If we find more than one, just
|
||||||
symbol vector, we want to use the real `foo', rather than
|
return the latest one (the user can't expect
|
||||||
one of those trampoline entries. MGO */
|
useful behavior in that case). */
|
||||||
/* If a trampoline symbol is found, we prefer to keep looking
|
found_file_symbol = msymbol;
|
||||||
for the *real* symbol. If the actual symbol not found,
|
break;
|
||||||
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)
|
case mst_unknown:
|
||||||
found_symbol = msymbol;
|
#ifdef IBM6000_TARGET
|
||||||
else if (MSYMBOL_TYPE (msymbol) == mst_unknown &&
|
/* I *think* all platforms using shared
|
||||||
!trampoline_symbol)
|
libraries (and trampoline code) will suffer
|
||||||
trampoline_symbol = msymbol;
|
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
|
#else
|
||||||
found_symbol = msymbol;
|
/* FALLTHROUGH */
|
||||||
#endif
|
#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
|
#ifdef IBM6000_TARGET
|
||||||
return found_symbol ? found_symbol : trampoline_symbol;
|
if (trampoline_symbol)
|
||||||
|
return trampoline_symbol;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (found_symbol);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
goto record_it;
|
goto record_it;
|
||||||
|
|
||||||
|
case N_BSS:
|
||||||
case N_BSS | N_EXT:
|
case N_BSS | N_EXT:
|
||||||
case N_NBBSS | N_EXT:
|
case N_NBBSS | N_EXT:
|
||||||
case N_SETV | N_EXT: /* FIXME, is this in BSS? */
|
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;
|
past_first_source_file = 1;
|
||||||
last_o_file_start = CUR_SYMBOL_VALUE;
|
last_o_file_start = CUR_SYMBOL_VALUE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
goto record_it;
|
||||||
#endif /* DBXREAD_ONLY */
|
#endif /* DBXREAD_ONLY */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case N_DATA:
|
case N_DATA:
|
||||||
#ifdef DBXREAD_ONLY
|
|
||||||
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
|
||||||
SET_NAMESTRING ();
|
goto record_it;
|
||||||
/* 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;
|
|
||||||
|
|
||||||
case N_UNDF | N_EXT:
|
case N_UNDF | N_EXT:
|
||||||
#ifdef DBXREAD_ONLY
|
#ifdef DBXREAD_ONLY
|
||||||
|
@ -175,7 +160,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
/* Lots of symbol types we can just ignore. */
|
/* Lots of symbol types we can just ignore. */
|
||||||
|
|
||||||
case N_ABS:
|
case N_ABS:
|
||||||
case N_BSS:
|
|
||||||
case N_NBDATA:
|
case N_NBDATA:
|
||||||
case N_NBBSS:
|
case N_NBBSS:
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in New Issue