* aoutx.h (aout_link_check_ar_symbols): Formatting.
authorAlan Modra <amodra@gmail.com>
Mon, 13 Dec 2010 01:06:16 +0000 (01:06 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 13 Dec 2010 01:06:16 +0000 (01:06 +0000)
* cofflink.c (coff_link_check_ar_symbols): Likewise.
* elflink.c (elf_link_add_archive_symbols): Likewise.
* pdp11.c (aout_link_check_ar_symbols): Likewise.
* xcofflink.c (xcoff_link_check_dynamic_ar_symbols,
xcoff_link_check_dynamic_ar_symbols): Likewise.

* aoutx.h (aout_link_check_archive_element): Simplify code dealing
with add_archive_element substitute BFD.
* cofflink.c (coff_link_check_archive_element): Likewise.
* ecoff.c (ecoff_link_check_archive_element): Likewise.
(ecoff_link_add_archive_symbols): Likewise.
* linker.c (generic_link_check_archive_element): Likewise.
* pdp11.c (aout_link_check_archive_element): Likewise.
* vms-alpha.c (alpha_vms_link_add_archive_symbols): Likewise.
* xcofflink.c (xcoff_link_check_archive_element): Likewise.

* aoutx.h (aout_link_check_archive_element): Free symbols from old
bfd if !keep_memory.
* cofflink.c (coff_link_check_archive_element): Likewise.
* pdp11.c (aout_link_check_archive_element): Likewise.
* xcofflink.c (xcoff_link_check_archive_element): Likewise.

bfd/ChangeLog
bfd/aoutx.h
bfd/cofflink.c
bfd/ecoff.c
bfd/elflink.c
bfd/linker.c
bfd/pdp11.c
bfd/vms-alpha.c
bfd/xcofflink.c

index 5bcf80894becc5af8803de135e67a4650370e4d1..8e1246178b44b8d1636cef9a84b48b2c6518b0bc 100644 (file)
@@ -1,3 +1,28 @@
+2010-12-13  Alan Modra  <amodra@gmail.com>
+
+       * aoutx.h (aout_link_check_ar_symbols): Formatting.
+       * cofflink.c (coff_link_check_ar_symbols): Likewise.
+       * elflink.c (elf_link_add_archive_symbols): Likewise.
+       * pdp11.c (aout_link_check_ar_symbols): Likewise.
+       * xcofflink.c (xcoff_link_check_dynamic_ar_symbols,
+       xcoff_link_check_dynamic_ar_symbols): Likewise.
+
+       * aoutx.h (aout_link_check_archive_element): Simplify code dealing
+       with add_archive_element substitute BFD.
+       * cofflink.c (coff_link_check_archive_element): Likewise.
+       * ecoff.c (ecoff_link_check_archive_element): Likewise.
+       (ecoff_link_add_archive_symbols): Likewise.
+       * linker.c (generic_link_check_archive_element): Likewise.
+       * pdp11.c (aout_link_check_archive_element): Likewise.
+       * vms-alpha.c (alpha_vms_link_add_archive_symbols): Likewise.
+       * xcofflink.c (xcoff_link_check_archive_element): Likewise.
+
+       * aoutx.h (aout_link_check_archive_element): Free symbols from old
+       bfd if !keep_memory.
+       * cofflink.c (coff_link_check_archive_element): Likewise.
+       * pdp11.c (aout_link_check_archive_element): Likewise.
+       * xcofflink.c (xcoff_link_check_archive_element): Likewise.
+
 2010-12-13  Alan Modra  <amodra@gmail.com>
 
        * plugin.c (bfd_plugin_mkobject): Delete.
index efa9d474319f3b296e8312efb83ec01f8d85be0a..7ca221ecd6d878dbd04b15c3db36807e752edf2f 100644 (file)
@@ -3305,8 +3305,8 @@ aout_link_check_ar_symbols (bfd *abfd,
                continue;
            }
 
-         if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, subsbfd))
+         if (!(*info->callbacks
+               ->add_archive_element) (info, abfd, name, subsbfd))
            return FALSE;
          *pneeded = TRUE;
          return TRUE;
