bfd/
authorAlan Modra <amodra@gmail.com>
Sat, 19 May 2012 06:58:48 +0000 (06:58 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 19 May 2012 06:58:48 +0000 (06:58 +0000)
* 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
bfd/elf32-ppc.c
bfd/elf32-ppc.h
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/powerpc.exp
ld/testsuite/ld-powerpc/vle.ld [new file with mode: 0644]
opcodes/ChangeLog
opcodes/ppc-dis.c

index dbe96fe..aee1dbc 100644 (file)
@@ -1,3 +1,11 @@
+2012-05-19  Alan Modra  <amodra@gmail.com>
+
+       * 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  <hongjiu.lu@intel.com>
 
        * elf32-i386.c (elf_i386_finish_dynamic_symbol): Don't make
index 63d77d2..fabd065 100644 (file)
@@ -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"
index 9d1016c..0bf973c 100644 (file)
@@ -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);
index 3c2ad42..d27e642 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-19  Alan Modra  <amodra@gmail.com>
+
+       * ld-powerpc/vle.ld: New.
+       * ld-powerpc/powerpc.exp (vle reloc tests): Link using vle.ld.
+
 2012-05-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-i386/tlsdesc-nacl.rd: Update for dynamic sym changes.
index 8b7e7fd..8f08991 100644 (file)
@@ -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 (file)
index 0000000..01b6598
--- /dev/null
@@ -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/ : { *(*) }
+}
index 0be7941..b108430 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-19  Alan Modra  <amodra@gmail.com>
+
+       * 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  <amodra@gmail.com>
 
        * ia64-opc.c: Remove #include "ansidecl.h".
index bbf3978..0905744 100644 (file)
@@ -24,7 +24,7 @@
 #include <stdio.h>
 #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;