From f32deb62a0953e3125a167efd6dad732cc7d809d Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 16 May 2011 11:34:48 +0000 Subject: * 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. --- ld/ChangeLog | 7 +++++++ ld/ldexp.c | 22 +++++++++++++++++++++- ld/ldlang.c | 5 ++--- 3 files changed, 30 insertions(+), 4 deletions(-) (limited to 'ld') diff --git a/ld/ChangeLog b/ld/ChangeLog index c26c7ddf49..6697fc1fa4 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2010-05-16 Daniel Jacobowitz + + * 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 PR ld/12760 diff --git a/ld/ldexp.c b/ld/ldexp.c index f70634c5c6..68617d8553 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -832,6 +832,8 @@ exp_fold_tree_1 (etree_type *tree) } else { + etree_type *name; + struct bfd_link_hash_entry *h = NULL; 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); if (expld.result.valid_p || (expld.phase == lang_first_phase_enum @@ -876,7 +895,8 @@ exp_fold_tree_1 (etree_type *tree) tree->type.node_class = etree_provided; /* 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) { struct bfd_link_hash_entry *hsrc; diff --git a/ld/ldlang.c b/ld/ldlang.c index b9f6dd87c3..5ccb36f514 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -4048,9 +4048,8 @@ print_assignment (lang_assignment_statement_type *assignment, if (h) { value = h->u.def.value; - - if (expld.result.section != NULL) - value += expld.result.section->vma; + value += h->u.def.section->output_section->vma; + value += h->u.def.section->output_offset; minfo ("[0x%V]", value); } -- cgit v1.2.1