Correctly handle GOTPCREL relocations.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 6 Oct 2010 16:23:36 +0000 (16:23 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 6 Oct 2010 16:23:36 +0000 (16:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115793 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/merge.s

index 9f9681ae3efc3a646fc2fcbcaf05689bc47291c6..da3e7efda8be7275b8c6bc097c314c7d106b2891 100644 (file)
@@ -544,12 +544,12 @@ static bool ShouldRelocOnSymbol(const MCSymbolData &SD,
   if (SD.isExternal())
     return true;
 
-  const llvm::MCSymbolRefExpr& Ref = *Target.getSymA();
+  MCSymbolRefExpr::VariantKind Kind = Target.getSymA()->getKind();
   const MCSectionELF &Sec2 =
     static_cast<const MCSectionELF&>(F.getParent()->getSection());
 
-  if (Ref.getKind() == MCSymbolRefExpr::VK_PLT &&
-      &Sec2 != &Section)
+  if (&Sec2 != &Section &&
+      (Kind == MCSymbolRefExpr::VK_PLT || Kind == MCSymbolRefExpr::VK_GOTPCREL))
     return true;
 
   return false;
@@ -648,6 +648,9 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
         case MCSymbolRefExpr::VK_GOT:
           Type = ELF::R_X86_64_GOT32;
           break;
+        case llvm::MCSymbolRefExpr::VK_GOTPCREL:
+          Type = ELF::R_X86_64_GOTPCREL;
+          break;
         default:
           llvm_unreachable("Unimplemented");
         }
index 227d4140e16d571774b1c5de4feba47e729732a0..311327ebcea43b02f2dc1557b2254ab87b0db7f0 100644 (file)
@@ -11,6 +11,7 @@
         movl   $.Lfoo, %edi
         movl   $.Lfoo+2, %edi
         jmp    foo@PLT
+        movq   foo@GOTPCREL, %rax
 
         .section        .sec1,"aM",@progbits,16
 .Lfoo:
@@ -70,4 +71,12 @@ foo:
 // CHECK-NEXT:    ('r_type', 4
 // CHECK-NEXT:    ('r_addend',
 // CHECK-NEXT:   ),
+
+// Relocation 4 refers to symbol 2
+// CHECK-NEXT:   # Relocation 4
+// CHECK-NEXT:   (('r_offset',
+// CHECK-NEXT:    ('r_sym', 2)
+// CHECK-NEXT:    ('r_type', 9
+// CHECK-NEXT:    ('r_addend',
+// CHECK-NEXT:   ),
 // CHECK-NEXT:  ])