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 16using namespace llvm; 17 18namespace { 19 20class LanaiELFObjectWriter : public MCELFObjectTargetWriter { 21public: 22 explicit LanaiELFObjectWriter(uint8_t OSABI); 23 24 ~LanaiELFObjectWriter() override = default; 25 26protected: 27 unsigned getRelocType(MCContext &Ctx, const MCValue &Target, 28 const MCFixup &Fixup, bool IsPCRel) const override; 29 bool needsRelocateWithSymbol(const MCSymbol &SD, 30 unsigned Type) const override; 31}; 32 33} // end anonymous namespace 34 35LanaiELFObjectWriter::LanaiELFObjectWriter(uint8_t OSABI) 36 : MCELFObjectTargetWriter(/*Is64Bit_=*/false, OSABI, ELF::EM_LANAI, 37 /*HasRelocationAddend_=*/true) {} 38 39unsigned 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 75bool LanaiELFObjectWriter::needsRelocateWithSymbol(const MCSymbol & /*SD*/, 76 unsigned Type) const { 77 switch (Type) { 78 case ELF::R_LANAI_21: 79 case ELF::R_LANAI_21_F: 80 case ELF::R_LANAI_25: 81 case ELF::R_LANAI_32: 82 case ELF::R_LANAI_HI16: 83 return true; 84 default: 85 return false; 86 } 87} 88 89std::unique_ptr<MCObjectTargetWriter> 90llvm::createLanaiELFObjectWriter(uint8_t OSABI) { 91 return std::make_unique<LanaiELFObjectWriter>(OSABI); 92} 93