diff options
-rw-r--r-- | llvm/include/llvm/MC/MCExpr.h | 1 | ||||
-rw-r--r-- | llvm/lib/MC/MCExpr.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | 4 | ||||
-rw-r--r-- | llvm/test/MC/ARM/arm-elf-relocation-diagnostics.s | 27 | ||||
-rw-r--r-- | llvm/test/MC/ARM/arm-elf-relocations.s | 10 |
6 files changed, 47 insertions, 0 deletions
diff --git a/llvm/include/llvm/MC/MCExpr.h b/llvm/include/llvm/MC/MCExpr.h index f0e8611bff8..bd9b2bc4751 100644 --- a/llvm/include/llvm/MC/MCExpr.h +++ b/llvm/include/llvm/MC/MCExpr.h @@ -194,6 +194,7 @@ public: VK_ARM_TARGET1, VK_ARM_TARGET2, VK_ARM_PREL31, + VK_ARM_SBREL, // symbol(sbrel) VK_ARM_TLSLDO, // symbol(tlsldo) VK_ARM_TLSCALL, // symbol(tlscall) VK_ARM_TLSDESC, // symbol(tlsdesc) diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp index a1b0236e8bb..709dc6b413e 100644 --- a/llvm/lib/MC/MCExpr.cpp +++ b/llvm/lib/MC/MCExpr.cpp @@ -197,6 +197,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) { case VK_ARM_TARGET1: return "target1"; case VK_ARM_TARGET2: return "target2"; case VK_ARM_PREL31: return "prel31"; + case VK_ARM_SBREL: return "sbrel"; case VK_ARM_TLSLDO: return "tlsldo"; case VK_ARM_TLSCALL: return "tlscall"; case VK_ARM_TLSDESC: return "tlsdesc"; @@ -364,6 +365,7 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) { .Case("target1", VK_ARM_TARGET1) .Case("target2", VK_ARM_TARGET2) .Case("prel31", VK_ARM_PREL31) + .Case("sbrel", VK_ARM_SBREL) .Case("tlsldo", VK_ARM_TLSLDO) .Case("tlscall", VK_ARM_TLSCALL) .Case("tlsdesc", VK_ARM_TLSDESC) diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp index c7739b4d792..a821a6b0b53 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp @@ -200,6 +200,9 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, case MCSymbolRefExpr::VK_ARM_PREL31: Type = ELF::R_ARM_PREL31; break; + case MCSymbolRefExpr::VK_ARM_SBREL: + Type = ELF::R_ARM_SBREL32; + break; case MCSymbolRefExpr::VK_ARM_TLSLDO: Type = ELF::R_ARM_TLS_LDO32; break; diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index f9403063dd6..99b5c628f50 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -553,6 +553,10 @@ public: /// necessary. void EmitValueImpl(const MCExpr *Value, unsigned Size, const SMLoc &Loc) override { + if (const MCSymbolRefExpr *SRE = dyn_cast_or_null<MCSymbolRefExpr>(Value)) + if (SRE->getKind() == MCSymbolRefExpr::VK_ARM_SBREL && !(Size == 4)) + getContext().FatalError(Loc, "relocated expression must be 32-bit"); + EmitDataMappingSymbol(); MCELFStreamer::EmitValueImpl(Value, Size); } diff --git a/llvm/test/MC/ARM/arm-elf-relocation-diagnostics.s b/llvm/test/MC/ARM/arm-elf-relocation-diagnostics.s new file mode 100644 index 00000000000..5fe903f7161 --- /dev/null +++ b/llvm/test/MC/ARM/arm-elf-relocation-diagnostics.s @@ -0,0 +1,27 @@ +@ RUN: not llvm-mc -triple armv7-eabi -filetype obj -o - %s 2>&1 \ +@ RUN: | FileCheck %s +@ RUN: not llvm-mc -triple thumbv7-eabi -filetype obj -o - %s 2>&1 \ +@ RUN: | FileCheck %s + + .byte target(sbrel) +@ CHECK: error: relocated expression must be 32-bit +@ CHECK: .byte target(sbrel) +@ CHECK: ^ + +@ TODO: enable these negative test cases +@ .hword target(sbrel) +@ @ CHECK-SBREL-HWORD: error: relocated expression must be 32-bit +@ @ CHECK-SBREL-HWORD: .hword target(sbrel) +@ @ CHECK-SBREL-HWORD: ^ +@ +@ .short target(sbrel) +@ @ CHECK-SBREL-SHORT: error: relocated expression must be 32-bit +@ @ CHECK-SBREL-SHORT: .short target(sbrel) +@ @ CHECK-SBREL-SHORT: ^ +@ +@ .quad target(sbrel) +@ @ CHECK-SBREL-SHORT: error: relocated expression must be 32-bit +@ @ CHECK-SBREL-SHORT: .quad target(sbrel) +@ @ CHECK-SBREL-SHORT: ^ + + diff --git a/llvm/test/MC/ARM/arm-elf-relocations.s b/llvm/test/MC/ARM/arm-elf-relocations.s index 13d9d2b1e1b..4059591d95b 100644 --- a/llvm/test/MC/ARM/arm-elf-relocations.s +++ b/llvm/test/MC/ARM/arm-elf-relocations.s @@ -25,3 +25,13 @@ @ CHECK: 0x2 R_ARM_ABS16 abs16_1 0x0 @ CHECK: } + .section .text.r_arm_sbrel32 + + .word target(sbrel) + .word target(SBREL) + +@ CHECK: Section {{.*}} .rel.text.r_arm_sbrel32 { +@ CHECK: 0x0 R_ARM_SBREL32 target 0x0 +@ CHECK: 0x4 R_ARM_SBREL32 target 0x0 +@ CHECK: } + |