1*81ad6265SDimitry Andric //===-- LoongArchELFObjectWriter.cpp - LoongArch ELF Writer ---*- C++ -*---===// 2*81ad6265SDimitry Andric // 3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*81ad6265SDimitry Andric // 7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 8*81ad6265SDimitry Andric 9*81ad6265SDimitry Andric #include "MCTargetDesc/LoongArchMCTargetDesc.h" 10*81ad6265SDimitry Andric #include "llvm/MC/MCContext.h" 11*81ad6265SDimitry Andric #include "llvm/MC/MCELFObjectWriter.h" 12*81ad6265SDimitry Andric #include "llvm/MC/MCFixup.h" 13*81ad6265SDimitry Andric #include "llvm/MC/MCObjectWriter.h" 14*81ad6265SDimitry Andric #include "llvm/Support/ErrorHandling.h" 15*81ad6265SDimitry Andric 16*81ad6265SDimitry Andric using namespace llvm; 17*81ad6265SDimitry Andric 18*81ad6265SDimitry Andric namespace { 19*81ad6265SDimitry Andric class LoongArchELFObjectWriter : public MCELFObjectTargetWriter { 20*81ad6265SDimitry Andric public: 21*81ad6265SDimitry Andric LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit); 22*81ad6265SDimitry Andric 23*81ad6265SDimitry Andric ~LoongArchELFObjectWriter() override; 24*81ad6265SDimitry Andric 25*81ad6265SDimitry Andric // Return true if the given relocation must be with a symbol rather than 26*81ad6265SDimitry Andric // section plus offset. 27*81ad6265SDimitry Andric bool needsRelocateWithSymbol(const MCSymbol &Sym, 28*81ad6265SDimitry Andric unsigned Type) const override { 29*81ad6265SDimitry Andric return true; 30*81ad6265SDimitry Andric } 31*81ad6265SDimitry Andric 32*81ad6265SDimitry Andric protected: 33*81ad6265SDimitry Andric unsigned getRelocType(MCContext &Ctx, const MCValue &Target, 34*81ad6265SDimitry Andric const MCFixup &Fixup, bool IsPCRel) const override; 35*81ad6265SDimitry Andric }; 36*81ad6265SDimitry Andric } // namespace 37*81ad6265SDimitry Andric 38*81ad6265SDimitry Andric LoongArchELFObjectWriter::LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit) 39*81ad6265SDimitry Andric : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_LOONGARCH, 40*81ad6265SDimitry Andric /*HasRelocationAddend*/ true) {} 41*81ad6265SDimitry Andric 42*81ad6265SDimitry Andric LoongArchELFObjectWriter::~LoongArchELFObjectWriter() {} 43*81ad6265SDimitry Andric 44*81ad6265SDimitry Andric unsigned LoongArchELFObjectWriter::getRelocType(MCContext &Ctx, 45*81ad6265SDimitry Andric const MCValue &Target, 46*81ad6265SDimitry Andric const MCFixup &Fixup, 47*81ad6265SDimitry Andric bool IsPCRel) const { 48*81ad6265SDimitry Andric // Determine the type of the relocation 49*81ad6265SDimitry Andric unsigned Kind = Fixup.getTargetKind(); 50*81ad6265SDimitry Andric 51*81ad6265SDimitry Andric if (Kind >= FirstLiteralRelocationKind) 52*81ad6265SDimitry Andric return Kind - FirstLiteralRelocationKind; 53*81ad6265SDimitry Andric 54*81ad6265SDimitry Andric switch (Kind) { 55*81ad6265SDimitry Andric // TODO: Implement this when we defined fixup kind. 56*81ad6265SDimitry Andric default: 57*81ad6265SDimitry Andric return ELF::R_LARCH_NONE; 58*81ad6265SDimitry Andric } 59*81ad6265SDimitry Andric } 60*81ad6265SDimitry Andric 61*81ad6265SDimitry Andric std::unique_ptr<MCObjectTargetWriter> 62*81ad6265SDimitry Andric llvm::createLoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit) { 63*81ad6265SDimitry Andric return std::make_unique<LoongArchELFObjectWriter>(OSABI, Is64Bit); 64*81ad6265SDimitry Andric } 65