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;
}
equal to PC. Returns a pointer to the minimal symbol if such a symbol
is found, or NULL if PC is not in a suitable range. Note that we need
to look through ALL the minimal symbol tables before deciding on the
- symbol that comes closest to the specified PC. */
+ symbol that comes closest to the specified PC. This is because objfiles
+ can overlap, for example objfile A has .text at 0x100 and .data at 0x40000
+ and objfile B has .text at 0x234 and .data at 0x40048. */
struct minimal_symbol *
lookup_minimal_symbol_by_pc (pc)
{
lo = 0;
hi = objfile -> minimal_symbol_count - 1;
-
+
/* This code assumes that the minimal symbols are sorted by
ascending address values. If the pc value is greater than or
equal to the first symbol's address, then some symbol in this
objfile's minimal symbol table. See if it is the best one
overall. */
- if ((best_symbol == NULL) ||
- (SYMBOL_VALUE_ADDRESS (best_symbol) <
- SYMBOL_VALUE_ADDRESS (&msymbol[hi])))
+ /* Skip any absolute symbols. This is apparently what adb
+ and dbx do, and is needed for the CM-5. There are two
+ known possible problems: (1) on ELF, apparently end, edata,
+ etc. are absolute. Not sure ignoring them here is a big
+ deal, but if we want to use them, the fix would go in
+ elfread.c. (2) I think shared library entry points on the
+ NeXT are absolute. If we want special handling for this
+ it probably should be triggered by a special
+ mst_abs_or_lib or some such. */
+ while (hi >= 0
+ && msymbol[hi].type == mst_abs)
+ --hi;
+
+ if (hi >= 0
+ && ((best_symbol == NULL) ||
+ (SYMBOL_VALUE_ADDRESS (best_symbol) <
+ SYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
{
best_symbol = &msymbol[hi];
}
}
- }
+ }
}
return (best_symbol);
}
}
msymbol = &msym_bunch -> contents[msym_bunch_index];
SYMBOL_NAME (msymbol) = (char *) name;
- /* Note that SYMBOL_LANGUAGE and SYMBOL_DEMANGLED_NAME are not initialized
- to their final values until the minimal symbols are actually added to
- the minimal symbol table. We just set them to a known state here so
- random values won't confuse anyone debugging the debugger. */
- SYMBOL_LANGUAGE (msymbol) = language_unknown;
- SYMBOL_DEMANGLED_NAME (msymbol) = NULL;
+ SYMBOL_INIT_LANGUAGE_SPECIFIC (msymbol, language_unknown);
SYMBOL_VALUE_ADDRESS (msymbol) = address;
+ SYMBOL_SECTION (msymbol) = -1;
MSYMBOL_TYPE (msymbol) = ms_type;
/* FIXME: This info, if it remains, needs its own field. */
MSYMBOL_INFO (msymbol) = NULL; /* FIXME! */
and pass it a NULL info pointer value if info is not needed? */
void
-prim_record_minimal_symbol_and_info (name, address, ms_type, info)
+prim_record_minimal_symbol_and_info (name, address, ms_type, info, section)
const char *name;
CORE_ADDR address;
enum minimal_symbol_type ms_type;
char *info;
+ int section;
{
register struct msym_bunch *new;
register struct minimal_symbol *msymbol;
}
msymbol = &msym_bunch -> contents[msym_bunch_index];
SYMBOL_NAME (msymbol) = (char *) name;
- /* Note that SYMBOL_LANGUAGE and SYMBOL_DEMANGLED_NAME are not initialized
- to their final values until the minimal symbols are actually added to
- the minimal symbol table. We just set them to a known state here so
- random values won't confuse anyone debugging the debugger. */
- SYMBOL_LANGUAGE (msymbol) = language_unknown;
- SYMBOL_DEMANGLED_NAME (msymbol) = NULL;
+ SYMBOL_INIT_LANGUAGE_SPECIFIC (msymbol, language_unknown);
SYMBOL_VALUE_ADDRESS (msymbol) = address;
+ SYMBOL_SECTION (msymbol) = section;
MSYMBOL_TYPE (msymbol) = ms_type;
/* FIXME: This info, if it remains, needs its own field. */
MSYMBOL_INFO (msymbol) = info; /* FIXME! */
register struct minimal_symbol *msymbols;
int alloc_count;
register char leading_char;
- char *demangled_name;
if (msym_count > 0)
{
SYMBOL_VALUE_ADDRESS (&msymbols[mcount]) = 0;
MSYMBOL_INFO (&msymbols[mcount]) = NULL;
MSYMBOL_TYPE (&msymbols[mcount]) = mst_unknown;
- SYMBOL_LANGUAGE (&msymbols[mcount]) = language_unknown;
- SYMBOL_DEMANGLED_NAME (&msymbols[mcount]) = NULL;
+ SYMBOL_INIT_LANGUAGE_SPECIFIC (&msymbols[mcount], language_unknown);
/* Attach the minimal symbol table to the specified objfile.
The strings themselves are also located in the symbol_obstack
for ( ; mcount-- > 0 ; msymbols++)
{
- if (SYMBOL_LANGUAGE (msymbols) == language_auto)
- {
- demangled_name = cplus_demangle (SYMBOL_NAME (msymbols),
- DMGL_PARAMS | DMGL_ANSI);
- if (demangled_name == NULL)
- {
- SYMBOL_LANGUAGE (msymbols) = language_unknown;
- }
- else
- {
- SYMBOL_LANGUAGE (msymbols) = language_cplus;
- SYMBOL_DEMANGLED_NAME (msymbols) =
- obsavestring (demangled_name, strlen (demangled_name),
- &objfile->symbol_obstack);
-
- free (demangled_name);
- }
- }
+ SYMBOL_INIT_DEMANGLED_NAME (msymbols, &objfile->symbol_obstack);
}
}
}