PR ld/12001
authorAlan Modra <amodra@gmail.com>
Mon, 20 Dec 2010 06:27:11 +0000 (06:27 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 20 Dec 2010 06:27:11 +0000 (06:27 +0000)
Revert 2010-11-03 Nick Clifton
* ldlang.c (ldlang_def_chain_list): Delete.
(insert_defined, ldlang_add_def, lang_place_defineds): Delete.
(lang_process): Don't call lang_place_defineds.
(lang_add_assignment): Don't do anything special for --defsym.

* ldexp.h (struct ldexp_control): Add uses_defined.
(exp_fold_tree_no_dot): Declare.
* ldexp.c (exp_fold_tree): Clear uses_defined.
(exp_fold_tree_no_dot): Likewise.  Make global.
(fold_name <DEFINED>): Set uses_defined.
(exp_fold_tree_1 <etree_assign>): Define symbol during first phase
even when the value being assigned isn't valid.
* ldlang.c (open_input_bfds): Process assignment statements.
(lang_process): Bump lang_statement_iteration.
(scan_for_self_assignment): Formatting.
(print_assignment): Style.

testsuite/
* ld-scripts/default-script2.d: Revert 2010-11-03 change.

ld/ChangeLog
ld/ldexp.c
ld/ldexp.h
ld/ldlang.c
ld/testsuite/ChangeLog
ld/testsuite/ld-scripts/default-script2.d

index c145a7e5ad9285cce6a97772b2f9d61020314742..13aa681c42e1204e587dd570661f7c440e2fa5c9 100644 (file)
@@ -1,3 +1,24 @@
+2010-12-20  Alan Modra  <amodra@gmail.com>
+
+       PR ld/12001
+       Revert 2010-11-03 Nick Clifton
+       * ldlang.c (ldlang_def_chain_list): Delete.
+       (insert_defined, ldlang_add_def, lang_place_defineds): Delete.
+       (lang_process): Don't call lang_place_defineds.
+       (lang_add_assignment): Don't do anything special for --defsym.
+
+       * ldexp.h (struct ldexp_control): Add uses_defined.
+       (exp_fold_tree_no_dot): Declare.
+       * ldexp.c (exp_fold_tree): Clear uses_defined.
+       (exp_fold_tree_no_dot): Likewise.  Make global.
+       (fold_name <DEFINED>): Set uses_defined.
+       (exp_fold_tree_1 <etree_assign>): Define symbol during first phase
+       even when the value being assigned isn't valid.
+       * ldlang.c (open_input_bfds): Process assignment statements.
+       (lang_process): Bump lang_statement_iteration.
+       (scan_for_self_assignment): Formatting.
+       (print_assignment): Style.
+
 2010-12-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        * Makefile.am (GENSCRIPTS): Add @enable_initfini_array@.
index de7f9f29bc18e5490b60147a67ad0aa93ab126e7..71b957c4a7211239341a1bab3bb174dc7e4623bd 100644 (file)
@@ -44,7 +44,6 @@
 #include "safe-ctype.h"
 
 static void exp_fold_tree_1 (etree_type *);
-static void exp_fold_tree_no_dot (etree_type *);
 static bfd_vma align_n (bfd_vma, bfd_vma);
 
 segment_type *segments;
@@ -504,6 +503,7 @@ fold_name (etree_type *tree)
       break;
 
     case DEFINED:
+      expld.uses_defined = TRUE;
       if (expld.phase == lang_first_phase_enum)
        lang_track_definedness (tree->name.name);
       else
@@ -802,7 +802,9 @@ exp_fold_tree_1 (etree_type *tree)
            }
 
          exp_fold_tree_1 (tree->assign.src);
-         if (expld.result.valid_p)
+         if (expld.result.valid_p
+             || (expld.phase == lang_first_phase_enum
+                 && !expld.uses_defined))
            {
              if (h == NULL)
                {
@@ -872,15 +874,17 @@ exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp)
   expld.dot = *dotp;
   expld.dotp = dotp;
   expld.section = current_section;
+  expld.uses_defined = FALSE;
   exp_fold_tree_1 (tree);
 }
 
-static void
+void
 exp_fold_tree_no_dot (etree_type *tree)
 {
   expld.dot = 0;
   expld.dotp = NULL;
   expld.section = bfd_abs_section_ptr;
+  expld.uses_defined = FALSE;
   exp_fold_tree_1 (tree);
 }
 
index a15f64a79cfa093f38bb6bfd9f201d464e71bf7f..ac73bd116794a3431a86424469d0c89412e468e7 100644 (file)
@@ -127,6 +127,7 @@ struct ldexp_control {
   /* Working results.  */
   etree_value_type result;
   bfd_vma dot;
+  bfd_boolean uses_defined;
 
   /* Current dot and section passed to ldexp folder.  */
   bfd_vma *dotp;
@@ -173,6 +174,8 @@ etree_type *exp_relop
   (asection *, bfd_vma);
 void exp_fold_tree
   (etree_type *, asection *, bfd_vma *);
+void exp_fold_tree_no_dot
+  (etree_type *);
 etree_type *exp_binop
   (int, etree_type *, etree_type *);
 etree_type *exp_trinop
index 32c4af3ef78020de1d28d3cf4811d341d3c31b2a..6f4e200eb241789c252e647b0e3b52bc10a27594 100644 (file)
@@ -3249,6 +3249,9 @@ open_input_bfds (lang_statement_union_type *s, bfd_boolean force)
                }
            }
          break;
