* ldlang.c (print_assignment): Use the symbol's section if we
authorNathan Sidwell <nathan@codesourcery.com>
Mon, 16 May 2011 11:34:48 +0000 (11:34 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Mon, 16 May 2011 11:34:48 +0000 (11:34 +0000)
use its value.
* ldexp.c (exp_fold_tree_1): Skip self-assignment.  Expand
comment on copying symbol type.

ld/ChangeLog
ld/ldexp.c
ld/ldlang.c

index c26c7dd..6697fc1 100644 (file)
@@ -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
index f70634c..68617d8 100644 (file)
@@ -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;
index b9f6dd8..5ccb36f 100644 (file)
@@ -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);
            }