diff options
Diffstat (limited to 'llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp')
| -rw-r--r-- | llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp index 1850b0d8a756..57330dd31f71 100644 --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp @@ -6,7 +6,9 @@ // //===----------------------------------------------------------------------===// +#include "MCTargetDesc/LoongArchFixupKinds.h" #include "MCTargetDesc/LoongArchMCTargetDesc.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCELFObjectWriter.h" #include "llvm/MC/MCFixup.h" @@ -22,13 +24,6 @@ public: ~LoongArchELFObjectWriter() override; - // Return true if the given relocation must be with a symbol rather than - // section plus offset. - bool needsRelocateWithSymbol(const MCSymbol &Sym, - unsigned Type) const override { - return true; - } - protected: unsigned getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const override; @@ -52,9 +47,42 @@ unsigned LoongArchELFObjectWriter::getRelocType(MCContext &Ctx, return Kind - FirstLiteralRelocationKind; switch (Kind) { - // TODO: Implement this when we defined fixup kind. default: + Ctx.reportError(Fixup.getLoc(), "Unsupported relocation type"); + return ELF::R_LARCH_NONE; + case FK_Data_1: + Ctx.reportError(Fixup.getLoc(), "1-byte data relocations not supported"); + return ELF::R_LARCH_NONE; + case FK_Data_2: + Ctx.reportError(Fixup.getLoc(), "2-byte data relocations not supported"); return ELF::R_LARCH_NONE; + case FK_Data_4: + return IsPCRel ? ELF::R_LARCH_32_PCREL : ELF::R_LARCH_32; + case FK_Data_8: + return ELF::R_LARCH_64; + case LoongArch::fixup_loongarch_b16: + return ELF::R_LARCH_B16; + case LoongArch::fixup_loongarch_b21: + return ELF::R_LARCH_B21; + case LoongArch::fixup_loongarch_b26: + return ELF::R_LARCH_B26; + case LoongArch::fixup_loongarch_abs_hi20: + return ELF::R_LARCH_ABS_HI20; + case LoongArch::fixup_loongarch_abs_lo12: + return ELF::R_LARCH_ABS_LO12; + case LoongArch::fixup_loongarch_abs64_lo20: + return ELF::R_LARCH_ABS64_LO20; + case LoongArch::fixup_loongarch_abs64_hi12: + return ELF::R_LARCH_ABS64_HI12; + case LoongArch::fixup_loongarch_tls_le_hi20: + return ELF::R_LARCH_TLS_LE_HI20; + case LoongArch::fixup_loongarch_tls_le_lo12: + return ELF::R_LARCH_TLS_LE_LO12; + case LoongArch::fixup_loongarch_tls_le64_lo20: + return ELF::R_LARCH_TLS_LE64_LO20; + case LoongArch::fixup_loongarch_tls_le64_hi12: + return ELF::R_LARCH_TLS_LE64_HI12; + // TODO: Handle more fixup-kinds. } } |
