This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: Optimize add_archive_element call
Committed.
bfd/
* 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.
ld/
* ldlang.c (load_symbols): Correct last change.
Index: bfd/aoutx.h
===================================================================
RCS file: /cvs/src/src/bfd/aoutx.h,v
retrieving revision 1.84
diff -u -p -r1.84 aoutx.h
--- bfd/aoutx.h 14 Oct 2010 01:31:26 -0000 1.84
+++ bfd/aoutx.h 13 Dec 2010 00:43:49 -0000
@@ -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 *ab
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: bfd/cofflink.c
===================================================================
RCS file: /cvs/src/src/bfd/cofflink.c,v
retrieving revision 1.74
diff -u -p -r1.74 cofflink.c
--- bfd/cofflink.c 14 Oct 2010 01:31:26 -0000 1.74
+++ bfd/cofflink.c 13 Dec 2010 00:43:55 -0000
@@ -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 *ab
struct bfd_link_info *info,
bfd_boolean *pneeded)
{
- bfd *subsbfd = NULL;
+ bfd *oldbfd;
+ bfd_boolean needed;
- if (! _bfd_coff_get_external_symbols (abfd))
+ if (!_bfd_coff_get_external_symbols (abfd))
return FALSE;
- if (! coff_link_check_ar_symbols (abfd, info, pneeded, &subsbfd))
+ oldbfd = abfd;
+ if (!coff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
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))
- return FALSE;
-
- if (*pneeded
- && ! coff_link_add_symbols (subsbfd ? subsbfd : abfd, info))
- 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: bfd/ecoff.c
===================================================================
RCS file: /cvs/src/src/bfd/ecoff.c,v
retrieving revision 1.71
diff -u -p -r1.71 ecoff.c
--- bfd/ecoff.c 29 Oct 2010 12:10:24 -0000 1.71
+++ bfd/ecoff.c 13 Dec 2010 00:43:57 -0000
@@ -3600,7 +3600,7 @@ ecoff_link_check_archive_element (bfd *a
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 *a
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 *abf
unsigned int file_offset;
const char *name;
bfd *element;
- bfd *subsbfd;
h = *pundef;
@@ -3820,13 +3818,10 @@ ecoff_link_add_archive_symbols (bfd *abf
/* 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: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.390
diff -u -p -r1.390 elflink.c
--- bfd/elflink.c 12 Dec 2010 14:52:26 -0000 1.390
+++ bfd/elflink.c 13 Dec 2010 00:44:21 -0000
@@ -5073,10 +5073,10 @@ elf_link_add_archive_symbols (bfd *abfd,
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: bfd/linker.c
===================================================================
RCS file: /cvs/src/src/bfd/linker.c,v
retrieving revision 1.77
diff -u -p -r1.77 linker.c
--- bfd/linker.c 14 Oct 2010 01:31:27 -0000 1.77
+++ bfd/linker.c 13 Dec 2010 00:44:29 -0000
@@ -1223,20 +1223,18 @@ generic_link_check_archive_element (bfd
{
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
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: bfd/pdp11.c
===================================================================
RCS file: /cvs/src/src/bfd/pdp11.c,v
retrieving revision 1.46
diff -u -p -r1.46 pdp11.c
--- bfd/pdp11.c 2 Dec 2010 11:53:07 -0000 1.46
+++ bfd/pdp11.c 13 Dec 2010 00:44:31 -0000
@@ -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 *ab
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: bfd/vms-alpha.c
===================================================================
RCS file: /cvs/src/src/bfd/vms-alpha.c,v
retrieving revision 1.37
diff -u -p -r1.37 vms-alpha.c
--- bfd/vms-alpha.c 14 Oct 2010 01:31:27 -0000 1.37
+++ bfd/vms-alpha.c 13 Dec 2010 00:44:35 -0000
@@ -8220,7 +8220,6 @@ alpha_vms_link_add_archive_symbols (bfd
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
/* 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: bfd/xcofflink.c
===================================================================
RCS file: /cvs/src/src/bfd/xcofflink.c,v
retrieving revision 1.76
diff -u -p -r1.76 xcofflink.c
--- bfd/xcofflink.c 14 Oct 2010 01:31:27 -0000 1.76
+++ bfd/xcofflink.c 13 Dec 2010 00:44:39 -0000
@@ -2292,8 +2292,8 @@ xcoff_link_check_dynamic_ar_symbols (bfd
&& (((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 *a
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 *a
if (!keep_syms_p)
{
- if (! _bfd_coff_free_symbols (abfd))
+ if (!_bfd_coff_free_symbols (abfd))
return FALSE;
}
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.351
diff -u -p -r1.351 ldlang.c
--- ld/ldlang.c 12 Dec 2010 14:52:27 -0000 1.351
+++ ld/ldlang.c 13 Dec 2010 00:44:44 -0000
@@ -2718,13 +2718,14 @@ load_symbols (lang_input_statement_type
}
subsbfd = member;
- if (! ((*link_info.callbacks->add_archive_element)
- (&link_info, member, "--whole-archive", &subsbfd)))
+ if (!(*link_info.callbacks
+ ->add_archive_element) (&link_info, member,
+ "--whole-archive", &subsbfd))
abort ();
/* Potentially, the add_archive_element hook may have set a
substitute BFD for us. */
- if (! bfd_link_add_symbols (member, &link_info))
+ if (!bfd_link_add_symbols (subsbfd, &link_info))
{
einfo (_("%F%B: could not read symbols: %E\n"), member);
loaded = FALSE;
--
Alan Modra
Australia Development Lab, IBM