From 8658f98909b170695a9ef5d785ababc95c500118 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 10 Sep 2010 01:23:12 +0000 Subject: 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. --- ld/ldlang.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'ld/ldlang.c') diff --git a/ld/ldlang.c b/ld/ldlang.c index 2b9971aff96..7f444451309 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. */ -- cgit v1.2.1