* cpu-powerpc.c: Comment on ordering of arch_info.
authorAlan Modra <amodra@gmail.com>
Thu, 27 Jun 2002 11:29:15 +0000 (11:29 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 27 Jun 2002 11:29:15 +0000 (11:29 +0000)
* elf32-ppc.c (ppc_elf_object_p): New function.
(elf_backend_object_p): Define.
* elf64-ppc.c (ppc64_elf_object_p): New function.
(elf_backend_object_p): Define.

bfd/ChangeLog
bfd/cpu-powerpc.c
bfd/elf32-ppc.c
bfd/elf64-ppc.c

index cad3c9d30d1ebd05d0a53d7799ac329d316983b9..ff06e421fa89072ed524048d000362fa2de5781c 100644 (file)
@@ -1,3 +1,11 @@
+2002-06-27  Alan Modra  <amodra@bigpond.net.au>
+
+       * cpu-powerpc.c: Comment on ordering of arch_info.
+       * elf32-ppc.c (ppc_elf_object_p): New function.
+       (elf_backend_object_p): Define.
+       * elf64-ppc.c (ppc64_elf_object_p): New function.
+       (elf_backend_object_p): Define.
+
 2002-06-26  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * configure.in (vax-*-netbsd*): Set COREFILE to netbsd-core.lo.
index d77b4260c1da151be8169013ac852816f2e90dca..55236697d716c79aa4d9273359125f2b5f7a8d32 100644 (file)
@@ -50,7 +50,8 @@ powerpc_compatible (a,b)
 
 const bfd_arch_info_type bfd_powerpc_archs[] =
 {
-#if BFD_DEFAULT_TARGET_SIZE == 64 /* default arch must come first.  */
+#if BFD_DEFAULT_TARGET_SIZE == 64
+  /* Default arch must come first.  */
   {
     64,        /* 64 bits in a word */
     64,        /* 64 bits in an address */
@@ -65,6 +66,8 @@ const bfd_arch_info_type bfd_powerpc_archs[] =
     bfd_default_scan,
     &bfd_powerpc_archs[1]
   },
+  /* elf32-ppc:ppc_elf_object_p relies on the default 32 bit arch
+     being immediately after the 64 bit default.  */
   {
     32,        /* 32 bits in a word */
     32,        /* 32 bits in an address */
@@ -80,6 +83,7 @@ const bfd_arch_info_type bfd_powerpc_archs[] =
     &bfd_powerpc_archs[2],
   },
 #else
+  /* Default arch must come first.  */
   {
     32,        /* 32 bits in a word */
     32,        /* 32 bits in an address */
@@ -94,6 +98,8 @@ const bfd_arch_info_type bfd_powerpc_archs[] =
     bfd_default_scan,
     &bfd_powerpc_archs[1],
   },
+  /* elf64-ppc:ppc64_elf_object_p relies on the default 64 bit arch
+     being immediately after the 32 bit default.  */
   {
     64,        /* 64 bits in a word */
     64,        /* 64 bits in an address */
index a5bc0e4d44a46ddbd5902c73431a45f1e5f0d868..984a48695f3b7a8bb3f6e16c8e4161b5c4ac6cf3 100644 (file)
@@ -43,6 +43,7 @@ static boolean ppc_elf_relax_section
   PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
 static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
+static boolean ppc_elf_object_p PARAMS ((bfd *));
 static boolean ppc_elf_set_private_flags PARAMS ((bfd *, flagword));
 static boolean ppc_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));
 
@@ -1380,6 +1381,27 @@ ppc_elf_addr16_ha_reloc (abfd, reloc_entry, symbol, data, input_section,
   return bfd_reloc_continue;
 }
 
+/* Fix bad default arch selected for a 32 bit input bfd when the
+   default is 64 bit.  */
+
+static boolean
+ppc_elf_object_p (abfd)
+     bfd *abfd;
+{
+  if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
+    {
+      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
+
+      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
+       {
+         /* Relies on arch after 64 bit default being 32 bit default.  */
+         abfd->arch_info = abfd->arch_info->next;
+         BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
+       }
+    }
+  return true;
+}
+
 /* Function to set whether a module needs the -mrelocatable bit set.  */
 
 static boolean
@@ -3797,6 +3819,7 @@ ppc_elf_grok_psinfo (abfd, note)
 #define bfd_elf32_bfd_set_private_flags                ppc_elf_set_private_flags
 #define bfd_elf32_bfd_final_link               _bfd_elf32_gc_common_final_link
 
+#define elf_backend_object_p                   ppc_elf_object_p
 #define elf_backend_gc_mark_hook               ppc_elf_gc_mark_hook
 #define elf_backend_gc_sweep_hook              ppc_elf_gc_sweep_hook
 #define elf_backend_section_from_shdr          ppc_elf_section_from_shdr
index 9d798efc083229baaf377e868f0b1f9b3805bb98..ac52ae1375fbaf6f3f8817303bb0eda8a88e67e3 100644 (file)
@@ -57,6 +57,8 @@ static bfd_reloc_status_type ppc64_elf_unhandled_reloc
   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
 static void ppc64_elf_get_symbol_info
   PARAMS ((bfd *, asymbol *, symbol_info *));
+static boolean ppc64_elf_object_p
+  PARAMS ((bfd *));
 static boolean ppc64_elf_set_private_flags
   PARAMS ((bfd *, flagword));
 static boolean ppc64_elf_merge_private_bfd_data
@@ -1649,6 +1651,27 @@ ppc64_elf_get_symbol_info (abfd, symbol, ret)
     ret->type = (symbol->flags & BSF_GLOBAL) != 0 ? 'D' : 'd';
 }
 
+/* Fix bad default arch selected for a 64 bit input bfd when the
+   default is 32 bit.  */
+
+static boolean
+ppc64_elf_object_p (abfd)
+     bfd *abfd;
+{
+  if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
+    {
+      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
+
+      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
+       {
+         /* Relies on arch after 32 bit default being 64 bit default.  */
+         abfd->arch_info = abfd->arch_info->next;
+         BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
+       }
+    }
+  return true;
+}
+
 /* Function to set whether a module needs the -mrelocatable bit set.  */
 
 static boolean
@@ -6140,6 +6163,7 @@ ppc64_elf_finish_dynamic_sections (output_bfd, info)
 #define bfd_elf64_bfd_link_hash_table_free    ppc64_elf_link_hash_table_free
 #define bfd_elf64_get_symbol_info            ppc64_elf_get_symbol_info
 
+#define elf_backend_object_p                 ppc64_elf_object_p
 #define elf_backend_section_from_shdr        ppc64_elf_section_from_shdr
 #define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
 #define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol