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
{
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;
}
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? */
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
/* Lots of symbol types we can just ignore. */
case N_ABS:
- case N_BSS:
case N_NBDATA:
case N_NBBSS:
continue;