diff options
author | Jason W Kim <jason.w.kim.2009@gmail.com> | 2010-12-08 23:14:44 +0000 |
---|---|---|
committer | Jason W Kim <jason.w.kim.2009@gmail.com> | 2010-12-08 23:14:44 +0000 |
commit | a0871e79270b2a05f93c9df73bbe24c587faa94e (patch) | |
tree | 3573415ed7aa63cb80652cc63cd59fac3bf124ee /lib/MC/ELFObjectWriter.cpp | |
parent | 7685ff84ada08d63c8b67618d54ab7eb1fcae365 (diff) |
ARM/MC/ELF TPsoft is now a proper pseudo inst.
Added test to check bl __aeabi_read_tp gets emitted properly for ELF/ASM
as well as ELF/OBJ (including fixup)
Also added support for ELF::R_ARM_TLS_IE32
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121312 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 4e0d5ed395..0b4d042881 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -1533,6 +1533,7 @@ unsigned ARMELFObjectWriter::GetRelocType(const MCValue &Target, MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind(); + unsigned Type = 0; if (IsPCRel) { switch (Modifier) { default: assert(0 && "Unimplemented Modifier"); @@ -1540,11 +1541,17 @@ unsigned ARMELFObjectWriter::GetRelocType(const MCValue &Target, } switch ((unsigned)Fixup.getKind()) { default: assert(0 && "Unimplemented"); - case ARM::fixup_arm_branch: return ELF::R_ARM_CALL; break; + case ARM::fixup_arm_branch: Type = ELF::R_ARM_CALL; break; } } else { switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); + case FK_Data_4: + switch (Modifier) { + default: llvm_unreachable("Unsupported Modifier"); + case MCSymbolRefExpr::VK_ARM_GOTTPOFF: + Type = ELF::R_ARM_TLS_IE32; + } break; case ARM::fixup_arm_ldst_pcrel_12: case ARM::fixup_arm_pcrel_10: case ARM::fixup_arm_adr_pcrel_12: @@ -1553,17 +1560,18 @@ unsigned ARMELFObjectWriter::GetRelocType(const MCValue &Target, case ARM::fixup_arm_thumb_cp: assert(0 && "Unimplemented"); break; case ARM::fixup_arm_branch: - return ELF::R_ARM_CALL; break; + Type = ELF::R_ARM_CALL; break; case ARM::fixup_arm_movt_hi16: - return ELF::R_ARM_MOVT_ABS; break; + Type = ELF::R_ARM_MOVT_ABS; break; case ARM::fixup_arm_movw_lo16: - return ELF::R_ARM_MOVW_ABS_NC; break; + Type = ELF::R_ARM_MOVW_ABS_NC; break; } } if (RelocNeedsGOT(Modifier)) NeedsGOT = true; - return -1; + + return Type; } //===- MBlazeELFObjectWriter -------------------------------------------===// |