Re: [PATCH 1/2] MIPS: Compressed PLT/stubs support

Alan Modra
2013-02-22T06:06:55Z

On Fri, Feb 22, 2013 at 11:28:33AM +1030, Alan Modra wrote:
> Hmm, perhaps a cleaner change would be implement make_msymbol_special
> for ppc64 and move the udata.p special case out of elf_symtab_read?

Like so.

* 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.

Index: gdb/elfread.c
===================================================================
RCS file: /cvs/src/src/gdb/elfread.c,v
retrieving revision 1.145
diff -u -p -r1.145 elfread.c
--- gdb/elfread.c 21 Feb 2013 04:35:21 -0000 1.145
+++ gdb/elfread.c 22 Feb 2013 05:42:53 -0000
@@ -556,21 +556,14 @@ elf_symtab_read (struct objfile *objfile

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: gdb/ppc-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ppc-linux-tdep.c,v
retrieving revision 1.143
diff -u -p -r1.143 ppc-linux-tdep.c
--- gdb/ppc-linux-tdep.c 4 Feb 2013 18:40:41 -0000 1.143
+++ gdb/ppc-linux-tdep.c 22 Feb 2013 05:42:53 -0000
@@ -1336,6 +1336,9 @@ ppc_linux_init_abi (struct gdbarch_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: gdb/ppc64-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ppc64-tdep.c,v
retrieving revision 1.1
diff -u -p -r1.1 ppc64-tdep.c
--- gdb/ppc64-tdep.c 1 Feb 2013 20:59:08 -0000 1.1
+++ gdb/ppc64-tdep.c 22 Feb 2013 05:42:53 -0000
@@ -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

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: gdb/ppc64-tdep.h
===================================================================
RCS file: /cvs/src/src/gdb/ppc64-tdep.h,v
retrieving revision 1.1
diff -u -p -r1.1 ppc64-tdep.h
--- gdb/ppc64-tdep.h 1 Feb 2013 20:59:08 -0000 1.1
+++ gdb/ppc64-tdep.h 22 Feb 2013 05:42:53 -0000
@@ -31,4 +31,6 @@ extern CORE_ADDR ppc64_convert_from_func
CORE_ADDR addr,
struct target_ops *targ);

+extern void ppc64_elf_make_msymbol_special (asymbol *,
+ struct minimal_symbol *);
#endif /* PPC64_TDEP_H */
Index: gdb/ppcfbsd-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ppcfbsd-tdep.c,v
retrieving revision 1.1
diff -u -p -r1.1 ppcfbsd-tdep.c
--- gdb/ppcfbsd-tdep.c 4 Feb 2013 20:48:53 -0000 1.1
+++ gdb/ppcfbsd-tdep.c 22 Feb 2013 05:42:53 -0000
@@ -325,6 +325,9 @@ ppcfbsd_init_abi (struct gdbarch_info in
{
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);

--
Alan Modra
Australia Development Lab, IBM