This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix an internal error in the constructor of Target_arm.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ee7ef219cbfbcf9217b50c4d30e719e2a6182a71

commit ee7ef219cbfbcf9217b50c4d30e719e2a6182a71
Author: Igor Kudrin <ikudrin@accesssoftek.com>
Date:   Mon Dec 19 15:23:59 2016 -0800

    Fix an internal error in the constructor of Target_arm.
    
    gold/
    	* arm.cc (Target_arm::Target_arm): Move initialization code ...
    	(Target_arm::do_select_as_default_target): ... to here.
    	* testsuite/Makefile.am (arm_target_lazy_init): New test case.
    	* testsuite/Makefile.in: Regenerate.
    	* testsuite/arm_target_lazy_init.s: New source file.
    	* testsuite/arm_target_lazy_init.t: New linker script.

Diff:
---
 gold/ChangeLog                        |  9 +++++++
 gold/arm.cc                           | 51 +++++++++++++++++------------------
 gold/testsuite/Makefile.am            |  8 ++++++
 gold/testsuite/Makefile.in            | 12 +++++++--
 gold/testsuite/arm_target_lazy_init.s |  2 ++
 gold/testsuite/arm_target_lazy_init.t |  1 +
 6 files changed, 55 insertions(+), 28 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index a9ead08..faccdfb 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2016-12-19  Igor Kudrin  <ikudrin@accesssoftek.com>
+
+	* arm.cc (Target_arm::Target_arm): Move initialization code ...
+	(Target_arm::do_select_as_default_target): ... to here.
+	* testsuite/Makefile.am (arm_target_lazy_init): New test case.
+	* testsuite/Makefile.in: Regenerate.
+	* testsuite/arm_target_lazy_init.s: New source file.
+	* testsuite/arm_target_lazy_init.t: New linker script.
+
 2016-12-19  Cary Coutant  <ccoutant@gmail.com>
 
 	PR gold/20976
diff --git a/gold/arm.cc b/gold/arm.cc
index ea20c37..d1361aa 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -2132,32 +2132,7 @@ class Target_arm : public Sized_target<32, big_endian>
       target1_reloc_(elfcpp::R_ARM_ABS32),
       // This can be any reloc type but usually is R_ARM_GOT_PREL.
       target2_reloc_(elfcpp::R_ARM_GOT_PREL)
-  {
-    if (parameters->options().user_set_target1_rel())
-      {
-	// FIXME: This is not strictly compatible with ld, which allows both
-	// --target1-abs and --target-rel to be given.
-	if (parameters->options().user_set_target1_abs())
-	  gold_error(_("Cannot use both --target1-abs and --target1-rel."));
-	else
-	  this->target1_reloc_ = elfcpp::R_ARM_REL32;
-      }
-    // We don't need to handle --target1-abs because target1_reloc_ is set
-    // to elfcpp::R_ARM_ABS32 in the member initializer list.
-
-    if (parameters->options().user_set_target2())
-      {
-	const char* target2 = parameters->options().target2();
-	if (strcmp(target2, "rel") == 0)
-	  this->target2_reloc_ = elfcpp::R_ARM_REL32;
-	else if (strcmp(target2, "abs") == 0)
-	  this->target2_reloc_ = elfcpp::R_ARM_ABS32;
-	else if (strcmp(target2, "got-rel") == 0)
-	  this->target2_reloc_ = elfcpp::R_ARM_GOT_PREL;
-	else
-	  gold_unreachable();
-      }
-  }
+  { }
 
   // Whether we force PCI branch veneers.
   bool
@@ -2571,6 +2546,30 @@ class Target_arm : public Sized_target<32, big_endian>
     // as the default.
     gold_assert(arm_reloc_property_table == NULL);
     arm_reloc_property_table = new Arm_reloc_property_table();
