* elf32-hppa.c (hppa32_elf_local_refcounts): New function.
authorDave Anglin <dave.anglin@nrc.ca>
Sun, 1 Mar 2009 18:15:53 +0000 (18:15 +0000)
committerDave Anglin <dave.anglin@nrc.ca>
Sun, 1 Mar 2009 18:15:53 +0000 (18:15 +0000)
(elf32_hppa_check_relocs): Use it.

bfd/ChangeLog
bfd/elf32-hppa.c

index 34bd05ee92804cc6d0c7e531ea73224e52aa6d04..d3ec7a9614618e9c031358734298c099128a0323 100644 (file)
@@ -1,5 +1,8 @@
 2009-03-01  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
+       * elf32-hppa.c (hppa32_elf_local_refcounts): New function.
+       (elf32_hppa_check_relocs): Use it.
+
        * elf_hppa_add_symbol_hook (elf_hppa_add_symbol_hook): Move to
        elf64-hppa.c.
        (elf_hppa_unmark_useless_dynamic_symbols): Likewise.
index 077f3efa7d93dd8b6eb1032b4e741a9998477839..e16344dd22f6cb3327898fc551f18edaccaf4c4d 100644 (file)
@@ -1113,6 +1113,38 @@ elf32_hppa_optimized_tls_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
   return r_type;
 }
 
+/* Return a pointer to the local GOT, PLT and TLS reference counts
+   for ABFD.  Returns NULL if the storage allocation fails.  */
+
+static bfd_signed_vma *
+hppa32_elf_local_refcounts (bfd *abfd)
+{
+  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+  bfd_signed_vma *local_refcounts;
+                  
+  local_refcounts = elf_local_got_refcounts (abfd);
+  if (local_refcounts == NULL)
+    {
+      bfd_size_type size;
+
+      /* Allocate space for local GOT and PLT reference
+        counts.  Done this way to save polluting elf_obj_tdata
+        with another target specific pointer.  */
+      size = symtab_hdr->sh_info;
+      size *= 2 * sizeof (bfd_signed_vma);
+      /* Add in space to store the local GOT TLS types.  */
+      size += symtab_hdr->sh_info;
+      local_refcounts = bfd_zalloc (abfd, size);
+      if (local_refcounts == NULL)
+       return NULL;
+      elf_local_got_refcounts (abfd) = local_refcounts;
+      memset (hppa_elf_local_got_tls_type (abfd), GOT_UNKNOWN,
+             symtab_hdr->sh_info);
+    }
+  return local_refcounts;
+}
+
+
 /* Look through the relocs for a section during the first phase, and
    calculate needed space in the global offset table, procedure linkage
    table, and dynamic reloc sections.  At this point we haven't
@@ -1359,26 +1391,9 @@ elf32_hppa_check_relocs (bfd *abfd,
                  bfd_signed_vma *local_got_refcounts;
                  
                  /* This is a global offset table entry for a local symbol.  */
-                 local_got_refcounts = elf_local_got_refcounts (abfd);
+                 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
                  if (local_got_refcounts == NULL)
-                   {
-                     bfd_size_type size;
-
-                     /* Allocate space for local got offsets and local
-                        plt offsets.  Done this way to save polluting
-                        elf_obj_tdata with another target specific
-                        pointer.  */
-                     size = symtab_hdr->sh_info;
-                     size *= 2 * sizeof (bfd_signed_vma);
-                     /* Add in space to store the local GOT TLS types.  */
-                     size += symtab_hdr->sh_info;
-                     local_got_refcounts = bfd_zalloc (abfd, size);
-                     if (local_got_refcounts == NULL)
-                       return FALSE;
-                     elf_local_got_refcounts (abfd) = local_got_refcounts;
-                     memset (hppa_elf_local_got_tls_type (abfd),
-                         GOT_UNKNOWN, symtab_hdr->sh_info);
-                   }
+                   return FALSE;
                  local_got_refcounts[r_symndx] += 1;
 
                  old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx];
@@ -1425,22 +1440,9 @@ elf32_hppa_check_relocs (bfd *abfd,
                  bfd_signed_vma *local_got_refcounts;
                  bfd_signed_vma *local_plt_refcounts;
 
-                 local_got_refcounts = elf_local_got_refcounts (abfd);
+                 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
                  if (local_got_refcounts == NULL)
-                   {
-                     bfd_size_type size;
-
-                     /* Allocate space for local got offsets and local
-                        plt offsets.  */
-                     size = symtab_hdr->sh_info;
-                     size *= 2 * sizeof (bfd_signed_vma);
-                     /* Add in space to store the local GOT TLS types.  */
-                     size += symtab_hdr->sh_info;
-                     local_got_refcounts = bfd_zalloc (abfd, size);
-                     if (local_got_refcounts == NULL)
-                       return FALSE;
-                     elf_local_got_refcounts (abfd) = local_got_refcounts;
-                   }
+                   return FALSE;
                  local_plt_refcounts = (local_got_refcounts
                                         + symtab_hdr->sh_info);
                  local_plt_refcounts[r_symndx] += 1;