summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorKaelyn Takata <rikka@google.com>2014-04-14 16:50:22 +0000
committerKaelyn Takata <rikka@google.com>2014-04-14 16:50:22 +0000
commitf9d483128cae3b4b11923d3477752dc92e9decb2 (patch)
treee8f15c00dfc5005fa5dc541363f63535e577e5a9 /llvm
parent95d570335ce3ce35519073732dc185eeb701823f (diff)
downloadbcm5719-llvm-f9d483128cae3b4b11923d3477752dc92e9decb2.tar.gz
bcm5719-llvm-f9d483128cae3b4b11923d3477752dc92e9decb2.zip
Fix up MCFixup::getAccessVariant to handle unary expressions.
This allows correct relocations to be generated for a symbolic address that is being adjusted by a negative constant. Since r204294, such expressions have triggered undefined behavior when LLVM was built without assertions. Credit goes to Rafael for this patch; I'm submitting it on his behalf as he is on vacation this week. llvm-svn: 206192
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/MC/MCFixup.cpp7
-rw-r--r--llvm/test/MC/ELF/relocation.s3
2 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/MC/MCFixup.cpp b/llvm/lib/MC/MCFixup.cpp
index 8f15db571f3..dab4197b1a4 100644
--- a/llvm/lib/MC/MCFixup.cpp
+++ b/llvm/lib/MC/MCFixup.cpp
@@ -12,7 +12,12 @@ using namespace llvm;
static MCSymbolRefExpr::VariantKind getAccessVariant(const MCExpr *Expr) {
switch (Expr->getKind()) {
- case MCExpr::Unary:
+ case MCExpr::Unary: {
+ const MCUnaryExpr *UE = cast<MCUnaryExpr>(Expr);
+ assert(getAccessVariant(UE->getSubExpr()) == MCSymbolRefExpr::VK_None);
+ return MCSymbolRefExpr::VK_None;
+ }
+
case MCExpr::Target:
llvm_unreachable("unsupported");
diff --git a/llvm/test/MC/ELF/relocation.s b/llvm/test/MC/ELF/relocation.s
index d2ee6afda36..7755f06f3f4 100644
--- a/llvm/test/MC/ELF/relocation.s
+++ b/llvm/test/MC/ELF/relocation.s
@@ -28,6 +28,8 @@ bar:
zed = foo +2
call zed@PLT
+ leaq -1+foo(%rip), %r11
+
// CHECK: Section {
// CHECK: Name: .rela.text
// CHECK: Relocations [
@@ -53,6 +55,7 @@ bar:
// CHECK-NEXT: 0x8D R_X86_64_PC16 foo 0x8D
// CHECK-NEXT: 0x8F R_X86_64_PC8 foo 0x8F
// CHECK-NEXT: 0x91 R_X86_64_PLT32 foo 0xFFFFFFFFFFFFFFFE
+// CHECK-NEXT: 0x98 R_X86_64_PC32 foo 0xFFFFFFFFFFFFFFFB
// CHECK-NEXT: ]
// CHECK-NEXT: }
OpenPOWER on IntegriCloud