Fix section relocation for SECTIONREL32 with immediate offset.

Patch by Kai Nacke. This matches the gnu as output.

llvm-svn: 180568
This commit is contained in:
Rafael Espindola 2013-04-25 19:27:05 +00:00
parent 66349b434b
commit e426e8360c
3 changed files with 36 additions and 2 deletions

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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@SECREL32(%rax), %rcx
movq values@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: ]