@@ -3333,8 +3333,8 @@ aout_link_check_ar_symbols (bfd *abfd,
                         outside BFD.  We assume that we should link
                         in the object file.  This is done for the -u
                         option in the linker.  */
-                     if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, subsbfd))
+                     if (!(*info->callbacks
+                           ->add_archive_element) (info, abfd, name, subsbfd))
                        return FALSE;
                      *pneeded = TRUE;
                      return TRUE;
@@ -3343,8 +3343,8 @@ aout_link_check_ar_symbols (bfd *abfd,
                     symbol.  It is already on the undefs list.  */
                  h->type = bfd_link_hash_common;
                  h->u.c.p = (struct bfd_link_hash_common_entry *)
-                      bfd_hash_allocate (&info->hash->table,
-                                         sizeof (struct bfd_link_hash_common_entry));
+                   bfd_hash_allocate (&info->hash->table,
+                                      sizeof (struct bfd_link_hash_common_entry));
                  if (h->u.c.p == NULL)
                    return FALSE;
 
@@ -3382,8 +3382,8 @@ aout_link_check_ar_symbols (bfd *abfd,
             it if the current link symbol is common.  */
          if (h->type == bfd_link_hash_undefined)
            {
-             if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, subsbfd))
+             if (!(*info->callbacks
+                   ->add_archive_element) (info, abfd, name, subsbfd))
                return FALSE;
              *pneeded = TRUE;
              return TRUE;
@@ -3404,27 +3404,36 @@ aout_link_check_archive_element (bfd *abfd,
                                 struct bfd_link_info *info,
                                 bfd_boolean *pneeded)
 {
-  bfd *subsbfd = NULL;
+  bfd *oldbfd;
+  bfd_boolean needed;
 
-  if (! aout_get_external_symbols (abfd))
+  if (!aout_get_external_symbols (abfd))
     return FALSE;
 
-  if (! aout_link_check_ar_symbols (abfd, info, pneeded, &subsbfd))
+  oldbfd = abfd;
+  if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd))
     return FALSE;
 
-  if (*pneeded)
+  needed = *pneeded;
+  if (needed)
     {
       /* Potentially, the add_archive_element hook may have set a
         substitute BFD for us.  */
-      if (subsbfd && !aout_get_external_symbols (subsbfd))
-       return FALSE;
-      if (! aout_link_add_symbols (subsbfd ? subsbfd : abfd, info))
+      if (abfd != oldbfd)
+       {
+         if (!info->keep_memory
+             && !aout_link_free_symbols (oldbfd))
+           return FALSE;
+         if (!aout_get_external_symbols (abfd))
+           return FALSE;
+       }
+      if (!aout_link_add_symbols (abfd, info))
        return FALSE;
     }
 
-  if (! info->keep_memory || ! *pneeded)
+  if (!info->keep_memory || !needed)
     {
-      if (! aout_link_free_symbols (abfd))
+      if (!aout_link_free_symbols (abfd))
        return FALSE;
     }
 
index a28d396919aba4017396a60db5f2cd3fca52a343..33de7fe3cc8aa97a99e35fa7d56bc061b41ea3eb 100644 (file)
@@ -244,8 +244,8 @@ coff_link_check_ar_symbols (bfd *abfd,
          if (h != (struct bfd_link_hash_entry *) NULL
              && h->type == bfd_link_hash_undefined)
            {
-             if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, subsbfd))
+             if (!(*info->callbacks
+                   ->add_archive_element) (info, abfd, name, subsbfd))
                return FALSE;
              *pneeded = TRUE;
              return TRUE;
