xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaELFObjectWriter.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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