diff options
author | Alan Modra <amodra@gmail.com> | 2017-09-02 11:08:05 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-09-02 17:39:04 +0930 |
commit | 1fa4ec6ae707402c6b61cde33cfe4bdeafd53f82 (patch) | |
tree | 2db8c41ce002aebac5440e5a6349d1c4a3a91517 /ld/ldlang.h | |
parent | ad71ce8de7dba823f5fc478e6d5eba03f1a2e822 (diff) | |
download | gdb-1fa4ec6ae707402c6b61cde33cfe4bdeafd53f82.zip gdb-1fa4ec6ae707402c6b61cde33cfe4bdeafd53f82.tar.gz gdb-1fa4ec6ae707402c6b61cde33cfe4bdeafd53f82.tar.bz2 |
LTO rescan archives
ld ought to be more clever about where it puts LTO recompiled objects.
Ideally the recompiled objects ought to be ordered to the same place
their IR objects were, and files extracted from archives on the second
pass ought to go in the same place as they would if extracted on the
first pass. This patch addresses the archive problem. Without this
fix, objects extracted from archives might be placed after the crt
files intended to go at the end of an executable or shared library,
possibly causing exception handling failures.
* 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.
Diffstat (limited to 'ld/ldlang.h')
-rw-r--r-- | ld/ldlang.h | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/ld/ldlang.h b/ld/ldlang.h index a833672..86ef342 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -307,10 +307,14 @@ typedef struct lang_input_statement_struct struct flag_info *section_flag_list; /* Point to the next file - whatever it is, wanders up and down - archives */ + 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. */ union lang_statement_union *next; - /* Point to the next file, but skips archive contents. */ + /* Point to the next file, but skips archive contents. Used by + input_file_chain. */ union lang_statement_union *next_real_file; const char *target; @@ -582,9 +586,9 @@ extern asection *section_for_dot #define LANG_FOR_EACH_INPUT_STATEMENT(statement) \ lang_input_statement_type *statement; \ - for (statement = (lang_input_statement_type *) file_chain.head; \ - statement != (lang_input_statement_type *) NULL; \ - statement = (lang_input_statement_type *) statement->next) \ + for (statement = &file_chain.head->input_statement; \ + statement != NULL; \ + statement = &statement->next->input_statement) #define lang_output_section_find(NAME) \ lang_output_section_statement_lookup (NAME, 0, FALSE) |