From fcac911af1c9b3f79e93e0317d594dc99794c39a Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Thu, 29 May 2008 00:19:33 +0000 Subject: [PATCH] * ia64-tdep.c (ia64_convert_from_func_ptr_addr): Improve the heuristic that identifies function descriptors outside of the .opd section. --- gdb/ChangeLog | 5 +++++ gdb/ia64-tdep.c | 15 +++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b32c75e3ac..39bef3c7ba 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-05-28 Joel Brobecker + + * 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 * breakpoint.c (print_exception_catchpoint): In CLI add 'Temporary' for diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index ec0d14ebba..32e0f69928 100644 --- a/gdb/ia64-tdep.c +++ b/gdb/ia64-tdep.c @@ -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) -- 2.34.1