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