* ldlang.c (print_assignment): Use the symbol's section if we
use its value. * ldexp.c (exp_fold_tree_1): Skip self-assignment. Expand comment on copying symbol type.
This commit is contained in:
parent
27d0bed645
commit
f37a7048a8
3 changed files with 30 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2010-05-16 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
|
* ldlang.c (print_assignment): Use the symbol's section if we
|
||||||
|
use its value.
|
||||||
|
* ldexp.c (exp_fold_tree_1): Skip self-assignment. Expand
|
||||||
|
comment on copying symbol type.
|
||||||
|
|
||||||
2011-05-16 H.J. Lu <hongjiu.lu@intel.com>
|
2011-05-16 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR ld/12760
|
PR ld/12760
|
||||||
|
|
22
ld/ldexp.c
22
ld/ldexp.c
|
@ -832,6 +832,8 @@ exp_fold_tree_1 (etree_type *tree)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
etree_type *name;
|
||||||
|
|
||||||
struct bfd_link_hash_entry *h = NULL;
|
struct bfd_link_hash_entry *h = NULL;
|
||||||
|
|
||||||
if (tree->type.node_class == etree_provide)
|
if (tree->type.node_class == etree_provide)
|
||||||
|
@ -849,6 +851,23 @@ exp_fold_tree_1 (etree_type *tree)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = tree->assign.src;
|
||||||
|
if (name->type.node_class == etree_trinary)
|
||||||
|
{
|
||||||
|
exp_fold_tree_1 (name->trinary.cond);
|
||||||
|
if (expld.result.valid_p)
|
||||||
|
name = (expld.result.value
|
||||||
|
? name->trinary.lhs : name->trinary.rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name->type.node_class == etree_name
|
||||||
|
&& name->type.node_code == NAME
|
||||||
|
&& strcmp (tree->assign.dst, name->name.name) == 0)
|
||||||
|
/* Leave it alone. Do not replace a symbol with its own
|
||||||
|
output address, in case there is another section sizing
|
||||||
|
pass. Folding does not preserve input sections. */
|
||||||
|
break;
|
||||||
|
|
||||||
exp_fold_tree_1 (tree->assign.src);
|
exp_fold_tree_1 (tree->assign.src);
|
||||||
if (expld.result.valid_p
|
if (expld.result.valid_p
|
||||||
|| (expld.phase == lang_first_phase_enum
|
|| (expld.phase == lang_first_phase_enum
|
||||||
|
@ -876,7 +895,8 @@ exp_fold_tree_1 (etree_type *tree)
|
||||||
tree->type.node_class = etree_provided;
|
tree->type.node_class = etree_provided;
|
||||||
|
|
||||||
/* Copy the symbol type if this is a simple assignment of
|
/* Copy the symbol type if this is a simple assignment of
|
||||||
one symbol to annother. */
|
one symbol to another. This could be more general
|
||||||
|
(e.g. a ?: operator with NAMEs in each branch). */
|
||||||
if (tree->assign.src->type.node_class == etree_name)
|
if (tree->assign.src->type.node_class == etree_name)
|
||||||
{
|
{
|
||||||
struct bfd_link_hash_entry *hsrc;
|
struct bfd_link_hash_entry *hsrc;
|
||||||
|
|
|
@ -4048,9 +4048,8 @@ print_assignment (lang_assignment_statement_type *assignment,
|
||||||
if (h)
|
if (h)
|
||||||
{
|
{
|
||||||
value = h->u.def.value;
|
value = h->u.def.value;
|
||||||
|
value += h->u.def.section->output_section->vma;
|
||||||
if (expld.result.section != NULL)
|
value += h->u.def.section->output_offset;
|
||||||
value += expld.result.section->vma;
|
|
||||||
|
|
||||||
minfo ("[0x%V]", value);
|
minfo ("[0x%V]", value);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue