xref: /freebsd/contrib/llvm-project/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.h (revision 5036d9652a5701d00e9e40ea942c278e9f77d33d)
1 //===-- LoongArchAsmBackend.h - LoongArch Assembler Backend ---*- C++ -*---===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the LoongArchAsmBackend class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHASMBACKEND_H
14 #define LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHASMBACKEND_H
15 
16 #include "MCTargetDesc/LoongArchBaseInfo.h"
17 #include "MCTargetDesc/LoongArchFixupKinds.h"
18 #include "MCTargetDesc/LoongArchMCTargetDesc.h"
19 #include "llvm/MC/MCAsmBackend.h"
20 #include "llvm/MC/MCExpr.h"
21 #include "llvm/MC/MCFixupKindInfo.h"
22 #include "llvm/MC/MCSection.h"
23 #include "llvm/MC/MCSubtargetInfo.h"
24 
25 namespace llvm {
26 
27 class LoongArchAsmBackend : public MCAsmBackend {
28   const MCSubtargetInfo &STI;
29   uint8_t OSABI;
30   bool Is64Bit;
31   const MCTargetOptions &TargetOptions;
32   DenseMap<MCSection *, const MCSymbolRefExpr *> SecToAlignSym;
33 
34 public:
35   LoongArchAsmBackend(const MCSubtargetInfo &STI, uint8_t OSABI, bool Is64Bit,
36                       const MCTargetOptions &Options)
37       : MCAsmBackend(llvm::endianness::little,
38                      LoongArch::fixup_loongarch_relax),
39         STI(STI), OSABI(OSABI), Is64Bit(Is64Bit), TargetOptions(Options) {}
40   ~LoongArchAsmBackend() override {}
41 
42   bool handleAddSubRelocations(const MCAssembler &Asm, const MCFragment &F,
43                                const MCFixup &Fixup, const MCValue &Target,
44                                uint64_t &FixedValue) const override;
45 
46   void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
47                   const MCValue &Target, MutableArrayRef<char> Data,
48                   uint64_t Value, bool IsResolved,
49                   const MCSubtargetInfo *STI) const override;
50 
51   // Return Size with extra Nop Bytes for alignment directive in code section.
52   bool shouldInsertExtraNopBytesForCodeAlign(const MCAlignFragment &AF,
53                                              unsigned &Size) override;
54 
55   // Insert target specific fixup type for alignment directive in code section.
56   bool shouldInsertFixupForCodeAlign(MCAssembler &Asm,
57                                      MCAlignFragment &AF) override;
58 
59   bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
60                              const MCValue &Target,
61                              const MCSubtargetInfo *STI) override;
62 
63   unsigned getNumFixupKinds() const override {
64     return LoongArch::NumTargetFixupKinds;
65   }
66 
67   std::optional<MCFixupKind> getFixupKind(StringRef Name) const override;
68 
69   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
70 
71   void relaxInstruction(MCInst &Inst,
72                         const MCSubtargetInfo &STI) const override {}
73 
74   std::pair<bool, bool> relaxLEB128(const MCAssembler &Asm, MCLEBFragment &LF,
75                                     int64_t &Value) const override;
76 
77   bool relaxDwarfLineAddr(const MCAssembler &Asm, MCDwarfLineAddrFragment &DF,
78                           bool &WasRelaxed) const override;
79   bool relaxDwarfCFA(const MCAssembler &Asm, MCDwarfCallFrameFragment &DF,
80                      bool &WasRelaxed) const override;
81 
82   bool writeNopData(raw_ostream &OS, uint64_t Count,
83                     const MCSubtargetInfo *STI) const override;
84 
85   std::unique_ptr<MCObjectTargetWriter>
86   createObjectTargetWriter() const override;
87   const MCTargetOptions &getTargetOptions() const { return TargetOptions; }
88   DenseMap<MCSection *, const MCSymbolRefExpr *> &getSecToAlignSym() {
89     return SecToAlignSym;
90   }
91 };
92 } // end namespace llvm
93 
94 #endif // LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHASMBACKEND_H
95