* elf64-aarch64.c (elf_backend_can_gc_sections): Enable
authorNick Clifton <nickc@redhat.com>
Fri, 8 Mar 2013 17:37:30 +0000 (17:37 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 8 Mar 2013 17:37:30 +0000 (17:37 +0000)
gc-section support.
        (elf64_aarch64_gc_sweep_hook): Handle GOT, TLS and PLT related relocs.

        * lib/ld-lib.exp (check_gc_sections_available): Remove aarch64
from list of
        targets that don't support gc-section.

bfd/ChangeLog
bfd/elf64-aarch64.c
ld/testsuite/ChangeLog
ld/testsuite/lib/ld-lib.exp

index d4b07a9840928da194437bf04adddb3bef7ee987..42d6c27dfa74857be1a1af20e5488bb9681aea51 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-08  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
+
+        * elf64-aarch64.c (elf_backend_can_gc_sections): Enable gc-section
+       support.
+        (elf64_aarch64_gc_sweep_hook): Handle GOT, TLS and PLT related
+       relocs.
+
 2013-03-08  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        * elf-bfd.h (elfcore_write_s390_tdb): Add prototype.
 2013-03-08  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        * elf-bfd.h (elfcore_write_s390_tdb): Add prototype.
index 61909b92225d13ebb612495543acec102e7358f1..94d90c5e4ce7aa021deabac88eea1287242f18b7 100644 (file)
@@ -1,5 +1,5 @@
 /* ELF support for AArch64.
 /* ELF support for AArch64.
-   Copyright 2009, 2010, 2011, 2012  Free Software Foundation, Inc.
+   Copyright 2009-2013 Free Software Foundation, Inc.
    Contributed by ARM Ltd.
 
    This file is part of BFD, the Binary File Descriptor library.
    Contributed by ARM Ltd.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -4875,6 +4875,137 @@ elf64_aarch64_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
                             const Elf_Internal_Rela *
                             relocs ATTRIBUTE_UNUSED)
 {
                             const Elf_Internal_Rela *
                             relocs ATTRIBUTE_UNUSED)
 {
+  struct elf64_aarch64_link_hash_table *htab;
+  Elf_Internal_Shdr *symtab_hdr;
+  struct elf_link_hash_entry **sym_hashes;
+  bfd_signed_vma *local_got_refcounts;
+  const Elf_Internal_Rela *rel, *relend;
+
+  if (info->relocatable)
+    return TRUE;
+
+  htab = elf64_aarch64_hash_table (info);
+
+  if (htab == NULL)
+    return FALSE;
+
+  elf_section_data (sec)->local_dynrel = NULL;
+
+  symtab_hdr = &elf_symtab_hdr (abfd);
+  sym_hashes = elf_sym_hashes (abfd);
+
+  local_got_refcounts = elf_local_got_refcounts (abfd);
+
+  relend = relocs + sec->reloc_count;
+  for (rel = relocs; rel < relend; rel++)
+    {
+      unsigned long r_symndx;
+      unsigned int r_type;
+      struct elf_link_hash_entry *h = NULL;
+
+      r_symndx = ELF64_R_SYM (rel->r_info);
+
+      if (r_symndx >= symtab_hdr->sh_info)
+       {
+         struct elf64_aarch64_link_hash_entry *eh;
+         struct elf_dyn_relocs **pp;
+         struct elf_dyn_relocs *p;
+
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+         eh = (struct elf64_aarch64_link_hash_entry *) h;
+
+         for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
+           {
+             if (p->sec == sec)
+               {
+                 /* Everything must go for SEC.  */
+                 *pp = p->next;
+                 break;
+               }
+           }
+        }
+      else
+       {
+         Elf_Internal_Sym *isym;
+
+         /* A local symbol.  */
+         isym = bfd_sym_from_r_symndx (&htab->sym_cache,
+                                       abfd, r_symndx);
+         if (isym == NULL)
+           return FALSE;
+       }
+
+      r_type = ELF64_R_TYPE (rel->r_info);
+      r_type = aarch64_tls_transition (abfd,info, r_type, h ,r_symndx);
+      switch (r_type)
+       {
+       case R_AARCH64_LD64_GOT_LO12_NC:
+       case R_AARCH64_GOT_LD_PREL19:
+       case R_AARCH64_ADR_GOT_PAGE:
+       case R_AARCH64_TLSGD_ADR_PAGE21:
+       case R_AARCH64_TLSGD_ADD_LO12_NC:
+       case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+       case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+       case R_AARCH64_TLSLE_ADD_TPREL_LO12:
+       case R_AARCH64_TLSLE_ADD_TPREL_HI12:
+       case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+       case R_AARCH64_TLSLE_MOVW_TPREL_G2:
+       case R_AARCH64_TLSLE_MOVW_TPREL_G1:
+       case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+       case R_AARCH64_TLSLE_MOVW_TPREL_G0:
+       case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+       case R_AARCH64_TLSDESC_ADR_PAGE:
+       case R_AARCH64_TLSDESC_ADD_LO12_NC:
+       case R_AARCH64_TLSDESC_LD64_LO12_NC:
+          if (h != NULL)
+           {
+             if (h->got.refcount > 0)
+               h->got.refcount -= 1;
+           }
+         else if (local_got_refcounts != NULL)
+           {
+             if (local_got_refcounts[r_symndx] > 0)
+               local_got_refcounts[r_symndx] -= 1;
+           }
+         break;
+
+       case R_AARCH64_ADR_PREL_PG_HI21_NC:
+       case R_AARCH64_ADR_PREL_PG_HI21:
+       case R_AARCH64_ADR_PREL_LO21:
+         if (h != NULL && info->executable)
+           {
+             if (h->plt.refcount > 0)
+               h->plt.refcount -= 1;
+           }
+         break;
+
+       case R_AARCH64_CALL26:
+       case R_AARCH64_JUMP26:
+          /* If this is a local symbol then we resolve it
+             directly without creating a PLT entry.  */
+         if (h == NULL)
+           continue;
+
+         if (h->plt.refcount > 0)
+           h->plt.refcount -= 1;
+         break;
+
+       case R_AARCH64_ABS64:
+         if (h != NULL && info->executable)
+           {
+             if (h->plt.refcount > 0)
+               h->plt.refcount -= 1;
+           }
+         break;
+        
+       default:
+         break;
+       }
+    }
+
   return TRUE;
 }
 
   return TRUE;
 }
 