+       case lang_assignment_statement_enum:
+         exp_fold_tree_no_dot (s->assignment_statement.exp);
+         break;
        default:
          break;
        }
@@ -3395,65 +3398,6 @@ lang_place_undefineds (void)
     insert_undefined (ptr->name);
 }
 
-typedef struct bfd_sym_chain ldlang_def_chain_list_type;
-
-static ldlang_def_chain_list_type ldlang_def_chain_list_head;
-
-/* Insert NAME as defined in the symbol table.  */
-
-static void
-insert_defined (const char *name)
-{
-  struct bfd_link_hash_entry *h;
-
-  h = bfd_link_hash_lookup (link_info.hash, name, TRUE, FALSE, TRUE);
-  if (h == NULL)
-    einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
-  if (h->type == bfd_link_hash_new
-      || h->type == bfd_link_hash_undefined
-      || h->type == bfd_link_hash_undefweak)
-    {
-      h->type = bfd_link_hash_defined;
-      h->u.def.section = bfd_abs_section_ptr;
-      h->u.def.value   = 0;
-    }
-}
-
-/* Like lang_add_undef, but this time for symbols defined on the
-   command line.  */
-
-static void
-ldlang_add_def (const char *const name)
-{
-  if (link_info.output_bfd != NULL)
-    insert_defined (xstrdup (name));
-  else
-    {
-      ldlang_def_chain_list_type *new_def;
-
-      new_def = (ldlang_def_chain_list_type *) stat_alloc (sizeof (*new_def));
-      new_def->next = ldlang_def_chain_list_head.next;
-      ldlang_def_chain_list_head.next = new_def;
-
-      new_def->name = xstrdup (name);
-    }
-}
-
-/* Run through the list of defineds created above and place them
-   into the linker hash table as defined symbols belonging to the
-   script file.  */
-
-static void
-lang_place_defineds (void)
-{
-  ldlang_def_chain_list_type *ptr;
-
-  for (ptr = ldlang_def_chain_list_head.next;
-       ptr != NULL;
-       ptr = ptr->next)
-    insert_defined (ptr->name);
-}
-
 /* Check for all readonly or some readwrite sections.  */
 
 static void
@@ -3982,12 +3926,12 @@ scan_for_self_assignment (const char * dst, etree_type * rhs)
   switch (rhs->type.node_class)
     {
     case etree_binary:
-      return scan_for_self_assignment (dst, rhs->binary.lhs)
-       ||   scan_for_self_assignment (dst, rhs->binary.rhs);
+      return (scan_for_self_assignment (dst, rhs->binary.lhs)
+             || scan_for_self_assignment (dst, rhs->binary.rhs));
 
     case etree_trinary:
-      return scan_for_self_assignment (dst, rhs->trinary.lhs)
-       ||   scan_for_self_assignment (dst, rhs->trinary.rhs);
+      return (scan_for_self_assignment (dst, rhs->trinary.lhs)
+             || scan_for_self_assignment (dst, rhs->trinary.rhs));
 
     case etree_assign:
     case etree_provided:
@@ -4042,7 +3986,7 @@ print_assignment (lang_assignment_statement_type *assignment,
 
       is_dot = (dst[0] == '.' && dst[1] == 0);
       tree = assignment->exp->assign.src;
-      computation_is_valid = is_dot || (scan_for_self_assignment (dst, tree) == FALSE);
+      computation_is_valid = is_dot || !scan_for_self_assignment (dst, tree);
     }
 
   osec = output_section->bfd_section;
@@ -6461,7 +6405,6 @@ lang_process (void)
 
   /* Add to the hash table all undefineds on the command line.  */
   lang_place_undefineds ();
-  lang_place_defineds ();
 
   if (!bfd_section_already_linked_table_init ())
     einfo (_("%P%F: Failed to create hash table\n"));
@@ -6523,6 +6466,7 @@ lang_process (void)
 
   /* Run through the contours of the script and attach input sections
      to the correct output sections.  */
+  lang_statement_iteration++;
   map_input_to_output_sections (statement_list.head, NULL, NULL);
 
   process_insert_statements ();
@@ -6746,10 +6690,6 @@ lang_add_assignment (etree_type *exp)
 {
   lang_assignment_statement_type *new_stmt;
 
-  extern int parsing_defsym;
-  if (parsing_defsym)
-    ldlang_add_def (exp->assign.dst);
-
   new_stmt = new_stat (lang_assignment_statement, stat_ptr);
   new_stmt->exp = exp;
   return new_stmt;
index 3f0fc2be8ca8f287fb30cde876a1e14c5dd275e0..f1e7a35bea95d221d41b419d5a407502b909592c 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-20  Alan Modra  <amodra@gmail.com>
+
+       PR ld/12001
+       * ld-scripts/default-script2.d: Revert 2010-11-03 change.
+
 2010-12-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-elf/elf.exp (array_tests): Add init-mixed.
index 829718d8a9795a2b64576012ff5ebb5c01b19620..68ce2aa9fe2e75703ff4e12f0625a12f861c10f4 100644 (file)
@@ -5,5 +5,5 @@
 #...
 0*8000000 . _START
 #...
-0*8000000 T text
+0*9000000 T text
 #pass