* elfread.c (elf_symtab_read): Do not use udata.p here to find
authorAlan Modra <amodra@gmail.com>
Fri, 22 Feb 2013 23:24:24 +0000 (23:24 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 22 Feb 2013 23:24:24 +0000 (23:24 +0000)
symbol size.
* ppc64-tdep.c (ppc64_elf_make_msymbol_special): New function.
* ppc64-tdep.h (ppc64_elf_make_msymbol_special): Declare.
* ppc-linux-tdep.c (ppc_linux_init_abi): Set up to use the above.
* ppcfbsd-tdep.c (ppcfbsd_init_abi): Likewise.

gdb/ChangeLog
gdb/elfread.c
gdb/ppc-linux-tdep.c
gdb/ppc64-tdep.c
gdb/ppc64-tdep.h
gdb/ppcfbsd-tdep.c

index d853da0327351bc1ffefbf64d1804f129d608e72..322762f267f3ae62f449d9435f31dded38a585c8 100644 (file)
@@ -1,3 +1,12 @@
+2013-02-23  Alan Modra  <amodra@gmail.com>
+
+       * elfread.c (elf_symtab_read): Do not use udata.p here to find
+       symbol size.
+       * ppc64-tdep.c (ppc64_elf_make_msymbol_special): New function.
+       * ppc64-tdep.h (ppc64_elf_make_msymbol_special): Declare.
+       * ppc-linux-tdep.c (ppc_linux_init_abi): Set up to use the above.
+       * ppcfbsd-tdep.c (ppcfbsd_init_abi): Likewise.
+
 2013-02-22  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Code cleanup.
index 4b9562715cbaf6547fd8f00b228752da08a28a29..43c32b2c63ee1b87d7bbf07f1f45d99af19c6511 100644 (file)
@@ -556,21 +556,14 @@ elf_symtab_read (struct objfile *objfile, int type,
 
          if (msym)
            {
-             /* Pass symbol size field in via BFD.  FIXME!!!  */
-             elf_symbol_type *elf_sym;
-
              /* NOTE: uweigand-20071112: A synthetic symbol does not have an
-                ELF-private part.  However, in some cases (e.g. synthetic
-                'dot' symbols on ppc64) the udata.p entry is set to point back
-                to the original ELF symbol it was derived from.  Get the size
-                from that symbol.  */
+                ELF-private part.  */
              if (type != ST_SYNTHETIC)
-               elf_sym = (elf_symbol_type *) sym;
-             else
-               elf_sym = (elf_symbol_type *) sym->udata.p;
-
-             if (elf_sym)
-               SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size);
+               {
+                 /* Pass symbol size field in via BFD.  FIXME!!!  */
+                 elf_symbol_type *elf_sym = (elf_symbol_type *) sym;
+                 SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size);
+               }
 
              msym->filename = filesymname;
              gdbarch_elf_make_msymbol_special (gdbarch, sym, msym);
index 7c2712d9a7800611ca3de8cd32b24d28b2334e81..0fc6fe03b9c891657a78cfd2d52fd0223ebfd406 100644 (file)
@@ -1336,6 +1336,9 @@ ppc_linux_init_abi (struct gdbarch_info info,
       set_gdbarch_convert_from_func_ptr_addr
        (gdbarch, ppc64_convert_from_func_ptr_addr);
 
+      set_gdbarch_elf_make_msymbol_special (gdbarch,
+                                           ppc64_elf_make_msymbol_special);
+
       /* Shared library handling.  */
       set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code);
       set_solib_svr4_fetch_link_map_offsets
index 9c3616a1a27958e35619f5600f7ddef7da577ca2..f636b4d450bba6261d65f1e0cd14caa0324cf5ac 100644 (file)
@@ -22,6 +22,7 @@
 #include "gdbcore.h"
 #include "ppc-tdep.h"
 #include "ppc64-tdep.h"
+#include "elf-bfd.h"
 
 /* Macros for matching instructions.  Note that, since all the
    operands are masked off before they're or-ed into the instruction,
@@ -361,3 +362,17 @@ ppc64_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
 
   return addr;
 }
+
+/* A synthetic 'dot' symbols on ppc64 has the udata.p entry pointing
+   back to the original ELF symbol it was derived from.  Get the size
+   from that symbol.  */
+
+void
+ppc64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
+{
+  if ((sym->flags & BSF_SYNTHETIC) != 0 && sym->udata.p != NULL)
+    {
+      elf_symbol_type *elf_sym = (elf_symbol_type *) sym->udata.p;
+      SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size);
+    }
+}
index c4c9d99455ae06d0eaff7f8acc4076c7108e3e95..62900bab5eecfb32d95a4455bc67b6f629309277 100644 (file)
@@ -31,4 +31,6 @@ extern CORE_ADDR ppc64_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
                                                   CORE_ADDR addr,
                                                   struct target_ops *targ);
 
+extern void ppc64_elf_make_msymbol_special (asymbol *,
+                                           struct minimal_symbol *);
 #endif /* PPC64_TDEP_H  */
index f18ed4fa7576543dc7093b1dbf70b36f3d4a58dd..f9e04341534ee599637ba57e45769ba7fa329f56 100644 (file)
@@ -325,6 +325,9 @@ ppcfbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
     {
       set_gdbarch_convert_from_func_ptr_addr
        (gdbarch, ppc64_convert_from_func_ptr_addr);
+      set_gdbarch_elf_make_msymbol_special (gdbarch,
+                                           ppc64_elf_make_msymbol_special);
+
       set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code);
       set_solib_svr4_fetch_link_map_offsets (gdbarch,
                                             svr4_lp64_fetch_link_map_offsets);