* rs6000-aix-tdep.c (rs6000_convert_from_func_ptr_addr): Do not
authorJoel Brobecker <brobecker@gnat.com>
Mon, 2 Jun 2008 03:12:33 +0000 (03:12 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Mon, 2 Jun 2008 03:12:33 +0000 (03:12 +0000)
        treat pointers in data space as function descriptors if the
        target address is also in the data space.

gdb/ChangeLog
gdb/rs6000-aix-tdep.c

index 55ac929cff1e702d37642b1a7ff1b81db4ef3375..7061b8da789d179da5a82b96277ae693e75ce690 100644 (file)
@@ -1,3 +1,9 @@
+2008-06-01  Joel Brobecker  <brobecker@adacore.com>
+
+       * rs6000-aix-tdep.c (rs6000_convert_from_func_ptr_addr): Do not
+       treat pointers in data space as function descriptors if the
+       target address is also in the data space.
+
 2008-05-30  Joel Brobecker  <brobecker@adacore.com>
 
        * alpha-tdep.c (alpha_heuristic_frame_unwind_cache): Set
index 43a3a0a1bb333a555c08f7a0bdb7eacb74c6a822..6edea05666bac5c958818e61243dd29fc8d0fd16 100644 (file)
@@ -570,11 +570,22 @@ rs6000_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
   struct obj_section *s;
 
   s = find_pc_section (addr);
-  if (s && s->the_bfd_section->flags & SEC_CODE)
-    return addr;
 
-  /* ADDR is in the data space, so it's a special function pointer. */
-  return read_memory_unsigned_integer (addr, gdbarch_tdep (gdbarch)->wordsize);
+  /* 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)
+    {
+      CORE_ADDR pc =
+        read_memory_unsigned_integer (addr, gdbarch_tdep (gdbarch)->wordsize);
+      struct obj_section *pc_section = find_pc_section (pc);
+
+      if (pc_section && (pc_section->the_bfd_section->flags & SEC_CODE))
+        return pc;
+    }
+
+  return addr;
 }
 
 
This page took 0.075365 seconds and 4 git commands to generate.