PR ld/13839
* ldexp.c (fold_name): Ignore undefined symbols when assigning to dot in mark phase. (exp_fold_tree_1): Evaluate assignment to dot expressions even when discarding result, for side effects. Fix typo in error message.
This commit is contained in:
parent
51e40b125f
commit
ec8460b5ba
2 changed files with 19 additions and 11 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2012-03-14 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
PR ld/13839
|
||||||
|
* ldexp.c (fold_name): Ignore undefined symbols when assigning to
|
||||||
|
dot in mark phase.
|
||||||
|
(exp_fold_tree_1): Evaluate assignment to dot expressions even when
|
||||||
|
discarding result, for side effects. Fix typo in error message.
|
||||||
|
|
||||||
2012-03-08 Tristan Gingold <gingold@adacore.com>
|
2012-03-08 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
* ldexp.c (exp_print_tree): Special case for SEGMENT_START.
|
* ldexp.c (exp_print_tree): Special case for SEGMENT_START.
|
||||||
|
|
22
ld/ldexp.c
22
ld/ldexp.c
|
@ -606,7 +606,8 @@ fold_name (etree_type *tree)
|
||||||
output_section);
|
output_section);
|
||||||
}
|
}
|
||||||
else if (expld.phase == lang_final_phase_enum
|
else if (expld.phase == lang_final_phase_enum
|
||||||
|| expld.assigning_to_dot)
|
|| (expld.phase != lang_mark_phase_enum
|
||||||
|
&& expld.assigning_to_dot))
|
||||||
einfo (_("%F%S: undefined symbol `%s'"
|
einfo (_("%F%S: undefined symbol `%s'"
|
||||||
" referenced in expression\n"),
|
" referenced in expression\n"),
|
||||||
tree, tree->name.name);
|
tree, tree->name.name);
|
||||||
|
@ -797,14 +798,7 @@ exp_fold_tree_1 (etree_type *tree)
|
||||||
if (tree->type.node_class != etree_assign)
|
if (tree->type.node_class != etree_assign)
|
||||||
einfo (_("%F%S can not PROVIDE assignment to"
|
einfo (_("%F%S can not PROVIDE assignment to"
|
||||||
" location counter\n"), tree);
|
" location counter\n"), tree);
|
||||||
/* After allocation, assignment to dot should not be done inside
|
if (expld.phase != lang_first_phase_enum)
|
||||||
an output section since allocation adds a padding statement
|
|
||||||
that effectively duplicates the assignment. */
|
|
||||||
if (expld.phase == lang_mark_phase_enum
|
|
||||||
|| expld.phase == lang_allocating_phase_enum
|
|
||||||
|| ((expld.phase == lang_assigning_phase_enum
|
|
||||||
|| expld.phase == lang_final_phase_enum)
|
|
||||||
&& expld.section == bfd_abs_section_ptr))
|
|
||||||
{
|
{
|
||||||
/* Notify the folder that this is an assignment to dot. */
|
/* Notify the folder that this is an assignment to dot. */
|
||||||
expld.assigning_to_dot = TRUE;
|
expld.assigning_to_dot = TRUE;
|
||||||
|
@ -819,8 +813,14 @@ exp_fold_tree_1 (etree_type *tree)
|
||||||
}
|
}
|
||||||
else if (expld.dotp == NULL)
|
else if (expld.dotp == NULL)
|
||||||
einfo (_("%F%S assignment to location counter"
|
einfo (_("%F%S assignment to location counter"
|
||||||
" invalid outside of SECTION\n"), tree);
|
" invalid outside of SECTIONS\n"), tree);
|
||||||
else
|
|
||||||
|
/* After allocation, assignment to dot should not be
|
||||||
|
done inside an output section since allocation adds a
|
||||||
|
padding statement that effectively duplicates the
|
||||||
|
assignment. */
|
||||||
|
else if (expld.phase <= lang_allocating_phase_enum
|
||||||
|
|| expld.section == bfd_abs_section_ptr)
|
||||||
{
|
{
|
||||||
bfd_vma nextdot;
|
bfd_vma nextdot;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue