forked from Imagelibrary/binutils-gdb
Thu Apr 3 15:10:30 1997 Michael Snyder <msnyder@cleaver.cygnus.com>
Except for the two m32r modules, this checkin is for
overlay support.
* blockframe.c: blockvector_for_pc_sect(), block_for_pc_sect(),
find_pc_sect_function(), find_pc_sect_partial_function(): new
functions for debugging overlays; pc without section is ambiguous.
* breakpoint.[ch]: add section pointer to breakpoint struct;
add section argument to check_duplicates(); check section as well
as pc in [breakpoint_here_p(), breakpoint_inserted_here_p(),
breakpoint_thread_match(), bpstat_stop_status()];
add section argument to describe_other_breakpoints();
use INIT_SAL() macro to zero-out new sal structures;
make resolve_sal_pc() fix up the sal's section as well as its pc;
match on section + pc in clear_command() and delete_breakpoint();
account for overlay sections in insert_breakpoints(),
remove_breakpoint() and breakpoint_re_set_one();
all this to support overlays where a PC is not unique.
* exec.c: change xfer_memory() to handle overlay sections.
* findvar.c: change read_var_value() to handle overlay sections.
* frame.h: declaration for block_for_pc_sect() [blockframe.c].
* infcmd.c: jump_command() warns against jumping into an overlay
that's not in memory. Also use INIT_SAL() to initialize sals.
* infrun.c: wait_for_inferior() sets a flag to invalidate cached
overlay state information; Also use INIT_SAL() to init sals.
* m32r-rom.c: modify load routines to use LMA instead of VMA.
* m32r-stub.c: mask exit value down to 8 bits; screen out any
memory read/writes in the range 600000 to a00000, and ff680000
to ff800000 (hangs because nothing is mapped there); fix strcpy().
* maint.c: maintenance command "translate-address" supports overlays.
* minsyms.c: lookup_minimal_symbol_by_pc_sect() supports overlays.
* objfiles.[ch]: add ovly_mapped field to the obj_section struct;
this constitutes gdb's internal overlay mapping table. Add macro
ALL_OBJSECTIONS() to loop thru the obj_structs and look at overlays.
Add function find_pc_sect_section().
* printcmd.c: modify print_address_symbolic() with overlay smarts;
modify address_info() with overlay smarts; add function sym_info()
to support the INFO SYMBOL command (translate address to symbol(s));
modify disassemble_command() to work on unmapped overlays.
* source.c: use INIT_SAL() to initialize sals.
* symfile.[ch]: change generic_load() to use section's LMA address
instead of VMA address, for overlay sections.
Add numerous functions for finding a PC's section / overlay,
translating between VMA and LMA address ranges, determining if an
overlay section is mapped, etc. Add several user commands for
overlay debugging. Add support for a "generic" form of automatically
reading overlay mapping info from the inferior (based on the default
(simple) overlay manager which Cygnus provides as an example).
* symtab.[ch]: add functions find_pc_sect_symtab(),
find_pc_sect_psymtab(), find_pc_sect_psymbol(), find_pc_sect_line()
for lookup; modify lookup_symbol and decode_line_1() to use them;
modify find_function_start_sal() to account for overlay sections;
add macro INIT_SAL() for initializing struct symtab_and_line.
* target.c: fix a comment in the declaration of target_ops.
This commit is contained in:
@@ -302,25 +302,27 @@ lookup_minimal_symbol_solib_trampoline (name, sfile, objf)
|
||||
}
|
||||
|
||||
|
||||
/* Search through the minimal symbol table for each objfile and find the
|
||||
symbol whose address is the largest address that is still less than or
|
||||
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. 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. */
|
||||
/* Search through the minimal symbol table for each objfile and find
|
||||
the symbol whose address is the largest address that is still less
|
||||
than or equal to PC, and matches SECTION (if non-null). 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. 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)
|
||||
register CORE_ADDR pc;
|
||||
lookup_minimal_symbol_by_pc_section (pc, section)
|
||||
CORE_ADDR pc;
|
||||
asection *section;
|
||||
{
|
||||
register int lo;
|
||||
register int hi;
|
||||
register int new;
|
||||
register struct objfile *objfile;
|
||||
register struct minimal_symbol *msymbol;
|
||||
register struct minimal_symbol *best_symbol = NULL;
|
||||
int lo;
|
||||
int hi;
|
||||
int new;
|
||||
struct objfile *objfile;
|
||||
struct minimal_symbol *msymbol;
|
||||
struct minimal_symbol *best_symbol = NULL;
|
||||
|
||||
/* pc has to be in a known section. This ensures that anything beyond
|
||||
the end of the last segment doesn't appear to be part of the last
|
||||
@@ -361,7 +363,7 @@ lookup_minimal_symbol_by_pc (pc)
|
||||
|
||||
Warning: this code is trickier than it would appear at first. */
|
||||
|
||||
/* Should also requires that pc is <= end of objfile. FIXME! */
|
||||
/* Should also require that pc is <= end of objfile. FIXME! */
|
||||
if (pc >= SYMBOL_VALUE_ADDRESS (&msymbol[lo]))
|
||||
{
|
||||
while (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc)
|
||||
@@ -405,6 +407,13 @@ lookup_minimal_symbol_by_pc (pc)
|
||||
&& msymbol[hi].type == mst_abs)
|
||||
--hi;
|
||||
|
||||
/* If "section" specified, skip any symbol from wrong section */
|
||||
/* This is the new code that distinguishes it from the old function */
|
||||
if (section)
|
||||
while (hi >= 0
|
||||
&& SYMBOL_BFD_SECTION (&msymbol[hi]) != section)
|
||||
--hi;
|
||||
|
||||
if (hi >= 0
|
||||
&& ((best_symbol == NULL) ||
|
||||
(SYMBOL_VALUE_ADDRESS (best_symbol) <
|
||||
@@ -418,6 +427,16 @@ lookup_minimal_symbol_by_pc (pc)
|
||||
return (best_symbol);
|
||||
}
|
||||
|
||||
/* Backward compatibility: search through the minimal symbol table
|
||||
for a matching PC (no section given) */
|
||||
|
||||
struct minimal_symbol *
|
||||
lookup_minimal_symbol_by_pc (pc)
|
||||
CORE_ADDR pc;
|
||||
{
|
||||
return lookup_minimal_symbol_by_pc_section (pc, find_pc_mapped_section (pc));
|
||||
}
|
||||
|
||||
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
|
||||
CORE_ADDR
|
||||
find_stab_function_addr (namestring, pst, objfile)
|
||||
|
||||
Reference in New Issue
Block a user