PR ld/13683
authorNick Clifton <nickc@redhat.com>
Wed, 22 Feb 2012 16:27:35 +0000 (16:27 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 22 Feb 2012 16:27:35 +0000 (16:27 +0000)
* ldlang.c (lang_process): Rerun lang_do_assignments before
starting garbage collection.
* ldexp.c (fold_name): Generate a reloc for defined symbols
found without an associated output section during the mark phase.
(exp_fold_tree_1): Continue processing an expression, even if we
are unable to fold it, if we are in the first two evaluation
phases.
* ldexp.h (enum lang_phase_type): Add descriptions of the phases.

* ld-gc/pr13683.c: New test source file.
* ld-gc/pr13683.d: New test control and output file.
* ld-gc/gc.exp: Run the pr13683 test.

* ld-cris/tls-gc-68: Update expected symbol table dump.
* ld-cris/tls-gc-69: Likewise.
* ld-cris/tls-gc-70: Likewise.
* ld-cris/tls-gc-71: Likewise.
* ld-cris/tls-gc-75: Likewise.
* ld-cris/tls-gc-76.d: Likewise.
* ld-cris/tls-gc-79.d: Likewise.

15 files changed:
ld/ChangeLog
ld/ldexp.c
ld/ldexp.h
ld/ldlang.c
ld/testsuite/ChangeLog
ld/testsuite/ld-cris/tls-gc-68.d
ld/testsuite/ld-cris/tls-gc-69.d
ld/testsuite/ld-cris/tls-gc-70.d
ld/testsuite/ld-cris/tls-gc-71.d
ld/testsuite/ld-cris/tls-gc-75.d
ld/testsuite/ld-cris/tls-gc-76.d
ld/testsuite/ld-cris/tls-gc-79.d
ld/testsuite/ld-gc/gc.exp
ld/testsuite/ld-gc/pr13683.c [new file with mode: 0644]
ld/testsuite/ld-gc/pr13683.d [new file with mode: 0644]

index 60b9d4a087ff9afc631d20f4b768e6dde1a5fb40..1554e3538b08fe8ea577f8a193d0cdfa46daba4e 100644 (file)
@@ -1,3 +1,12 @@
+2012-02-22  Alan Modra  <amodra@gmail.com>
+
+       PR ld/13683
+       * ldlang.c (lang_process): Rerun lang_do_assignments before
+       starting garbage collection.
+       * ldexp.c (fold_name): Generate a reloc for defined symbols
+       found without an associated output section during the mark phase.
+       * ldexp.h (enum lang_phase_type): Add descriptions of the phases.
+
 2012-02-19  Kai Tietz  <ktietz@redhat.com>
 
        * deffilep.y (cmp_import_elem): Sort first by module name.
index 293d28a98c058a00866c553106797be39e63f24e..bf0e00b17965e0ffc13040976622ade9173300aa 100644 (file)
@@ -590,7 +590,9 @@ fold_name (etree_type *tree)
              output_section = h->u.def.section->output_section;
              if (output_section == NULL)
                {
-                 if (expld.phase != lang_mark_phase_enum)
+                 if (expld.phase == lang_mark_phase_enum)
+                   new_rel (h->u.def.value, h->u.def.section);
+                 else
                    einfo (_("%X%S: unresolvable symbol `%s'"
                             " referenced in expression\n"),
                           tree, tree->name.name);
@@ -882,7 +884,7 @@ exp_fold_tree_1 (etree_type *tree)
 
          exp_fold_tree_1 (tree->assign.src);
          if (expld.result.valid_p
-             || (expld.phase == lang_first_phase_enum
+             || (expld.phase <= lang_mark_phase_enum
                  && tree->type.node_class == etree_assign
                  && tree->assign.hidden))
            {
index fc7485fc5886425b2a2ab8c9fe08c577c15f01b5..586dd13f626c240d4cb68d1315f74e15e53d37b5 100644 (file)
@@ -94,11 +94,19 @@ typedef union etree_union {
   } assert_s;
 } etree_type;
 
-typedef enum {
+/* Expression evaluation control.  */
+typedef enum
+{
+  /* Parsing linker script.  Will only return "valid" for expressions
+     that evaluate to a constant.  */
   lang_first_phase_enum,
+  /* Prior to section sizing.  */
   lang_mark_phase_enum,
+  /* During section sizing.  */
   lang_allocating_phase_enum,
+  /* During assignment of symbol values when relaxation in progress.  */
   lang_assigning_phase_enum,
+  /* Final assignment of symbol values.  */
   lang_final_phase_enum
 } lang_phase_type;
 
index 5f064182d49e0c73862657e3eda54c5bdbad8853..1bffa937c6f7c1ddd5f4c75f8f4da02661d30c4a 100644 (file)
@@ -6650,6 +6650,11 @@ lang_process (void)
      files.  */
   ldctor_build_sets ();
 
+  /* PR 13683: We must rerun the assignments prior to running garbage
+     collection in order to make sure that all symbol aliases are resolved.  */
+  lang_do_assignments (lang_mark_phase_enum);
+  expld.phase = lang_first_phase_enum;
+
   /* Remove unreferenced sections if asked to.  */
   lang_gc_sections ();
 
index 260a20170ca8c2f015e738ad435b52cb74c1fb40..5845e8c573ffbd123b2fff8db4a9f61cc39d0933 100644 (file)
@@ -1,3 +1,18 @@
+2012-02-22  Nick Clifton  <nickc@redhat.com>
+
+       PR ld/13683
+       * ld-gc/pr13683.c: New test source file.
+       * ld-gc/pr13683.d: New test control and output file.
+       * ld-gc/gc.exp: Run the pr13683 test.
+
+       * ld-cris/tls-gc-68: Update expected symbol table dump.
+       * ld-cris/tls-gc-69: Likewise.
+       * ld-cris/tls-gc-70: Likewise.
+       * ld-cris/tls-gc-71: Likewise.
+       * ld-cris/tls-gc-75: Likewise.
+       * ld-cris/tls-gc-76.d: Likewise.
+       * ld-cris/tls-gc-79.d: Likewise.
+
 2012-02-20  Thomas Schwinge <thomas@schwinge.name>
 
        * ld-elf/comm-data.exp: Run for *-*-gnu*.
index 60fcc3be108d1aee84701a028537be1f25e5e1a1..4b639913cb30d2a81726b978579417e69f9e6204 100644 (file)
@@ -21,11 +21,11 @@ private flags = 0:
 SYMBOL TABLE:
 0+80074 l    d  .text  0+ .text
 0+82078 l    d  .got   0+ .got
+0+82084 l       \*ABS\*        0+ __bss_start
+0+82084 l       \*ABS\*        0+ _edata
 0+82078 l     O .got   0+ _GLOBAL_OFFSET_TABLE_
+0+820a0 l       \*ABS\*        0+ _end
 0+80074 g       .text  0+ _start
-0+82084 g       \*ABS\*        0+ __bss_start
-0+82084 g       \*ABS\*        0+ _edata
-0+820a0 g       \*ABS\*        0+ _end
 
 Contents of section .text:
  80074 41b20+                             .*
index e547ba4aa0f1d905803c23f8a57c514145baa968..f14deec520f6261c72e29f04b86e95d681ae53f0 100644 (file)
@@ -22,11 +22,11 @@ private flags = 0:
 SYMBOL TABLE:
 0+80074 l    d  .text  0+ .text
 0+82078 l    d  .got   0+ .got
+0+82084 l       \*ABS\*        0+ __bss_start
+0+82084 l       \*ABS\*        0+ _edata
 0+82078 l     O .got   0+ _GLOBAL_OFFSET_TABLE_
+0+820a0 l       \*ABS\*        0+ _end
 0+80074 g       .text  0+ _start
-0+82084 g       \*ABS\*        0+ __bss_start
-0+82084 g       \*ABS\*        0+ _edata
-0+820a0 g       \*ABS\*        0+ _end
 
 Contents of section .text:
  80074 41b20+                             .*
index d8d5324f5cfbdcc01254a31e75dfb6b727d1d6b9..dbeb9d0707fe1be29eeed0fb8d0907ea507de51b 100644 (file)
@@ -22,11 +22,11 @@ private flags = 0:
 SYMBOL TABLE:
 0+80074 l    d  .text  0+ .text
 0+82078 l    d  .got   0+ .got
+0+82084 l       \*ABS\*        0+ __bss_start
+0+82084 l       \*ABS\*        0+ _edata
 0+82078 l     O .got   0+ _GLOBAL_OFFSET_TABLE_
+0+820a0 l       \*ABS\*        0+ _end
 0+80074 g       .text  0+ _start
-0+82084 g       \*ABS\*        0+ __bss_start
-0+82084 g       \*ABS\*        0+ _edata
-0+820a0 g       \*ABS\*        0+ _end
 
 Contents of section .text:
  80074 41b20+                             .*
index 3ee73fc3af7b7cd720d1409f2feaf54da8d28596..29745de7359aadc7ff11c549098557a210c43711 100644 (file)
 DYNAMIC SYMBOL TABLE:
 0+18e l    d  .text    0+ .text
 0+2194 l    d  .tdata  0+ .tdata
+0+2280 l    D  \*ABS\* 0+ __bss_start
+0+2280 l    D  \*ABS\* 0+ _edata
+0+2280 l    D  \*ABS\* 0+ _end
 0+18e g    DF .text    0+2 _init
-0+2280 g    D  \*ABS\* 0+ __bss_start
 0+ g    D  .tdata      0+80 tls128
-0+2280 g    D  \*ABS\* 0+ _edata
-0+2280 g    D  \*ABS\* 0+ _end
 
 DYNAMIC RELOCATION RECORDS \(none\)
 #...
index 2f4257e161dd3a743a2e37dc7ee0381068b5dadd..b1c77bfc67f06dd8b6f6a49491cc4c4ff1a5ccc6 100644 (file)
@@ -24,11 +24,11 @@ private flags = 0:
 SYMBOL TABLE:
 0+80074 l    d  .text  0+ .text
 0+82078 l    d  .got   0+ .got
+0+82084 l       \*ABS\*        0+ __bss_start
+0+82084 l       \*ABS\*        0+ _edata
 0+82078 l     O .got   0+ _GLOBAL_OFFSET_TABLE_
+0+820a0 l       \*ABS\*        0+ _end
 0+80074 g       .text  0+ _start
-0+82084 g       \*ABS\*        0+ __bss_start
-0+82084 g       \*ABS\*        0+ _edata
-0+820a0 g       \*ABS\*        0+ _end
 
 Contents of section .text:
  80074 41b20+                             .*
index f3c78df681c5ac93b20900eded4bcba0702a5ed1..52387275e212304d9795b866de50ab317a61aace 100644 (file)
@@ -23,11 +23,11 @@ SYMBOL TABLE:
 0+82080 l    d  .got   0+ .got
 0+82090 l    d  .data  0+ .data
 0+82090 l     O .data  0+4 gc76var
+0+82094 l       \*ABS\*        0+ __bss_start
+0+82094 l       \*ABS\*        0+ _edata
 0+82080 l     O .got   0+ _GLOBAL_OFFSET_TABLE_
+0+820a0 l       \*ABS\*        0+ _end
 0+80074 g       .text  0+ _start
-0+82094 g       \*ABS\*        0+ __bss_start
-0+82094 g       \*ABS\*        0+ _edata
-0+820a0 g       \*ABS\*        0+ _end
 0+80078 g     F .text  0+6 gc76fn
 
 Contents of section .text:
index 210f4789ef14987a212d42ccb8df9aaccac48634..eb3646d652ad3c1f713bd94f3a97b6e841376793 100644 (file)
@@ -22,11 +22,11 @@ private flags = 0:
 SYMBOL TABLE:
 0+80074 l    d  .text  0+ .text
 0+82078 l    d  .got   0+ .got
+0+82084 l       \*ABS\*        0+ __bss_start
+0+82084 l       \*ABS\*        0+ _edata
 0+82078 l     O .got   0+ _GLOBAL_OFFSET_TABLE_
+0+820a0 l       \*ABS\*        0+ _end
 0+80074 g       .text  0+ _start
-0+82084 g       \*ABS\*        0+ __bss_start
-0+82084 g       \*ABS\*        0+ _edata
-0+820a0 g       \*ABS\*        0+ _end
 
 Contents of section .text:
  80074 41b20+                             .*
index 57f0ec3f7c95ea87036bf0b1b43caf05c508ffdc..d8d34fa6e86ba4445fba5689fb232a525e4b2aa7 100644 (file)
@@ -120,3 +120,8 @@ if { [is_remote host] || [which $CC] != 0 } {
        run_dump_test "pr11218"
     }
 }
+
+if { [is_remote host] || [which $CC] != 0 } {
+       ld_compile "$CC $CFLAGS $cflags" $srcdir/$subdir/pr13683.c tmpdir/pr13683.o
+       run_dump_test "pr13683"
+}
diff --git a/ld/testsuite/ld-gc/pr13683.c b/ld/testsuite/ld-gc/pr13683.c
new file mode 100644 (file)
index 0000000..c585e06
--- /dev/null
@@ -0,0 +1,28 @@
+void foo(void);\r
+\r
+int main(void)\r
+{\r
+   foo ();\r
+\r
+   for (;;)\r
+       ;\r
+}\r
+\r
+int a;\r
+\r
+void foo1(void)\r
+{\r
+       a = 1;\r
+}\r
+\r
+void foo2(void)\r
+{\r
+       a = 2;\r
+}\r
+\r
+void foo3(void)\r
+{\r
+       a = 3;\r
+}\r
+\r
+\r
diff --git a/ld/testsuite/ld-gc/pr13683.d b/ld/testsuite/ld-gc/pr13683.d
new file mode 100644 (file)
index 0000000..31aaee4
--- /dev/null
@@ -0,0 +1,12 @@
+#name: --gc-sections with --defsym
+#source: dummy.s
+#ld: --gc-sections -e main --defsym foo=foo2 tmpdir/pr13683.o
+#nm: --format=bsd
+#xfail: sh64*-*-* iq2000-*-* lm32-*-* epiphany-*-* mips64vr-*-* frv-*-* m32c-*-* rl78-*-* rx-*-* sh-*-*
+
+# Note - look for both "foo" and "foo2" being defined, non-zero function symbols
+
+#...
+0+[1-9a-f]+[0-9a-f]*[  ]T[     ]_*foo
+0+[1-9a-f]+[0-9a-f]*[  ]T[     ]_*foo2
+#...