+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
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;
}