From 94caa966375d53b07f39beac80f1f9af4cac18da Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 19 May 2012 06:58:48 +0000 Subject: [PATCH] bfd/ * elf32-ppc.h (has_vle_insns, is_ppc_vle): Delete. (has_tls_reloc, has_tls_get_addr_call): Move back to.. * elf32-ppc.c: ..here. (ppc_elf_section_flags, elf_backend_section_flags): Delete. (ppc_elf_modify_segment_map): Use ELF sh_flags to detect VLE sections. opcodes/ * ppc-dis.c: Don't include elf32-ppc.h, do include elf/ppc.h. (get_powerpc_dialect): Detect VLE sections from ELF sh_flags. ld/testsuite/ * ld-powerpc/vle.ld: New. * ld-powerpc/powerpc.exp (vle reloc tests): Link using vle.ld. --- bfd/ChangeLog | 8 ++++++++ bfd/elf32-ppc.c | 27 +++++++++++++-------------- bfd/elf32-ppc.h | 20 -------------------- ld/testsuite/ChangeLog | 5 +++++ ld/testsuite/ld-powerpc/powerpc.exp | 8 ++++---- ld/testsuite/ld-powerpc/vle.ld | 11 +++++++++++ opcodes/ChangeLog | 5 +++++ opcodes/ppc-dis.c | 7 +++++-- 8 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 ld/testsuite/ld-powerpc/vle.ld diff --git a/bfd/ChangeLog b/bfd/ChangeLog index dbe96fe3f5..aee1dbc783 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2012-05-19 Alan Modra + + * elf32-ppc.h (has_vle_insns, is_ppc_vle): Delete. + (has_tls_reloc, has_tls_get_addr_call): Move back to.. + * elf32-ppc.c: ..here. + (ppc_elf_section_flags, elf_backend_section_flags): Delete. + (ppc_elf_modify_segment_map): Use ELF sh_flags to detect VLE sections. + 2012-05-18 H.J. Lu * elf32-i386.c (elf_i386_finish_dynamic_symbol): Don't make diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 63d77d26a5..fabd06530b 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -2246,15 +2246,6 @@ ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...) } } -static bfd_boolean -ppc_elf_section_flags (flagword *flags ATTRIBUTE_UNUSED, - const Elf_Internal_Shdr *hdr) -{ - if (hdr->sh_flags & SHF_PPC_VLE) - hdr->bfd_section->has_vle_insns = 1; - return TRUE; -} - static flagword ppc_elf_lookup_section_flags (char *flag_name) { @@ -2372,17 +2363,17 @@ ppc_elf_modify_segment_map (bfd *abfd, if (m->count == 0) continue; - sect0_vle = is_ppc_vle (m->sections[0]); + sect0_vle = (elf_section_flags (m->sections[0]) & SHF_PPC_VLE) != 0; for (j = 1; j < m->count; ++j) { - if (is_ppc_vle (m->sections[j]) != sect0_vle) + sectj_vle = (elf_section_flags (m->sections[j]) & SHF_PPC_VLE) != 0; + + if (sectj_vle != sect0_vle) break; } if (j >= m->count) continue; - sectj_vle = is_ppc_vle (m->sections[j]); - /* sections 0..j-1 stay in this (current) segment, the remainder are put in a new segment. The scan resumes with the new segment. */ @@ -3120,6 +3111,15 @@ struct ppc_elf_link_hash_table struct sym_cache sym_cache; }; +/* Rename some of the generic section flags to better document how they + are used for ppc32. The flags are only valid for ppc32 elf objects. */ + +/* Nonzero if this section has TLS related relocations. */ +#define has_tls_reloc sec_flg0 + +/* Nonzero if this section has a call to __tls_get_addr. */ +#define has_tls_get_addr_call sec_flg1 + /* Get the PPC ELF linker hash table from a link_info structure. */ #define ppc_elf_hash_table(p) \ @@ -9710,7 +9710,6 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, #define elf_backend_init_index_section _bfd_elf_init_1_index_section #define elf_backend_post_process_headers _bfd_elf_set_osabi #define elf_backend_lookup_section_flags_hook ppc_elf_lookup_section_flags -#define elf_backend_section_flags ppc_elf_section_flags #define elf_backend_section_processing ppc_elf_section_processing #include "elf32-target.h" diff --git a/bfd/elf32-ppc.h b/bfd/elf32-ppc.h index 9d1016c5d2..0bf973c997 100644 --- a/bfd/elf32-ppc.h +++ b/bfd/elf32-ppc.h @@ -26,26 +26,6 @@ enum ppc_elf_plt_type PLT_VXWORKS }; -/* Rename some of the generic section flags to better document how they - are used for ppc32. These macros should be private to elf32-ppc.c, - but opcodes/ppc-dis.c needs is_ppc_vle. The flags are only valid - for ppc32 elf objects. */ - -/* Nonzero if this section has TLS related relocations. */ -#define has_tls_reloc sec_flg0 - -/* Nonzero if this section has a call to __tls_get_addr. */ -#define has_tls_get_addr_call sec_flg1 - -/* Nonzero if this section has the VLE bit set. */ -#define has_vle_insns sec_flg2 - -#define is_ppc_vle(SEC) \ - ((SEC)->owner != NULL \ - && bfd_get_flavour ((SEC)->owner) == bfd_target_elf_flavour \ - && elf_object_id ((SEC)->owner) == PPC32_ELF_DATA \ - && (SEC)->has_vle_insns) - int ppc_elf_select_plt_layout (bfd *, struct bfd_link_info *, enum ppc_elf_plt_type, int); asection *ppc_elf_tls_setup (bfd *, struct bfd_link_info *, int); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3c2ad4253e..d27e642fd9 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-19 Alan Modra + + * ld-powerpc/vle.ld: New. + * ld-powerpc/powerpc.exp (vle reloc tests): Link using vle.ld. + 2012-05-18 H.J. Lu * ld-i386/tlsdesc-nacl.rd: Update for dynamic sym changes. diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp index 8b7e7fd0a1..8f08991385 100644 --- a/ld/testsuite/ld-powerpc/powerpc.exp +++ b/ld/testsuite/ld-powerpc/powerpc.exp @@ -1,5 +1,5 @@ # Expect script for ld-powerpc tests -# Copyright 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +# Copyright 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 # Free Software Foundation # # This file is part of the GNU Binutils. @@ -231,13 +231,13 @@ set ppceabitests { {"VLE multiple segments 5" "-T vle-multiseg-5.ld" "-mregnames -mvle" {vle-multiseg.s} {{readelf "-l" vle-multiseg-5.d}} "vle-multiseg-5"} - {"VLE relocations 1" "" + {"VLE relocations 1" "-T vle.ld" "-mvle" {vle-reloc-1.s vle-reloc-def-1.s} {{objdump "-Mvle -d" vle-reloc-1.d}} "vle-reloc-1"} - {"VLE relocations 2" "" + {"VLE relocations 2" "-T vle.ld" "-mvle" {vle-reloc-2.s vle-reloc-def-2.s} {{objdump "-Mvle -d" vle-reloc-2.d}} "vle-reloc-2"} - {"VLE relocations 3" "" + {"VLE relocations 3" "-T vle.ld" "-mvle" {vle-reloc-3.s vle-reloc-def-3.s} {{objdump "-Mvle -d" vle-reloc-3.d}} "vle-reloc-3"} } diff --git a/ld/testsuite/ld-powerpc/vle.ld b/ld/testsuite/ld-powerpc/vle.ld new file mode 100644 index 0000000000..01b659857b --- /dev/null +++ b/ld/testsuite/ld-powerpc/vle.ld @@ -0,0 +1,11 @@ +SECTIONS +{ + . = 0x01800000 + SIZEOF_HEADERS; + .text : { *(.text) } + .PPC.EMB.sdata0 : { *(.PPC.EMB.sdata0) } + .sdata2 : { PROVIDE (_SDA2_BASE_ = 32768); *(.sdata2) } + . = ALIGN (0x10000) + (. & (0x10000 - 1)); + .data : { *(.data) } + .sdata : { PROVIDE (_SDA_BASE_ = 32768); *(.sdata) } + /DISCARD/ : { *(*) } +} diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 0be79416a9..b1084300f2 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2012-05-19 Alan Modra + + * ppc-dis.c: Don't include elf32-ppc.h, do include elf/ppc.h. + (get_powerpc_dialect): Detect VLE sections from ELF sh_flags. + 2012-05-18 Alan Modra * ia64-opc.c: Remove #include "ansidecl.h". diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index bbf3978298..090574451c 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -24,7 +24,7 @@ #include #include "dis-asm.h" #include "elf-bfd.h" -#include "elf32-ppc.h" +#include "elf/ppc.h" #include "opintl.h" #include "opcode/ppc.h" @@ -199,7 +199,10 @@ get_powerpc_dialect (struct disassemble_info *info) /* Disassemble according to the section headers flags for VLE-mode. */ if (dialect & PPC_OPCODE_VLE - && is_ppc_vle (info->section)) + && info->section->owner != NULL + && bfd_get_flavour (info->section->owner) == bfd_target_elf_flavour + && elf_object_id (info->section->owner) == PPC32_ELF_DATA + && (elf_section_flags (info->section) & SHF_PPC_VLE) != 0) return dialect; else return dialect & ~ PPC_OPCODE_VLE;