1*bdd1243dSDimitry Andric //===-- XtensaMCObjectWriter.cpp - Xtensa ELF writer ----------------------===// 2*bdd1243dSDimitry Andric // 3*bdd1243dSDimitry Andric // The LLVM Compiler Infrastructure 4*bdd1243dSDimitry Andric // 5*bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 6*bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 7*bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 8*bdd1243dSDimitry Andric // 9*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 10*bdd1243dSDimitry Andric 11*bdd1243dSDimitry Andric #include "MCTargetDesc/XtensaMCTargetDesc.h" 12*bdd1243dSDimitry Andric #include "llvm/ADT/STLExtras.h" 13*bdd1243dSDimitry Andric #include "llvm/BinaryFormat/ELF.h" 14*bdd1243dSDimitry Andric #include "llvm/MC/MCELFObjectWriter.h" 15*bdd1243dSDimitry Andric #include "llvm/MC/MCExpr.h" 16*bdd1243dSDimitry Andric #include "llvm/MC/MCFixup.h" 17*bdd1243dSDimitry Andric #include "llvm/MC/MCObjectWriter.h" 18*bdd1243dSDimitry Andric #include "llvm/MC/MCValue.h" 19*bdd1243dSDimitry Andric #include "llvm/Support/ErrorHandling.h" 20*bdd1243dSDimitry Andric #include <cassert> 21*bdd1243dSDimitry Andric #include <cstdint> 22*bdd1243dSDimitry Andric 23*bdd1243dSDimitry Andric using namespace llvm; 24*bdd1243dSDimitry Andric 25*bdd1243dSDimitry Andric namespace { 26*bdd1243dSDimitry Andric class XtensaObjectWriter : public MCELFObjectTargetWriter { 27*bdd1243dSDimitry Andric public: 28*bdd1243dSDimitry Andric XtensaObjectWriter(uint8_t OSABI); 29*bdd1243dSDimitry Andric 30*bdd1243dSDimitry Andric virtual ~XtensaObjectWriter(); 31*bdd1243dSDimitry Andric 32*bdd1243dSDimitry Andric protected: 33*bdd1243dSDimitry Andric unsigned getRelocType(MCContext &Ctx, const MCValue &Target, 34*bdd1243dSDimitry Andric const MCFixup &Fixup, bool IsPCRel) const override; 35*bdd1243dSDimitry Andric bool needsRelocateWithSymbol(const MCSymbol &Sym, 36*bdd1243dSDimitry Andric unsigned Type) const override; 37*bdd1243dSDimitry Andric }; 38*bdd1243dSDimitry Andric } // namespace 39*bdd1243dSDimitry Andric 40*bdd1243dSDimitry Andric XtensaObjectWriter::XtensaObjectWriter(uint8_t OSABI) 41*bdd1243dSDimitry Andric : MCELFObjectTargetWriter(false, OSABI, ELF::EM_XTENSA, 42*bdd1243dSDimitry Andric /*HasRelocationAddend=*/true) {} 43*bdd1243dSDimitry Andric 44*bdd1243dSDimitry Andric XtensaObjectWriter::~XtensaObjectWriter() {} 45*bdd1243dSDimitry Andric 46*bdd1243dSDimitry Andric unsigned XtensaObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target, 47*bdd1243dSDimitry Andric const MCFixup &Fixup, 48*bdd1243dSDimitry Andric bool IsPCRel) const { 49*bdd1243dSDimitry Andric 50*bdd1243dSDimitry Andric switch ((unsigned)Fixup.getKind()) { 51*bdd1243dSDimitry Andric case FK_Data_4: 52*bdd1243dSDimitry Andric return ELF::R_XTENSA_32; 53*bdd1243dSDimitry Andric default: 54*bdd1243dSDimitry Andric return ELF::R_XTENSA_SLOT0_OP; 55*bdd1243dSDimitry Andric } 56*bdd1243dSDimitry Andric } 57*bdd1243dSDimitry Andric 58*bdd1243dSDimitry Andric std::unique_ptr<MCObjectTargetWriter> 59*bdd1243dSDimitry Andric llvm::createXtensaObjectWriter(uint8_t OSABI, bool IsLittleEndian) { 60*bdd1243dSDimitry Andric return std::make_unique<XtensaObjectWriter>(OSABI); 61*bdd1243dSDimitry Andric } 62*bdd1243dSDimitry Andric 63*bdd1243dSDimitry Andric bool XtensaObjectWriter::needsRelocateWithSymbol(const MCSymbol &Sym, 64*bdd1243dSDimitry Andric unsigned Type) const { 65*bdd1243dSDimitry Andric return false; 66*bdd1243dSDimitry Andric } 67