@@ -269,29 +269,38 @@ coff_link_check_archive_element (bfd *abfd,
                                 struct bfd_link_info *info,
                                 bfd_boolean *pneeded)
 {
-  bfd *subsbfd = NULL;
+  bfd *oldbfd;
+  bfd_boolean needed;
 
-  if (! _bfd_coff_get_external_symbols (abfd))
-    return FALSE;
-
-  if (! coff_link_check_ar_symbols (abfd, info, pneeded, &subsbfd))
-    return FALSE;
-
-  /* Potentially, the add_archive_element hook may have set a
-     substitute BFD for us.  */
-  if (*pneeded
-      && subsbfd
-      && ! _bfd_coff_get_external_symbols (subsbfd))
+  if (!_bfd_coff_get_external_symbols (abfd))
     return FALSE;
 
-  if (*pneeded
-      && ! coff_link_add_symbols (subsbfd ? subsbfd : abfd, info))
+  oldbfd = abfd;
+  if (!coff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
     return FALSE;
 
-  if ((! info->keep_memory || ! *pneeded)
-      && ! _bfd_coff_free_symbols (abfd))
-    return FALSE;
+  needed = *pneeded;
+  if (needed)
+    {
+      /* Potentially, the add_archive_element hook may have set a
+        substitute BFD for us.  */
+      if (abfd != oldbfd)
+       {
+         if (!info->keep_memory
+             && !_bfd_coff_free_symbols (oldbfd))
+           return FALSE;
+         if (!_bfd_coff_get_external_symbols (abfd))
+           return FALSE;
+       }
+      if (!coff_link_add_symbols (abfd, info))
+       return FALSE;
+    }
 
+  if (!info->keep_memory || !needed)
+    {
+      if (!_bfd_coff_free_symbols (abfd))
+       return FALSE;
+    }
   return TRUE;
 }
 
index 43494868d6c6ea18cc3553c132156f572465ccd2..f85627d2f521f6f66f5207e3a70ff87b0b694003 100644 (file)
@@ -3600,7 +3600,7 @@ ecoff_link_check_archive_element (bfd *abfd,
       EXTR esym;
       bfd_boolean def;
       const char *name;
-      bfd *subsbfd;
+      bfd *oldbfd;
       struct bfd_link_hash_entry *h;
 
       (*swap_ext_in) (abfd, (void *) ext_ptr, &esym);
@@ -3645,18 +3645,17 @@ ecoff_link_check_archive_element (bfd *abfd,
        continue;
 
       /* Include this element.  */
-      subsbfd = NULL;
-      if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, &subsbfd))
+      oldbfd = abfd;
+      if (!(*info->callbacks
+           ->add_archive_element) (info, abfd, name, &abfd))
        goto error_return;
       /* Potentially, the add_archive_element hook may have set a
         substitute BFD for us.  */
-      if (subsbfd
+      if (abfd != oldbfd
          && !reread_ext_syms_and_strs (&symhdr, &external_ext_size, &esize,
-                               &external_ext, &ssext, subsbfd, backend))
+                                       &external_ext, &ssext, abfd, backend))
        goto error_return;
-      if (! ecoff_link_add_externals (subsbfd ? subsbfd : abfd, info,
-                               external_ext, ssext))
+      if (! ecoff_link_add_externals (abfd, info, external_ext, ssext))
        goto error_return;
 
       *pneeded = TRUE;
@@ -3733,7 +3732,6 @@ ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
       unsigned int file_offset;
       const char *name;
       bfd *element;
-      bfd *subsbfd;
 
       h = *pundef;
 
@@ -3820,13 +3818,10 @@ ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
       /* Unlike the generic linker, we know that this element provides
         a definition for an undefined symbol and we know that we want
         to include it.  We don't need to check anything.  */
-      subsbfd = NULL;
-      if (! (*info->callbacks->add_archive_element)
-                                       (info, element, name, &subsbfd))
+      if (!(*info->callbacks
+           ->add_archive_element) (info, element, name, &element))
        return FALSE;
-      /* Potentially, the add_archive_element hook may have set a
-        substitute BFD for us.  */
-      if (! ecoff_link_add_object_symbols (subsbfd ? subsbfd : element, info))
+      if (! ecoff_link_add_object_symbols (element, info))
        return FALSE;
 
       pundef = &(*pundef)->u.undef.next;
index a8aac7ced017c97b8b7188aca5ac85089e500534..6136a94cfdf32e1f9ac9d03cffe276c5425ee565 100644 (file)
@@ -5073,10 +5073,10 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
 
          undefs_tail = info->hash->undefs_tail;
 
-         if (! (*info->callbacks->add_archive_element)
-                               (info, element, symdef->name, &element))
+         if (!(*info->callbacks
+               ->add_archive_element) (info, element, symdef->name, &element))
            goto error_return;
-         if (! bfd_link_add_symbols (element, info))
+         if (!bfd_link_add_symbols (element, info))
            goto error_return;
 
          /* If there are any new undefined symbols, we need to make
index fc52b51f007a125579b4487095766ff634ae3e3b..2b52ba965105930a4db2aa149a88d0181e0511f6 100644 (file)
@@ -1223,20 +1223,18 @@ generic_link_check_archive_element (bfd *abfd,
        {
          bfd_size_type symcount;
          asymbol **symbols;
-         bfd *subsbfd = NULL;
+         bfd *oldbfd = abfd;
 
          /* This object file defines this symbol, so pull it in.  */
