From 843fa74d3851e93abf5f534f9a98021282ab3dbd Mon Sep 17 00:00:00 2001 From: Kai Nacke Date: Mon, 20 Jan 2014 11:00:40 +0000 Subject: [PATCH] ARM: add tlsldo relocation Add support for the symbol(tlsldo) relocation. This is required in order to solve PR18554. Reviewed by R. Golin, A. Korobeynikov. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199644 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCExpr.h | 1 + lib/MC/MCExpr.cpp | 3 +++ lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp | 3 +++ test/MC/ARM/symbol-variants.s | 5 +++++ 4 files changed, 12 insertions(+) diff --git a/include/llvm/MC/MCExpr.h b/include/llvm/MC/MCExpr.h index 3052de112fa..f556d6237ff 100644 --- a/include/llvm/MC/MCExpr.h +++ b/include/llvm/MC/MCExpr.h @@ -165,6 +165,7 @@ public: VK_ARM_TARGET1, VK_ARM_TARGET2, VK_ARM_PREL31, + VK_ARM_TLSLDO, // symbol(tlsldo) VK_PPC_LO, // symbol@l VK_PPC_HI, // symbol@h diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp index 69cdfa35440..2052d55dc7e 100644 --- a/lib/MC/MCExpr.cpp +++ b/lib/MC/MCExpr.cpp @@ -184,6 +184,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_TLSLDO: return "tlsldo"; case VK_PPC_LO: return "l"; case VK_PPC_HI: return "h"; case VK_PPC_HA: return "ha"; @@ -405,6 +406,8 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) { .Case("target2", VK_ARM_TARGET2) .Case("PREL31", VK_ARM_PREL31) .Case("prel31", VK_ARM_PREL31) + .Case("TLSLDO", VK_ARM_TLSLDO) + .Case("tlsldo", VK_ARM_TLSLDO) .Default(VK_Invalid); } diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp index 72ac6e22e8d..6fcc021a6c7 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp @@ -250,6 +250,9 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, case MCSymbolRefExpr::VK_ARM_PREL31: Type = ELF::R_ARM_PREL31; break; + case MCSymbolRefExpr::VK_ARM_TLSLDO: + Type = ELF::R_ARM_TLS_LDO32; + break; } break; case ARM::fixup_arm_ldst_pcrel_12: diff --git a/test/MC/ARM/symbol-variants.s b/test/MC/ARM/symbol-variants.s index d24d5c790fb..1ab504cf655 100644 --- a/test/MC/ARM/symbol-variants.s +++ b/test/MC/ARM/symbol-variants.s @@ -65,3 +65,8 @@ bl f05(plt) @CHECK: 72 R_ARM_PREL31 f18 @CHECK: 76 R_ARM_PREL31 f19 +@ tlsldo +.word f20(TLSLDO) +.word f21(tlsldo) +@CHECK: 80 R_ARM_TLS_LDO32 f20 +@CHECK: 84 R_ARM_TLS_LDO32 f21 -- 2.34.1