* ia64-tdep.c (ia64_convert_from_func_ptr_addr): Treat addresses
authorJoel Brobecker <brobecker@gnat.com>
Tue, 6 May 2008 20:03:03 +0000 (20:03 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 6 May 2008 20:03:03 +0000 (20:03 +0000)
        pointing inside a non-executable section as function descriptors.

gdb/ChangeLog
gdb/ia64-tdep.c

index 7eb3b7bd68cf5c1b4e7a4d185a10adfe12e537ad..4e3cf01b06939120fde0dfa95b10b4e738a2f8ea 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-06  Joel Brobecker  <brobecker@adacore.com>
+
+       * ia64-tdep.c (ia64_convert_from_func_ptr_addr): Treat addresses
+       pointing inside a non-executable section as function descriptors.
+
 2008-05-06  Pedro Alves  <pedro@codesourcery.com>
 
        * inf-loop.c (inferior_event_handler): Run all continuations and
index 499213a8cb30e27b19ce2915aa61c61613822f5d..ec0d14ebbae05f3bc0bbb8a2d948b317f0a0eb90 100644 (file)
@@ -3229,6 +3229,12 @@ 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.  */
+  if (s && (s->the_bfd_section->flags & SEC_CODE) == 0)
+    return read_memory_unsigned_integer (addr, 8);
+
   /* There are also descriptors embedded in vtables.  */
   if (s)
     {