-         if (! (*info->callbacks->add_archive_element)
-                               (info, abfd, bfd_asymbol_name (p), &subsbfd))
+         if (!(*info->callbacks
+               ->add_archive_element) (info, abfd, bfd_asymbol_name (p),
+                                       &abfd))
            return FALSE;
          /* Potentially, the add_archive_element hook may have set a
             substitute BFD for us.  */
-         if (subsbfd)
-           {
-             abfd = subsbfd;
-             if (!bfd_generic_link_read_symbols (abfd))
-               return FALSE;
-           }
+         if (abfd != oldbfd
+             && !bfd_generic_link_read_symbols (abfd))
+           return FALSE;
          symcount = _bfd_generic_link_get_symcount (abfd);
          symbols = _bfd_generic_link_get_symbols (abfd);
          if (! generic_link_add_symbol_list (abfd, info, symcount,
@@ -1257,12 +1255,12 @@ generic_link_check_archive_element (bfd *abfd,
          symbfd = h->u.undef.abfd;
          if (symbfd == NULL)
            {
-             bfd *subsbfd = NULL;
              /* This symbol was created as undefined from outside
                 BFD.  We assume that we should link in the object
                 file.  This is for the -u option in the linker.  */
-             if (! (*info->callbacks->add_archive_element)
-                               (info, abfd, bfd_asymbol_name (p), &subsbfd))
+             if (!(*info->callbacks
+                   ->add_archive_element) (info, abfd, bfd_asymbol_name (p),
+                                           &abfd))
                return FALSE;
              /* Potentially, the add_archive_element hook may have set a
                 substitute BFD for us.  But no symbols are going to get
index 08aab37dd96c86934c98b11bb82356ba1346096a..3821037827982642cc72dc7bfbaa2d6eb234c362 100644 (file)
@@ -2601,8 +2601,8 @@ aout_link_check_ar_symbols (bfd *abfd,
             but not if it is defined in the .text section.  That
             seems a bit crazy to me, and I haven't implemented it.
             However, it might be correct.  */
-         if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, subsbfd))
+         if (!(*info->callbacks
+               ->add_archive_element) (info, abfd, name, subsbfd))
            return FALSE;
          *pneeded = TRUE;
          return TRUE;
@@ -2629,8 +2629,8 @@ aout_link_check_ar_symbols (bfd *abfd,
                         outside BFD.  We assume that we should link
                         in the object file.  This is done for the -u
                         option in the linker.  */
-                     if (! (*info->callbacks->add_archive_element)
-                         (info, abfd, name, subsbfd))
+                     if (!(*info->callbacks
+                           ->add_archive_element) (info, abfd, name, subsbfd))
                        return FALSE;
                      *pneeded = TRUE;
                      return TRUE;
@@ -2682,27 +2682,36 @@ aout_link_check_archive_element (bfd *abfd,
                                 struct bfd_link_info *info,
                                 bfd_boolean *pneeded)
 {
-  bfd *subsbfd = NULL;
+  bfd *oldbfd;
+  bfd_boolean needed;
 
-  if (! aout_get_external_symbols (abfd))
+  if (!aout_get_external_symbols (abfd))
     return FALSE;
 
-  if (! aout_link_check_ar_symbols (abfd, info, pneeded, &subsbfd))
+  oldbfd = abfd;
+  if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd))
     return FALSE;
 
-  if (*pneeded)
+  needed = *pneeded;
+  if (needed)
     {
       /* Potentially, the add_archive_element hook may have set a
         substitute BFD for us.  */
-      if (subsbfd && ! aout_get_external_symbols (subsbfd))
-       return FALSE;
-      if (! aout_link_add_symbols (subsbfd ? subsbfd : abfd, info))
+      if (abfd != oldbfd)
+       {
+         if (!info->keep_memory
+             && !aout_link_free_symbols (oldbfd))
+           return FALSE;
+         if (!aout_get_external_symbols (abfd))
+           return FALSE;
+       }
+      if (!aout_link_add_symbols (abfd, info))
        return FALSE;
     }
 
-  if (! info->keep_memory || ! *pneeded)
+  if (!info->keep_memory || !needed)
     {
-      if (! aout_link_free_symbols (abfd))
+      if (!aout_link_free_symbols (abfd))
        return FALSE;
     }
 
index ba195f9e71b3355957046009ce8fa723ff741a41..309c3a241be06665e0fb439d3d58d6936f7cd0f4 100644 (file)
@@ -8220,7 +8220,6 @@ alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
       symindex symidx;
       bfd *element;
       bfd *orig_element;
-      bfd *subsbfd;
 
       h = *pundef;
       next_pundef = &(*pundef)->u.undef.next;
@@ -8278,14 +8277,10 @@ alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
       /* Unlike the generic linker, we know that this element provides
         a definition for an undefined symbol and we know that we want
         to include it.  We don't need to check anything.  */
-      subsbfd = NULL;
-      if (! (*info->callbacks->add_archive_element)
-                               (info, element, h->root.string, &subsbfd))
+      if (!(*info->callbacks
+           ->add_archive_element) (info, element, h->root.string, &element))
        return FALSE;
-      /* Potentially, the add_archive_element hook may have set a
-        substitute BFD for us.  */
-      if (! alpha_vms_link_add_object_symbols (subsbfd ? subsbfd : element,
-                               info))
+      if (!alpha_vms_link_add_object_symbols (element, info))
        return FALSE;
 
       orig_element->archive_pass = pass;
index c055b260d6a5b4b0f012b74186dba9453ddcefae..d3e9043dc3f147b869aaae7ffb2236e92381a131 100644 (file)
@@ -2292,8 +2292,8 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
          && (((struct xcoff_link_hash_entry *) h)->flags
              & XCOFF_DEF_DYNAMIC) == 0)
        {
-         if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, subsbfd))
+         if (!(*info->callbacks
+               ->add_archive_element) (info, abfd, name, subsbfd))
            return FALSE;
          *pneeded = TRUE;
          return TRUE;
