2004-02-09 Andrew Cagney <cagney@redhat.com>
* blockframe.c (find_pc_partial_function): If find_pc_overlay fails, try find_pc_section. Fix PR c++/1267. * minsyms.c (lookup_minimal_symbol_by_pc): Use find_pc_section instead of find_pc_mapped_section. (lookup_minimal_symbol_by_pc_section): If the SECTION is NULL, do not default to the section containing PC. Fix PR symtab/1519.
This commit is contained in:
parent
f380691611
commit
43b54b88e7
3 changed files with 47 additions and 15 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2004-02-09 Andrew Cagney <cagney@redhat.com>
|
||||||
|
|
||||||
|
* blockframe.c (find_pc_partial_function): If find_pc_overlay
|
||||||
|
fails, try find_pc_section. Fix PR c++/1267.
|
||||||
|
* minsyms.c (lookup_minimal_symbol_by_pc): Use find_pc_section
|
||||||
|
instead of find_pc_mapped_section.
|
||||||
|
(lookup_minimal_symbol_by_pc_section): If the SECTION is NULL, do
|
||||||
|
not default to the section containing PC. Fix PR symtab/1519.
|
||||||
|
|
||||||
2004-02-09 Andrew Cagney <cagney@redhat.com>
|
2004-02-09 Andrew Cagney <cagney@redhat.com>
|
||||||
|
|
||||||
* Makefile.in (mips-tdep.o): Update dependencies.
|
* Makefile.in (mips-tdep.o): Update dependencies.
|
||||||
|
|
|
@ -507,10 +507,24 @@ int
|
||||||
find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address,
|
find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address,
|
||||||
CORE_ADDR *endaddr)
|
CORE_ADDR *endaddr)
|
||||||
{
|
{
|
||||||
asection *section;
|
struct bfd_section *bfd_section;
|
||||||
|
|
||||||
section = find_pc_overlay (pc);
|
/* To ensure that the symbol returned belongs to the correct setion
|
||||||
return find_pc_sect_partial_function (pc, section, name, address, endaddr);
|
(and that the last [random] symbol from the previous section
|
||||||
|
isn't returned) try to find the section containing PC. First try
|
||||||
|
the overlay code (which by default returns NULL); and second try
|
||||||
|
the normal section code (which almost always succeeds). */
|
||||||
|
bfd_section = find_pc_overlay (pc);
|
||||||
|
if (bfd_section == NULL)
|
||||||
|
{
|
||||||
|
struct obj_section *obj_section = find_pc_section (pc);
|
||||||
|
if (obj_section == NULL)
|
||||||
|
bfd_section = NULL;
|
||||||
|
else
|
||||||
|
bfd_section = obj_section->the_bfd_section;
|
||||||
|
}
|
||||||
|
return find_pc_sect_partial_function (pc, bfd_section, name, address,
|
||||||
|
endaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the innermost stack frame executing inside of BLOCK,
|
/* Return the innermost stack frame executing inside of BLOCK,
|
||||||
|
|
|
@ -355,7 +355,7 @@ lookup_minimal_symbol_solib_trampoline (const char *name,
|
||||||
|
|
||||||
/* Search through the minimal symbol table for each objfile and find
|
/* Search through the minimal symbol table for each objfile and find
|
||||||
the symbol whose address is the largest address that is still less
|
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
|
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
|
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
|
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
|
ALL the minimal symbol tables before deciding on the symbol that
|
||||||
|
@ -374,20 +374,23 @@ lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, asection *section)
|
||||||
struct minimal_symbol *best_symbol = NULL;
|
struct minimal_symbol *best_symbol = NULL;
|
||||||
struct obj_section *pc_section;
|
struct obj_section *pc_section;
|
||||||
|
|
||||||
/* pc has to be in a known section. This ensures that anything beyond
|
/* PC has to be in a known section. This ensures that anything
|
||||||
the end of the last segment doesn't appear to be part of the last
|
beyond the end of the last segment doesn't appear to be part of
|
||||||
function in the last segment. */
|
the last function in the last segment. */
|
||||||
pc_section = find_pc_section (pc);
|
pc_section = find_pc_section (pc);
|
||||||
if (pc_section == NULL)
|
if (pc_section == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* If no section was specified, then just make sure that the PC is in
|
/* NOTE: cagney/2004-01-27: Removed code (added 2003-07-19) that was
|
||||||
the same section as the minimal symbol we find. */
|
trying to force the PC into a valid section as returned by
|
||||||
if (section == NULL)
|
find_pc_section. It broke IRIX 6.5 mdebug which relies on this
|
||||||
section = pc_section->the_bfd_section;
|
code returning an absolute symbol - the problem was that
|
||||||
|
find_pc_section wasn't returning an absolute section and hence
|
||||||
/* FIXME drow/2003-07-19: Should we also check that PC is in SECTION
|
the code below would skip over absolute symbols. Since the
|
||||||
if we were passed a non-NULL SECTION argument? */
|
original problem was with finding a frame's function, and that
|
||||||
|
uses [indirectly] lookup_minimal_symbol_by_pc, the original
|
||||||
|
problem has been fixed by having that function use
|
||||||
|
find_pc_section. */
|
||||||
|
|
||||||
for (objfile = object_files;
|
for (objfile = object_files;
|
||||||
objfile != NULL;
|
objfile != NULL;
|
||||||
|
@ -497,7 +500,13 @@ lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, asection *section)
|
||||||
struct minimal_symbol *
|
struct minimal_symbol *
|
||||||
lookup_minimal_symbol_by_pc (CORE_ADDR pc)
|
lookup_minimal_symbol_by_pc (CORE_ADDR pc)
|
||||||
{
|
{
|
||||||
return lookup_minimal_symbol_by_pc_section (pc, find_pc_mapped_section (pc));
|
/* NOTE: cagney/2004-01-27: This was using find_pc_mapped_section to
|
||||||
|
force the section but that (well unless you're doing overlay
|
||||||
|
debugging) always returns NULL making the call somewhat useless. */
|
||||||
|
struct obj_section *section = find_pc_section (pc);
|
||||||
|
if (section == NULL)
|
||||||
|
return NULL;
|
||||||
|
return lookup_minimal_symbol_by_pc_section (pc, section->the_bfd_section);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue