xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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