@@ -7049,7 +7180,7 @@ const struct elf_size_info elf64_aarch64_size_info =
   elf64_aarch64_size_info
 
 #define elf_backend_can_refcount       1
   elf64_aarch64_size_info
 
 #define elf_backend_can_refcount       1
-#define elf_backend_can_gc_sections    0
+#define elf_backend_can_gc_sections    1
 #define elf_backend_plt_readonly       1
 #define elf_backend_want_got_plt       1
 #define elf_backend_want_plt_sym       0
 #define elf_backend_plt_readonly       1
 #define elf_backend_want_got_plt       1
 #define elf_backend_want_plt_sym       0
index dd4ded2fc11ea89700e0522cdb40b3a09d7d0007..ffbf3f876b53e218886f9aa1a2a1af1586eff6de 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-08  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
+
+        * lib/ld-lib.exp (check_gc_sections_available): Remove aarch64
+       from list of targets that don't support gc-section.
+
 2013-03-05  Alan Modra  <amodra@gmail.com>
 
        * ld-scripts/rgn-at6.s, * ld-scripts/rgn-at6.t, * ld-scripts/rgn-at6.d,
 2013-03-05  Alan Modra  <amodra@gmail.com>
 
        * ld-scripts/rgn-at6.s, * ld-scripts/rgn-at6.t, * ld-scripts/rgn-at6.d,
index 4cd671d4734fc4801ac22f9314106006a825a079..4b88093eee4e39c4224fa92e5d021178e1927ca9 100644 (file)
@@ -1,7 +1,5 @@
 # Support routines for LD testsuite.
 # Support routines for LD testsuite.
-#   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-#    2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-#    Free Software Foundation, Inc.
+#   Copyright 1994-2013 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
 #
 # This file is part of the GNU Binutils.
 #
@@ -1518,22 +1516,21 @@ proc check_gc_sections_available { } {
     if {![info exists gc_sections_available_saved]} {
        # Some targets don't support gc-sections despite whatever's
        # advertised by ld's options.
     if {![info exists gc_sections_available_saved]} {
        # Some targets don't support gc-sections despite whatever's
        # advertised by ld's options.
-       if {[istarget aarch64*-*-*]
-            || [istarget arc-*-*]
-            || [istarget d30v-*-*]
-            || [istarget dlx-*-*]
-            || [istarget i960-*-*]
-            || [istarget or32-*-*]
-            || [istarget pj*-*-*]
-            || [istarget alpha-*-*]
-            || [istarget hppa*64-*-*]
-            || [istarget i370-*-*]
-            || [istarget i860-*-*]
-            || [istarget ia64-*-*]
-            || [istarget mep-*-*]
-            || [istarget mn10200-*-*]
-            || [istarget *-*-cygwin]
-            || [istarget *-*-mingw*] } {
+       if {   [istarget arc-*-*]
+           || [istarget d30v-*-*]
+           || [istarget dlx-*-*]
+           || [istarget i960-*-*]
+           || [istarget or32-*-*]
+           || [istarget pj*-*-*]
+           || [istarget alpha-*-*]
+           || [istarget hppa*64-*-*]
+           || [istarget i370-*-*]
+           || [istarget i860-*-*]
+           || [istarget ia64-*-*]
+           || [istarget mep-*-*]
+           || [istarget mn10200-*-*]
+           || [istarget *-*-cygwin]
+           || [istarget *-*-mingw*] } {
            set gc_sections_available_saved 0
            return 0
        }
            set gc_sections_available_saved 0
            return 0
        }
This page took 0.034878 seconds and 4 git commands to generate.