This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb/binutils-2_30-branch] Revert the optimization of the placement of LTO objects as a temporary solution for PR 22751.
- From: Nick Clifton <nickc at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 27 Jan 2018 14:54:15 -0000
- Subject: [binutils-gdb/binutils-2_30-branch] Revert the optimization of the placement of LTO objects as a temporary solution for PR 22751.
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=cad6449ec5efdb8cf7adb3f44e67712effebb05f
commit cad6449ec5efdb8cf7adb3f44e67712effebb05f
Author: Nick Clifton <nickc@redhat.com>
Date: Sat Jan 27 14:53:19 2018 +0000
Revert the optimization of the placement of LTO objects as a temporary solution for PR 22751.
PR 22751
Revert this change as a temporary solution for this PR:
2017-09-02 Alan Modra <amodra@gmail.com>
* ldlang.h (lang_input_statement_type): Expand comments.
(LANG_FOR_EACH_INPUT_STATEMENT): Rewrite without casts.
* ldlang.c (lang_for_each_input_file): Likewise.
(load_symbols): Set usrdata for archives.
(find_rescan_insertion): New function.
(lang_process): Trim off and reinsert entries added to file chain
when rescanning archives for LTO.
* ldmain.c (add_archive_element): Set my_archive input_statement
next pointer to last element added.
Diff:
---
ld/ChangeLog | 17 +++++++++++++
ld/ldlang.c | 79 ++----------------------------------------------------------
ld/ldlang.h | 14 ++++-------
ld/ldmain.c | 5 ----
4 files changed, 24 insertions(+), 91 deletions(-)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 6003464..9586a28 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,20 @@
+2018-01-27 Nick Clifton <nickc@redhat.com>
+
+ PR 22751
+ Revert this change as a temporary solution for this PR:
+
+ 2017-09-02 Alan Modra <amodra@gmail.com>
+
+ * ldlang.h (lang_input_statement_type): Expand comments.
+ (LANG_FOR_EACH_INPUT_STATEMENT): Rewrite without casts.
+ * ldlang.c (lang_for_each_input_file): Likewise.
+ (load_symbols): Set usrdata for archives.
+ (find_rescan_insertion): New function.
+ (lang_process): Trim off and reinsert entries added to file chain
+ when rescanning archives for LTO.
+ * ldmain.c (add_archive_element): Set my_archive input_statement
+ next pointer to last element added.
+
2018-01-25 Eric Botcazou <ebotcazou@adacore.com>
* testsuite/ld-sparc/sparc.exp (32-bit: Helper shared library):
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 1526d7b..e8bfa17 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -2835,7 +2835,6 @@ load_symbols (lang_input_statement_type *entry,
case bfd_archive:
check_excluded_libs (entry->the_bfd);
- entry->the_bfd->usrdata = entry;
if (entry->flags.whole_archive)
{
bfd *member = NULL;
@@ -6605,9 +6604,9 @@ lang_for_each_input_file (void (*func) (lang_input_statement_type *))
{
lang_input_statement_type *f;
- for (f = &input_file_chain.head->input_statement;
+ for (f = (lang_input_statement_type *) input_file_chain.head;
f != NULL;
- f = &f->next_real_file->input_statement)
+ f = (lang_input_statement_type *) f->next_real_file)
func (f);
}
@@ -7005,51 +7004,6 @@ find_replacements_insert_point (void)
return lastobject;
}
-/* Find where to insert ADD, an archive element or shared library
- added during a rescan. */
-
-static lang_statement_union_type **
-find_rescan_insertion (lang_input_statement_type *add)
-{
- bfd *add_bfd = add->the_bfd;
- lang_input_statement_type *f;
- lang_input_statement_type *last_loaded = NULL;
- lang_input_statement_type *before = NULL;
- lang_statement_union_type **iter = NULL;
-
- if (add_bfd->my_archive != NULL)
- add_bfd = add_bfd->my_archive;
-
- /* First look through the input file chain, to find an object file
- before the one we've rescanned. Normal object files always
- appear on both the input file chain and the file chain, so this
- lets us get quickly to somewhere near the correct place on the
- file chain if it is full of archive elements. Archives don't
- appear on the file chain, but if an element has been extracted
- then their input_statement->next points at it. */
- for (f = &input_file_chain.head->input_statement;
- f != NULL;
- f = &f->next_real_file->input_statement)
- {
- if (f->the_bfd == add_bfd)
- {
- before = last_loaded;
- if (f->next != NULL)
- return &f->next->input_statement.next;
- }
- if (f->the_bfd != NULL && f->next != NULL)
- last_loaded = f;
- }
-
- for (iter = before ? &before->next : &file_chain.head->input_statement.next;
- *iter != NULL;
- iter = &(*iter)->input_statement.next)
- if ((*iter)->input_statement.the_bfd->my_archive == NULL)
- break;
-
- return iter;
-}
-
/* Insert SRCLIST into DESTLIST after given element by chaining
on FIELD as the next-pointer. (Counterintuitively does not need
a pointer to the actual after-node itself, just its chain field.) */
@@ -7221,37 +7175,8 @@ lang_process (void)
lang_list_insert_after (&file_chain, &files, &file_chain.head);
/* Rescan archives in case new undefined symbols have appeared. */
- files = file_chain;
lang_statement_iteration++;
open_input_bfds (statement_list.head, OPEN_BFD_RESCAN);
- lang_list_remove_tail (&file_chain, &files);
- while (files.head != NULL)
- {
- lang_statement_union_type **insert;
- lang_statement_union_type **iter, *temp;
- bfd *my_arch;
-
- insert = find_rescan_insertion (&files.head->input_statement);
- /* All elements from an archive can be added at once. */
- iter = &files.head->input_statement.next;
- my_arch = files.head->input_statement.the_bfd->my_archive;
- if (my_arch != NULL)
- for (; *iter != NULL; iter = &(*iter)->input_statement.next)
- if ((*iter)->input_statement.the_bfd->my_archive != my_arch)
- break;
- temp = *insert;
- *insert = files.head;
- files.head = *iter;
- *iter = temp;
- if (my_arch != NULL)
- {
- lang_input_statement_type *parent = my_arch->usrdata;
- if (parent != NULL)
- parent->next = (lang_statement_union_type *)
- ((char *) iter
- - offsetof (lang_input_statement_type, next));
- }
- }
}
}
#endif /* ENABLE_PLUGINS */
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 3d66169..33ee396 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -307,14 +307,10 @@ typedef struct lang_input_statement_struct
struct flag_info *section_flag_list;
/* Point to the next file - whatever it is, wanders up and down
- archive elements. If this input_statement is for an archive, it
- won't be on file_chain (which uses this list pointer), but if
- any elements have been extracted from the archive, it will point
- to the input_statement for the last such element. */
+ archives */
union lang_statement_union *next;
- /* Point to the next file, but skips archive contents. Used by
- input_file_chain. */
+ /* Point to the next file, but skips archive contents. */
union lang_statement_union *next_real_file;
const char *target;
@@ -586,9 +582,9 @@ extern asection *section_for_dot
#define LANG_FOR_EACH_INPUT_STATEMENT(statement) \
lang_input_statement_type *statement; \
- for (statement = &file_chain.head->input_statement; \
- statement != NULL; \
- statement = &statement->next->input_statement)
+ for (statement = (lang_input_statement_type *) file_chain.head; \
+ statement != (lang_input_statement_type *) NULL; \
+ statement = (lang_input_statement_type *) statement->next) \
#define lang_output_section_find(NAME) \
lang_output_section_statement_lookup (NAME, 0, FALSE)
diff --git a/ld/ldmain.c b/ld/ldmain.c
index c473ed2..e02fd3f 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -793,7 +793,6 @@ add_archive_element (struct bfd_link_info *info,
bfd **subsbfd ATTRIBUTE_UNUSED)
{
lang_input_statement_type *input;
- lang_input_statement_type *parent;
lang_input_statement_type orig_input;
input = (lang_input_statement_type *)
@@ -803,10 +802,6 @@ add_archive_element (struct bfd_link_info *info,
input->local_sym_name = abfd->filename;
input->the_bfd = abfd;
- parent = abfd->my_archive->usrdata;
- if (parent != NULL && !parent->flags.reload)
- parent->next = (lang_statement_union_type *) input;
-
/* Save the original data for trace files/tries below, as plugins
(if enabled) may possibly alter it to point to a replacement
BFD, but we still want to output the original BFD filename. */