* 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.
+2010-09-10 Alan Modra <amodra@gmail.com>
+
+ 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.
+
2010-09-09 Tristan Gingold <gingold@adacore.com>
* NEWS: Add a entry for alpha-vms.
extern lang_statement_list_type constructor_list;
-/* Begin verbatim code from ldlang.c:
- the following are copied from ldlang.c because they are defined
- there statically. */
-
-static void
-lang_for_each_statement_worker (void (*func) (lang_statement_union_type *),
- lang_statement_union_type *s)
-{
- for (; s != (lang_statement_union_type *) NULL; s = s->header.next)
- {
- func (s);
-
- switch (s->header.type)
- {
- case lang_constructors_statement_enum:
- 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);
- break;
- case lang_wild_statement_enum:
- lang_for_each_statement_worker
- (func,
- s->wild_statement.children.head);
- break;
- case lang_group_statement_enum:
- lang_for_each_statement_worker (func,
- s->group_statement.children.head);
- break;
- case lang_data_statement_enum:
- case lang_reloc_statement_enum:
- case lang_object_symbols_statement_enum:
- case lang_output_statement_enum:
- case lang_target_statement_enum:
- case lang_input_section_enum:
- case lang_input_statement_enum:
- case lang_assignment_statement_enum:
- case lang_padding_statement_enum:
- case lang_address_statement_enum:
- case lang_fill_statement_enum:
- break;
- default:
- FAIL ();
- break;
- }
- }
-}
-
-/* End of verbatim code from ldlang.c. */
-
-
static reloc_deps_section *
xtensa_get_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
asection *sec)
}
/* 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)
{
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,
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 ();
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;
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. */
union etree_union *);
extern void lang_for_each_statement
(void (*) (lang_statement_union_type *));
+extern void lang_for_each_statement_worker
+ (void (*) (lang_statement_union_type *), lang_statement_union_type *);
extern void *stat_alloc
(size_t);
extern void strip_excluded_output_sections