diff options
author | Alan Modra <amodra@gmail.com> | 2010-09-10 01:23:12 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2010-09-10 01:23:12 +0000 |
commit | 8658f98909b170695a9ef5d785ababc95c500118 (patch) | |
tree | c4efaa418219974aedb6b96dd55dba0a7579b179 /ld/ldlang.c | |
parent | d3615e3a49afae80de3c47f213ac87114706f0ea (diff) | |
download | gdb-8658f98909b170695a9ef5d785ababc95c500118.zip gdb-8658f98909b170695a9ef5d785ababc95c500118.tar.gz gdb-8658f98909b170695a9ef5d785ababc95c500118.tar.bz2 |
PR ld/11931
* ldlang.h (lang_for_each_statement_worker): Declare.
* ldlang.c (lang_for_each_statement_worker): Make global. Don't
recurse into children of output_section_statement with constraint
set to -1.
(print_assignment): Handle NULL output_section->bfd_section.
(lang_size_sections_1): Ignore output section statement address
when constraint is -1.
* emultempl/xtensaelf.em (lang_for_each_statement_worker): Delete.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r-- | ld/ldlang.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c index 2b9971a..7f44445 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -871,9 +871,10 @@ walk_wild (lang_wild_statement_type *s, callback_t callback, void *data) } /* lang_for_each_statement walks the parse tree and calls the provided - function for each node. */ + function for each node, except those inside output section statements + with constraint set to -1. */ -static void +void lang_for_each_statement_worker (void (*func) (lang_statement_union_type *), lang_statement_union_type *s) { @@ -887,8 +888,9 @@ lang_for_each_statement_worker (void (*func) (lang_statement_union_type *), lang_for_each_statement_worker (func, constructor_list.head); break; case lang_output_section_statement_enum: - lang_for_each_statement_worker - (func, s->output_section_statement.children.head); + if (s->output_section_statement.constraint != -1) + lang_for_each_statement_worker + (func, s->output_section_statement.children.head); break; case lang_wild_statement_enum: lang_for_each_statement_worker (func, @@ -3888,6 +3890,7 @@ print_assignment (lang_assignment_statement_type *assignment, bfd_boolean is_dot; bfd_boolean computation_is_valid = TRUE; etree_type *tree; + asection *osec; for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++) print_space (); @@ -3907,7 +3910,10 @@ print_assignment (lang_assignment_statement_type *assignment, computation_is_valid = is_dot || (scan_for_self_assignment (dst, tree) == FALSE); } - exp_fold_tree (tree, output_section->bfd_section, &print_dot); + osec = output_section->bfd_section; + if (osec == NULL) + osec = bfd_abs_section_ptr; + exp_fold_tree (tree, osec, &print_dot); if (expld.result.valid_p) { bfd_vma value; @@ -4704,6 +4710,9 @@ lang_size_sections_1 lang_memory_region_type *r; os = &s->output_section_statement; + if (os->constraint == -1) + break; + /* FIXME: We shouldn't need to zero section vmas for ld -r here, in lang_insert_orphan, or in the default linker scripts. This is covering for coff backend linker bugs. See PR6945. */ |