summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-10-06 16:23:36 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-10-06 16:23:36 +0000
commit8cecf253e45f144b9a7fd0ace85eeeeb0bebfc83 (patch)
tree27be75b8fe0d7b152ec69f7244a4c6d524239b60
parent0dadb15927b912c98918e8a9e7466af77062149f (diff)
downloadllvm-8cecf253e45f144b9a7fd0ace85eeeeb0bebfc83.tar.gz
llvm-8cecf253e45f144b9a7fd0ace85eeeeb0bebfc83.tar.bz2
llvm-8cecf253e45f144b9a7fd0ace85eeeeb0bebfc83.tar.xz
Correctly handle GOTPCREL relocations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115793 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/ELFObjectWriter.cpp9
-rw-r--r--test/MC/ELF/merge.s9
2 files changed, 15 insertions, 3 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index 9f9681ae3e..da3e7efda8 100644
--- a/lib/MC/ELFObjectWriter.cpp
+++ b/lib/MC/ELFObjectWriter.cpp
@@ -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");
}
diff --git a/test/MC/ELF/merge.s b/test/MC/ELF/merge.s
index 227d4140e1..311327ebce 100644
--- a/test/MC/ELF/merge.s
+++ b/test/MC/ELF/merge.s
@@ -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: ])