+    if (parameters->options().user_set_target1_rel())
+      {
+	// FIXME: This is not strictly compatible with ld, which allows both
+	// --target1-abs and --target-rel to be given.
+	if (parameters->options().user_set_target1_abs())
+	  gold_error(_("Cannot use both --target1-abs and --target1-rel."));
+	else
+	  this->target1_reloc_ = elfcpp::R_ARM_REL32;
+      }
+    // We don't need to handle --target1-abs because target1_reloc_ is set
+    // to elfcpp::R_ARM_ABS32 in the member initializer list.
+
+    if (parameters->options().user_set_target2())
+      {
+	const char* target2 = parameters->options().target2();
+	if (strcmp(target2, "rel") == 0)
+	  this->target2_reloc_ = elfcpp::R_ARM_REL32;
+	else if (strcmp(target2, "abs") == 0)
+	  this->target2_reloc_ = elfcpp::R_ARM_ABS32;
+	else if (strcmp(target2, "got-rel") == 0)
+	  this->target2_reloc_ = elfcpp::R_ARM_GOT_PREL;
+	else
+	  gold_unreachable();
+      }
   }
 
   // Virtual function which is set to return true by a target if
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index ab743c7..0e6f5d1 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -3721,6 +3721,14 @@ arm_target2.o: arm_target2.s
 MOSTLYCLEANFILES += arm_target1_abs arm_target1_rel \
 		    arm_target2_rel arm_target2_abs arm_target2_got_rel
 
+# The test demonstrates why the constructor of a target object should not access options.
+check_DATA += arm_target_lazy_init
+MOSTLYCLEANFILES += arm_target_lazy_init
+arm_target_lazy_init: arm_target_lazy_init.o arm_target_lazy_init.t ../ld-new
+	../ld-new -T $(srcdir)/arm_target_lazy_init.t -o $@ $<
+arm_target_lazy_init.o: arm_target_lazy_init.s
+	$(TEST_AS) -EL -o $@ $<
+
 endif DEFAULT_TARGET_ARM
 
 if DEFAULT_TARGET_AARCH64
diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
index 5de841a..fe9d419 100644
--- a/gold/testsuite/Makefile.in
+++ b/gold/testsuite/Makefile.in
@@ -854,6 +854,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_rel.sh \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_abs.sh \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_got_rel.sh
+
+# The test demonstrates why the constructor of a target object should not access options.
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_93 = arm_abs_global.stdout \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_bl_in_range.stdout \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_bl_out_of_range.stdout \
@@ -903,7 +905,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target1_rel.stdout \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_rel.stdout \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_abs.stdout \
-@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_got_rel.stdout
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_got_rel.stdout \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target_lazy_init
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_94 = arm_abs_global \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_bl_in_range \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_bl_out_of_range \
@@ -951,7 +954,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target1_rel \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_rel \
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_abs \
-@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_got_rel
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target2_got_rel \
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	arm_target_lazy_init
 @DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_95 = aarch64_reloc_none.sh \
 @DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	aarch64_relocs.sh
 @DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_96 = aarch64_reloc_none.stdout \
@@ -7763,6 +7767,10 @@ uninstall-am:
 
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_target2.o: arm_target2.s
 @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	$(TEST_AS) -o $@ $<
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_target_lazy_init: arm_target_lazy_init.o arm_target_lazy_init.t ../ld-new
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	../ld-new -T $(srcdir)/arm_target_lazy_init.t -o $@ $<
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_target_lazy_init.o: arm_target_lazy_init.s
+@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	$(TEST_AS) -EL -o $@ $<
 @DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@aarch64_reloc_none.o: aarch64_reloc_none.s
 @DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@	$(TEST_AS) -o $@ $<
 @DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@aarch64_reloc_none: aarch64_reloc_none.o ../ld-new
diff --git a/gold/testsuite/arm_target_lazy_init.s b/gold/testsuite/arm_target_lazy_init.s
new file mode 100644
index 0000000..d1836f2
--- /dev/null
+++ b/gold/testsuite/arm_target_lazy_init.s
@@ -0,0 +1,2 @@
+.text
+	nop
diff --git a/gold/testsuite/arm_target_lazy_init.t b/gold/testsuite/arm_target_lazy_init.t
new file mode 100644
index 0000000..afefae4
--- /dev/null
+++ b/gold/testsuite/arm_target_lazy_init.t
@@ -0,0 +1 @@
+OUTPUT_FORMAT("elf32-littlearm")


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]