2003-10-03 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 3 Oct 2003 20:50:56 +0000 (20:50 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 3 Oct 2003 20:50:56 +0000 (20:50 +0000)
* ppc-linux-tdep.c (ppc64_linux_convert_from_func_ptr_addr): Only
convert a descriptor to a function when it's in the ".opd"
section.

gdb/ChangeLog
gdb/ppc-linux-tdep.c

index 7dfa1b10ceefe4768dd2b3ddccdf6337f4cc4a55..54940eafe840ecaff8fed234fc21a65646b81d13 100644 (file)
@@ -1,3 +1,9 @@
+2003-10-03  Andrew Cagney  <cagney@redhat.com>
+
+       * ppc-linux-tdep.c (ppc64_linux_convert_from_func_ptr_addr): Only
+       convert a descriptor to a function when it's in the ".opd"
+       section.
+
 2003-10-03  Corinna Vinschen  <vinschen@redhat.com>
 
        * sh-tdep.c (sh_push_dummy_call_fpu): Initialize flt_argreg and
index 27744f3e12f1156412e0e60aa7d21415b3aa5603..4a6bf6df83553fab892ad2ea3656b6709ded05a1 100644 (file)
@@ -925,8 +925,10 @@ ppc64_skip_trampoline_code (CORE_ADDR pc)
    find_function_addr uses this function to get the function address
    from a function pointer.  */
 
-/* Return real function address if ADDR (a function pointer) is in the data
-   space and is therefore a special function pointer.  */
+/* If ADDR points at what is clearly a function descriptor, transform
+   it into the address of the corresponding function.  Be
+   conservative, otherwize GDB will do the transformation on any
+   random addresses such as occures when there is no symbol table.  */
 
 static CORE_ADDR
 ppc64_linux_convert_from_func_ptr_addr (CORE_ADDR addr)
@@ -934,12 +936,12 @@ ppc64_linux_convert_from_func_ptr_addr (CORE_ADDR addr)
   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 pointer to a descriptor, not
-     the entry point.  */
-  return ppc64_desc_entry_point (addr);
+  /* Check if ADDR points to a function descriptor.  */
+  if (s && strcmp (s->the_bfd_section->name, ".opd") == 0)
+    return read_memory_unsigned_integer (addr, 8);
+
+  return addr;
 }