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.
This commit is contained in:
Alan Modra
2010-09-10 01:23:12 +00:00
parent d3615e3a49
commit 8658f98909
4 changed files with 28 additions and 58 deletions

View File

@ -1,3 +1,15 @@
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> 2010-09-09 Tristan Gingold <gingold@adacore.com>
* NEWS: Add a entry for alpha-vms. * NEWS: Add a entry for alpha-vms.

View File

@ -596,59 +596,6 @@ static size_t ld_count_children (lang_statement_union_type *);
extern lang_statement_list_type constructor_list; 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 * static reloc_deps_section *
xtensa_get_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, xtensa_get_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
asection *sec) asection *sec)

View File

@ -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 /* 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_for_each_statement_worker (void (*func) (lang_statement_union_type *),
lang_statement_union_type *s) 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); lang_for_each_statement_worker (func, constructor_list.head);
break; break;
case lang_output_section_statement_enum: case lang_output_section_statement_enum:
lang_for_each_statement_worker if (s->output_section_statement.constraint != -1)
(func, s->output_section_statement.children.head); lang_for_each_statement_worker
(func, s->output_section_statement.children.head);
break; break;
case lang_wild_statement_enum: case lang_wild_statement_enum:
lang_for_each_statement_worker (func, lang_for_each_statement_worker (func,
@ -3888,6 +3890,7 @@ print_assignment (lang_assignment_statement_type *assignment,
bfd_boolean is_dot; bfd_boolean is_dot;
bfd_boolean computation_is_valid = TRUE; bfd_boolean computation_is_valid = TRUE;
etree_type *tree; etree_type *tree;
asection *osec;
for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++) for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
print_space (); 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); 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) if (expld.result.valid_p)
{ {
bfd_vma value; bfd_vma value;
@ -4704,6 +4710,9 @@ lang_size_sections_1
lang_memory_region_type *r; lang_memory_region_type *r;
os = &s->output_section_statement; os = &s->output_section_statement;
if (os->constraint == -1)
break;
/* FIXME: We shouldn't need to zero section vmas for ld -r /* FIXME: We shouldn't need to zero section vmas for ld -r
here, in lang_insert_orphan, or in the default linker scripts. here, in lang_insert_orphan, or in the default linker scripts.
This is covering for coff backend linker bugs. See PR6945. */ This is covering for coff backend linker bugs. See PR6945. */

View File

@ -580,6 +580,8 @@ extern void lang_add_reloc
union etree_union *); union etree_union *);
extern void lang_for_each_statement extern void lang_for_each_statement
(void (*) (lang_statement_union_type *)); (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 extern void *stat_alloc
(size_t); (size_t);
extern void strip_excluded_output_sections extern void strip_excluded_output_sections