diff options
Diffstat (limited to 'gnu/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp')
| -rw-r--r-- | gnu/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/gnu/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp b/gnu/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp index 4f085d31a26..ad53228c104 100644 --- a/gnu/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp +++ b/gnu/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp @@ -7,9 +7,11 @@ // //===----------------------------------------------------------------------===// +#include "MCTargetDesc/RISCVFixupKinds.h" #include "MCTargetDesc/RISCVMCTargetDesc.h" #include "llvm/MC/MCELFObjectWriter.h" #include "llvm/MC/MCFixup.h" +#include "llvm/MC/MCObjectWriter.h" #include "llvm/Support/ErrorHandling.h" using namespace llvm; @@ -29,7 +31,7 @@ protected: RISCVELFObjectWriter::RISCVELFObjectWriter(uint8_t OSABI, bool Is64Bit) : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_RISCV, - /*HasRelocationAddend*/ false) {} + /*HasRelocationAddend*/ true) {} RISCVELFObjectWriter::~RISCVELFObjectWriter() {} @@ -37,11 +39,37 @@ unsigned RISCVELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const { - llvm_unreachable("invalid fixup kind!"); + // Determine the type of the relocation + switch ((unsigned)Fixup.getKind()) { + default: + llvm_unreachable("invalid fixup kind!"); + case FK_Data_4: + return ELF::R_RISCV_32; + case FK_Data_8: + return ELF::R_RISCV_64; + case RISCV::fixup_riscv_hi20: + return ELF::R_RISCV_HI20; + case RISCV::fixup_riscv_lo12_i: + return ELF::R_RISCV_LO12_I; + case RISCV::fixup_riscv_lo12_s: + return ELF::R_RISCV_LO12_S; + case RISCV::fixup_riscv_pcrel_hi20: + return ELF::R_RISCV_PCREL_HI20; + case RISCV::fixup_riscv_jal: + return ELF::R_RISCV_JAL; + case RISCV::fixup_riscv_branch: + return ELF::R_RISCV_BRANCH; + case RISCV::fixup_riscv_rvc_jump: + return ELF::R_RISCV_RVC_JUMP; + case RISCV::fixup_riscv_rvc_branch: + return ELF::R_RISCV_RVC_BRANCH; + } } -MCObjectWriter *llvm::createRISCVELFObjectWriter(raw_pwrite_stream &OS, - uint8_t OSABI, bool Is64Bit) { - MCELFObjectTargetWriter *MOTW = new RISCVELFObjectWriter(OSABI, Is64Bit); - return createELFObjectWriter(MOTW, OS, /*IsLittleEndian*/ true); +std::unique_ptr<MCObjectWriter> +llvm::createRISCVELFObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI, + bool Is64Bit) { + return createELFObjectWriter( + llvm::make_unique<RISCVELFObjectWriter>(OSABI, Is64Bit), OS, + /*IsLittleEndian=*/true); } |
