[PATCH] x86_64: Fix section relocation for SECTIONREL32 with immediate offset

Kai Nacke kai at redstar.de
Wed Apr 24 23:14:41 PDT 2013


Hi Rafael,

it isn't hard. llvm-mc understands the @SECREL32 variant with my new 
patch. I also translated the test case to assembly.

Sorry that I did not check this opportunity before sending my patch.

Regards
Kai

On 25.04.2013 04:50, Rafael EspĂ­ndola wrote:
>> The attached test case is a .ll file because llvm-mc does not support
>> @SECTIONREL32.
> Would that be too hard to add? It would be much better if we could
> test this with assembly.
>
> Assembling
>
>      movq    values at SECREL32(%rax), %rcx
>      movq    values at SECREL32+8(%rax), %rax
>
> with gas and then running llvm-reoadobj -r I got
>
>      0x3 IMAGE_REL_AMD64_SECREL values
>      0xA IMAGE_REL_AMD64_SECREL values
>
> Cheers,
> Rafael
>

-------------- next part --------------
diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp
index d54c264..6cde26c 100644
--- a/lib/MC/MCExpr.cpp
+++ b/lib/MC/MCExpr.cpp
@@ -288,6 +288,8 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
     .Case("tlvp", VK_TLVP)
     .Case("IMGREL", VK_COFF_IMGREL32)
     .Case("imgrel", VK_COFF_IMGREL32)
+    .Case("SECREL32", VK_SECREL)
+    .Case("secrel32", VK_SECREL)
     .Default(VK_Invalid);
 }
 
diff --git a/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
index 182bec1..016af71 100644
--- a/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
+++ b/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
@@ -237,6 +237,14 @@ StartsWithGlobalOffsetTable(const MCExpr *Expr) {
   return GOT_Normal;
 }
 
+static bool HasSecRelSymbolRef(const MCExpr *Expr) {
+  if (Expr->getKind() == MCExpr::SymbolRef) {
+    const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Expr);
+    return Ref->getKind() == MCSymbolRefExpr::VK_SECREL;
+  }
+  return false;
+}
+
 void X86MCCodeEmitter::
 EmitImmediate(const MCOperand &DispOp, SMLoc Loc, unsigned Size,
               MCFixupKind FixupKind, unsigned &CurByte, raw_ostream &OS,
@@ -268,8 +276,13 @@ EmitImmediate(const MCOperand &DispOp, SMLoc Loc, unsigned Size,
       if (Kind == GOT_Normal)
         ImmOffset = CurByte;
     } else if (Expr->getKind() == MCExpr::SymbolRef) {
-      const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Expr);
-      if (Ref->getKind() == MCSymbolRefExpr::VK_SECREL) {
+      if (HasSecRelSymbolRef(Expr)) {
+        FixupKind = MCFixupKind(FK_SecRel_4);
+      }
+    } else if (Expr->getKind() == MCExpr::Binary) {
+      const MCBinaryExpr *Bin = static_cast<const MCBinaryExpr*>(Expr);
+      if (HasSecRelSymbolRef(Bin->getLHS())
+          || HasSecRelSymbolRef(Bin->getRHS())) {
         FixupKind = MCFixupKind(FK_SecRel_4);
       }
     }
diff --git a/test/MC/COFF/secrel-variant.s b/test/MC/COFF/secrel-variant.s
new file mode 100755
index 0000000..4f1c91c
--- /dev/null
+++ b/test/MC/COFF/secrel-variant.s
@@ -0,0 +1,19 @@
+// COFF section-relative relocations
+
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | llvm-readobj -r | FileCheck %s
+
+.data
+values:
+    .long 1
+    .long 0
+
+.text
+    movq    values at SECREL32(%rax), %rcx
+    movq    values at SECREL32+8(%rax), %rax
+
+// CHECK:      Relocations [
+// CHECK-NEXT:   Section (1) .text {
+// CHECK-NEXT:     0x3 IMAGE_REL_AMD64_SECREL values
+// CHECK-NEXT:     0xA IMAGE_REL_AMD64_SECREL values
+// CHECK-NEXT:   }
+// CHECK-NEXT: ]


More information about the llvm-commits mailing list