1 //===-- LanaiELFObjectWriter.cpp - Lanai ELF Writer -----------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "MCTargetDesc/LanaiBaseInfo.h" 10 #include "MCTargetDesc/LanaiFixupKinds.h" 11 #include "llvm/BinaryFormat/ELF.h" 12 #include "llvm/MC/MCELFObjectWriter.h" 13 #include "llvm/MC/MCObjectWriter.h" 14 #include "llvm/Support/ErrorHandling.h" 15 16 using namespace llvm; 17 18 namespace { 19 20 class LanaiELFObjectWriter : public MCELFObjectTargetWriter { 21 public: 22 explicit LanaiELFObjectWriter(uint8_t OSABI); 23 24 ~LanaiELFObjectWriter() override = default; 25 26 protected: 27 unsigned getRelocType(MCContext &Ctx, const MCValue &Target, 28 const MCFixup &Fixup, bool IsPCRel) const override; 29 bool needsRelocateWithSymbol(const MCValue &Val, const MCSymbol &Sym, 30 unsigned Type) const override; 31 }; 32 33 } // end anonymous namespace 34 35 LanaiELFObjectWriter::LanaiELFObjectWriter(uint8_t OSABI) 36 : MCELFObjectTargetWriter(/*Is64Bit_=*/false, OSABI, ELF::EM_LANAI, 37 /*HasRelocationAddend_=*/true) {} 38 39 unsigned LanaiELFObjectWriter::getRelocType(MCContext & /*Ctx*/, 40 const MCValue & /*Target*/, 41 const MCFixup &Fixup, 42 bool /*IsPCRel*/) const { 43 unsigned Type; 44 unsigned Kind = static_cast<unsigned>(Fixup.getKind()); 45 switch (Kind) { 46 case Lanai::FIXUP_LANAI_21: 47 Type = ELF::R_LANAI_21; 48 break; 49 case Lanai::FIXUP_LANAI_21_F: 50 Type = ELF::R_LANAI_21_F; 51 break; 52 case Lanai::FIXUP_LANAI_25: 53 Type = ELF::R_LANAI_25; 54 break; 55 case Lanai::FIXUP_LANAI_32: 56 case FK_Data_4: 57 Type = ELF::R_LANAI_32; 58 break; 59 case Lanai::FIXUP_LANAI_HI16: 60 Type = ELF::R_LANAI_HI16; 61 break; 62 case Lanai::FIXUP_LANAI_LO16: 63 Type = ELF::R_LANAI_LO16; 64 break; 65 case Lanai::FIXUP_LANAI_NONE: 66 Type = ELF::R_LANAI_NONE; 67 break; 68 69 default: 70 llvm_unreachable("Invalid fixup kind!"); 71 } 72 return Type; 73 } 74 75 bool LanaiELFObjectWriter::needsRelocateWithSymbol(const MCValue &, 76 const MCSymbol &, 77 unsigned Type) const { 78 switch (Type) { 79 case ELF::R_LANAI_21: 80 case ELF::R_LANAI_21_F: 81 case ELF::R_LANAI_25: 82 case ELF::R_LANAI_32: 83 case ELF::R_LANAI_HI16: 84 return true; 85 default: 86 return false; 87 } 88 } 89 90 std::unique_ptr<MCObjectTargetWriter> 91 llvm::createLanaiELFObjectWriter(uint8_t OSABI) { 92 return std::make_unique<LanaiELFObjectWriter>(OSABI); 93 } 94