2010-09-17 Doug Kwan <dougkwan@google.com>
authorDoug Kwan <dougkwan@google.com>
Fri, 17 Sep 2010 23:51:42 +0000 (23:51 +0000)
committerDoug Kwan <dougkwan@google.com>
Fri, 17 Sep 2010 23:51:42 +0000 (23:51 +0000)
* arm.cc (Target_arm::Relocate::relocate): Ignore symbol type and
defintion if relocation uses GOT entries of the symbol.
* testsuite/icf_safe_test.sh: Fix test.
* testsuite/icf_safe_so_test.sh: Fix test.

gold/ChangeLog
gold/arm.cc
gold/testsuite/icf_safe_so_test.sh
gold/testsuite/icf_safe_test.sh

index 5df7be549829c4d0cd72fe5a3a5dee5fca392c3d..4fb82b77cf57366098ea7936c57ac1db08c2f951 100644 (file)
@@ -1,3 +1,10 @@
+2010-09-17  Doug Kwan  <dougkwan@google.com>
+
+       * arm.cc (Target_arm::Relocate::relocate): Ignore symbol type and
+       defintion if relocation uses GOT entries of the symbol.
+       * testsuite/icf_safe_test.sh: Fix test.
+       * testsuite/icf_safe_so_test.sh: Fix test.
+
 2010-09-16  Cary Coutant  <ccoutant@google.com>
 
        * script_sections.cc (class Memory_region): Remove "NULL" from
index 79a96633d4868bd589caa4b4841942738eff4bdf..d6590f0da5b100ef7f7c9b690b9852307599e412 100644 (file)
@@ -8582,7 +8582,46 @@ Target_arm<big_endian>::Relocate::relocate(
   Arm_address thumb_bit = 0;
   Symbol_value<32> symval;
   bool is_weakly_undefined_without_plt = false;
-  if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
+  bool have_got_offset = false;
+  unsigned int got_offset = 0;
+
+  // If the relocation uses the GOT entry of a symbol instead of the symbol
+  // itself, we don't care about whether the symbol is defined or what kind
+  // of symbol it is.
+  if (reloc_property->uses_got_entry())
+    {
+      // Get the GOT offset.
+      // The GOT pointer points to the end of the GOT section.
+      // We need to subtract the size of the GOT section to get
+      // the actual offset to use in the relocation.
+      // TODO: We should move GOT offset computing code in TLS relocations
+      // to here.
+      switch (r_type)
+       {
+       case elfcpp::R_ARM_GOT_BREL:
+       case elfcpp::R_ARM_GOT_PREL:
+         if (gsym != NULL)
+           {
+             gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
+             got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
+                           - target->got_size());
+           }
+         else
+           {
+             unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
+             gold_assert(object->local_has_got_offset(r_sym,
+                                                      GOT_TYPE_STANDARD));
+             got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
+                           - target->got_size());
+           }
+         have_got_offset = true;
+         break;
+
+       default:
+         break;
+       }
+    }
+  else if (relnum != Target_arm<big_endian>::fake_relnum_for_stubs)
     {
       if (gsym != NULL)
        {
@@ -8651,36 +8690,6 @@ Target_arm<big_endian>::Relocate::relocate(
       psymval = &symval;
     } 
 
-  // Get the GOT offset if needed.
-  // The GOT pointer points to the end of the GOT section.
-  // We need to subtract the size of the GOT section to get
-  // the actual offset to use in the relocation.
-  bool have_got_offset = false;
-  unsigned int got_offset = 0;
-  switch (r_type)
-    {
-    case elfcpp::R_ARM_GOT_BREL:
-    case elfcpp::R_ARM_GOT_PREL:
-      if (gsym != NULL)
-       {
-         gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
-         got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
-                       - target->got_size());
-       }
-      else
-       {
-         unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
-         gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
-         got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
-                       - target->got_size());
-       }
-      have_got_offset = true;
-      break;
-
-    default:
-      break;
-    }
-
   // To look up relocation stubs, we need to pass the symbol table index of
   // a local symbol.
   unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
index 47ad390193819803dda2afa616bcd4c3aa3575a6..315a016953cca1eda8876bdccdaff90bc767a647 100755 (executable)
@@ -84,9 +84,9 @@ arch_specific_safe_fold()
     fi
 }
 
-X86_32_specific_safe_fold()
+X86_32_or_ARM_specific_safe_fold()
 {
-    grep -e "Intel 80386" $1 > /dev/null 2>&1
+    grep -e "Intel 80386" -e "ARM" $1 > /dev/null 2>&1
     arch_specific_safe_fold $? $2 $3 $4
 }
 
@@ -96,10 +96,10 @@ X86_64_specific_safe_fold()
     arch_specific_safe_fold $? $2 $3 $4
 }
 
-X86_32_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_prot" "foo_hidden"
-X86_32_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_prot" "foo_internal"
-X86_32_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_prot" "foo_static"
-X86_32_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_hidden" "foo_internal"
-X86_32_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_hidden" "foo_static"
-X86_32_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_internal" "foo_static"
+X86_32_or_ARM_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_prot" "foo_hidden"
+X86_32_or_ARM_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_prot" "foo_internal"
+X86_32_or_ARM_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_prot" "foo_static"
+X86_32_or_ARM_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_hidden" "foo_internal"
+X86_32_or_ARM_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_hidden" "foo_static"
+X86_32_or_ARM_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout "foo_internal" "foo_static"
 check_nofold icf_safe_so_test_1.stdout "foo_glob" "bar_glob"
index 23e4e295cc2715e4c69e1422cc41011544fe3d2f..d26d40bb91d4c08de0fc01117b2fbe3dacb1c0ac 100755 (executable)
@@ -49,7 +49,7 @@ check_fold()
 
 arch_specific_safe_fold()
 {
-    grep_x86=`grep -q -e "Advanced Micro Devices X86-64" -e "Intel 80386" $2`
+    grep_x86=`grep -q -e "Advanced Micro Devices X86-64" -e "Intel 80386" -e "ARM" $2`
     if [ $? == 0 ];
     then
       check_fold $1 $3 $4