@@ -2364,8 +2364,8 @@ xcoff_link_check_ar_symbols (bfd *abfd,
                  || (((struct xcoff_link_hash_entry *) h)->flags
                      & XCOFF_DEF_DYNAMIC) == 0))
            {
-             if (! (*info->callbacks->add_archive_element)
-                                       (info, abfd, name, subsbfd))
+             if (!(*info->callbacks
+                   ->add_archive_element) (info, abfd, name, subsbfd))
                return FALSE;
              *pneeded = TRUE;
              return TRUE;
@@ -2390,22 +2390,30 @@ xcoff_link_check_archive_element (bfd *abfd,
                                  bfd_boolean *pneeded)
 {
   bfd_boolean keep_syms_p;
-  bfd *subsbfd = NULL;
+  bfd *oldbfd;
 
   keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
-  if (! _bfd_coff_get_external_symbols (abfd))
+  if (!_bfd_coff_get_external_symbols (abfd))
     return FALSE;
 
-  if (! xcoff_link_check_ar_symbols (abfd, info, pneeded, &subsbfd))
+  oldbfd = abfd;
+  if (!xcoff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
     return FALSE;
 
   if (*pneeded)
     {
       /* Potentially, the add_archive_element hook may have set a
         substitute BFD for us.  */
-      if (subsbfd && !_bfd_coff_get_external_symbols (subsbfd))
-       return FALSE;
-      if (! xcoff_link_add_symbols (subsbfd ? subsbfd : abfd, info))
+      if (abfd != oldbfd)
+       {
+         if (!keep_syms_p
+             && !_bfd_coff_free_symbols (oldbfd))
+           return FALSE;
+         keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
+         if (!_bfd_coff_get_external_symbols (abfd))
+           return FALSE;
+       }
+      if (!xcoff_link_add_symbols (abfd, info))
        return FALSE;
       if (info->keep_memory)
        keep_syms_p = TRUE;
@@ -2413,7 +2421,7 @@ xcoff_link_check_archive_element (bfd *abfd,
 
   if (!keep_syms_p)
     {
-      if (! _bfd_coff_free_symbols (abfd))
+      if (!_bfd_coff_free_symbols (abfd))
        return FALSE;
     }