summaryrefslogtreecommitdiff
path: root/gdb/ia64-tdep.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2008-05-29 00:19:33 +0000
committerJoel Brobecker <brobecker@gnat.com>2008-05-29 00:19:33 +0000
commit4e236720eb086ab3d081d85c03cbff11c60d95e9 (patch)
tree3e23d5d14d1158ee5030145c7969f8b05fc5072f /gdb/ia64-tdep.c
parent4ad62c594d766eeb8884a214e791a0f9993e8048 (diff)
downloadgdb-4e236720eb086ab3d081d85c03cbff11c60d95e9.tar.gz
* ia64-tdep.c (ia64_convert_from_func_ptr_addr): Improve the heuristic
that identifies function descriptors outside of the .opd section.
Diffstat (limited to 'gdb/ia64-tdep.c')
-rw-r--r--gdb/ia64-tdep.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index ec0d14ebbae..32e0f699284 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)