[llvm] r206192 - Fix up MCFixup::getAccessVariant to handle unary expressions.

Kaelyn Takata rikka at google.com
Mon Apr 14 09:50:23 PDT 2014


Author: rikka
Date: Mon Apr 14 11:50:22 2014
New Revision: 206192

URL: http://llvm.org/viewvc/llvm-project?rev=206192&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/MC/MCFixup.cpp
    llvm/trunk/test/MC/ELF/relocation.s

Modified: llvm/trunk/lib/MC/MCFixup.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCFixup.cpp?rev=206192&r1=206191&r2=206192&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCFixup.cpp (original)
+++ llvm/trunk/lib/MC/MCFixup.cpp Mon Apr 14 11:50:22 2014
@@ -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");
 

Modified: llvm/trunk/test/MC/ELF/relocation.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/relocation.s?rev=206192&r1=206191&r2=206192&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/relocation.s (original)
+++ llvm/trunk/test/MC/ELF/relocation.s Mon Apr 14 11:50:22 2014
@@ -28,6 +28,8 @@ bar:
 	zed = foo +2
 	call zed at 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:   }
 





More information about the llvm-commits mailing list