summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/ldexp.c22
-rw-r--r--ld/ldlang.c5
3 files changed, 30 insertions, 4 deletions
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 <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>
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);
}