tidy elf_merge_st_other
authorAlan Modra <amodra@gmail.com>
Wed, 9 Jul 2014 05:23:00 +0000 (14:53 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 15 Jul 2014 04:06:38 +0000 (13:36 +0930)
So that we munge isym->st_other once per symbol.

* elflink.c (elf_merge_st_other): Update comments.  Simplify
visibility handling.  Make isym const.  Move code modifying
isym->st_other for --exclude-libs to..
(elf_link_add_object_symbols): ..here.

bfd/ChangeLog
bfd/elflink.c

index 6b081f9..8c922aa 100644 (file)
@@ -1,3 +1,10 @@
+2014-07-15  Alan Modra  <amodra@gmail.com>
+
+       * elflink.c (elf_merge_st_other): Update comments.  Simplify
+       visibility handling.  Make isym const.  Move code modifying
+       isym->st_other for --exclude-libs to..
+       (elf_link_add_object_symbols): ..here.
+
 2014-07-11  Maks Naumov  <maksqwe1@ukr.net>
 
        PR 17141
        (struct ppc_elf_relax_info): New.
        (ppc_elf_relax_section): Exclude linker created sections and
        those too small to hold one instruction.  Don't add another
-       branch  around trampolines on later relax passes.  Don't
+       branch around trampolines on later relax passes.  Don't
        generate trampolines for undefined symbols when !relocatable,
        nor for plugin symbols.  Allocate space for ppc476 workaround
        patch area.  Free fixups on error return path.
index 46d65f4..f8a2208 100644 (file)
@@ -851,47 +851,26 @@ _bfd_elf_link_renumber_dynsyms (bfd *output_bfd,
 
 static void
 elf_merge_st_other (bfd *abfd, struct elf_link_hash_entry *h,
-                   Elf_Internal_Sym *isym, bfd_boolean definition,
-                   bfd_boolean dynamic)
+                   const Elf_Internal_Sym *isym,
+                   bfd_boolean definition, bfd_boolean dynamic)
 {
   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
 
   /* If st_other has a processor-specific meaning, specific
-     code might be needed here. We never merge the visibility
-     attribute with the one from a dynamic object.  */
+     code might be needed here.  */
   if (bed->elf_backend_merge_symbol_attribute)
     (*bed->elf_backend_merge_symbol_attribute) (h, isym, definition,
                                                dynamic);
 
-  /* If this symbol has default visibility and the user has requested
-     we not re-export it, then mark it as hidden.  */
-  if (definition
-      && !dynamic
-      && (abfd->no_export
-         || (abfd->my_archive && abfd->my_archive->no_export))
-      && ELF_ST_VISIBILITY (isym->st_other) != STV_INTERNAL)
-    isym->st_other = (STV_HIDDEN
-                     | (isym->st_other & ~ELF_ST_VISIBILITY (-1)));
-
-  if (!dynamic && ELF_ST_VISIBILITY (isym->st_other) != 0)
-    {
-      unsigned char hvis, symvis, other, nvis;
-
-      /* Only merge the visibility. Leave the remainder of the
-        st_other field to elf_backend_merge_symbol_attribute.  */
-      other = h->other & ~ELF_ST_VISIBILITY (-1);
-
-      /* Combine visibilities, using the most constraining one.  */
-      hvis = ELF_ST_VISIBILITY (h->other);
-      symvis = ELF_ST_VISIBILITY (isym->st_other);
-      if (! hvis)
-       nvis = symvis;
-      else if (! symvis)
-       nvis = hvis;
-      else
-       nvis = hvis < symvis ? hvis : symvis;
+  if (!dynamic)
+    {
+      unsigned symvis = ELF_ST_VISIBILITY (isym->st_other);
+      unsigned hvis = ELF_ST_VISIBILITY (h->other);
 
-      h->other = other | nvis;
+      /* Keep the most constraining visibility.  Leave the remainder
+        of the st_other field to elf_backend_merge_symbol_attribute.  */
+      if (symvis - 1 < hvis - 1)
+       h->other = symvis | (h->other & ~ELF_ST_VISIBILITY (-1));
     }
 }
 
@@ -4095,6 +4074,16 @@ error_free_dyn:
              name = newname;
            }
 
+         /* If this symbol has default visibility and the user has
+            requested we not re-export it, then mark it as hidden.  */
+         if (definition
+             && !dynamic
+             && (abfd->no_export
+                 || (abfd->my_archive && abfd->my_archive->no_export))
+             && ELF_ST_VISIBILITY (isym->st_other) != STV_INTERNAL)
+           isym->st_other = (STV_HIDDEN
+                             | (isym->st_other & ~ELF_ST_VISIBILITY (-1)));
+
          if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec, &value,
                                      sym_hash, &old_bfd, &old_weak,
                                      &old_alignment, &skip, &override,