* ia64-tdep.c (ia64_convert_from_func_ptr_addr): Improve the heuristic

that identifies function descriptors outside of the .opd section.
This commit is contained in:
Joel Brobecker 2008-05-29 00:19:33 +00:00
parent 1aafe37a59
commit fcac911af1
2 changed files with 16 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2008-05-28 Joel Brobecker <brobecker@adacore.com>
* ia64-tdep.c (ia64_convert_from_func_ptr_addr): Improve the heuristic
that identifies function descriptors outside of the .opd section.
2008-05-28 Aleksandar Ristovski <aristovski@qnx.com>
* breakpoint.c (print_exception_catchpoint): In CLI add 'Temporary' for

View file

@ -3229,11 +3229,18 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
if (s && strcmp (s->the_bfd_section->name, ".opd") == 0)
return read_memory_unsigned_integer (addr, 8);
/* If ADDR points to a section that is not executable, then it cannot
be pointing to a function. So it must be pointing to a function
descriptor. */
/* Normally, functions live inside a section that is executable.
So, if ADDR points to a non-executable section, then treat it
as a function descriptor and return the target address iff
the target address itself points to a section that is executable. */
if (s && (s->the_bfd_section->flags & SEC_CODE) == 0)
return read_memory_unsigned_integer (addr, 8);
{
CORE_ADDR pc = read_memory_unsigned_integer (addr, 8);
struct obj_section *pc_section = find_pc_section (pc);
if (pc_section && (pc_section->the_bfd_section->flags & SEC_CODE))
return pc;
}
/* There are also descriptors embedded in vtables. */
if (s)