181ad6265SDimitry Andric //===-- LoongArchAsmBackend.h - LoongArch Assembler Backend ---*- C++ -*---===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file defines the LoongArchAsmBackend class.
1081ad6265SDimitry Andric //
1181ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric 
1381ad6265SDimitry Andric #ifndef LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHASMBACKEND_H
1481ad6265SDimitry Andric #define LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHASMBACKEND_H
1581ad6265SDimitry Andric 
1681ad6265SDimitry Andric #include "MCTargetDesc/LoongArchBaseInfo.h"
17bdd1243dSDimitry Andric #include "MCTargetDesc/LoongArchFixupKinds.h"
1881ad6265SDimitry Andric #include "MCTargetDesc/LoongArchMCTargetDesc.h"
1981ad6265SDimitry Andric #include "llvm/MC/MCAsmBackend.h"
20*7a6dacacSDimitry Andric #include "llvm/MC/MCExpr.h"
2181ad6265SDimitry Andric #include "llvm/MC/MCFixupKindInfo.h"
22*7a6dacacSDimitry Andric #include "llvm/MC/MCSection.h"
2381ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h"
2481ad6265SDimitry Andric 
2581ad6265SDimitry Andric namespace llvm {
2681ad6265SDimitry Andric 
2781ad6265SDimitry Andric class LoongArchAsmBackend : public MCAsmBackend {
28bdd1243dSDimitry Andric   const MCSubtargetInfo &STI;
2981ad6265SDimitry Andric   uint8_t OSABI;
3081ad6265SDimitry Andric   bool Is64Bit;
3106c3fb27SDimitry Andric   const MCTargetOptions &TargetOptions;
32*7a6dacacSDimitry Andric   DenseMap<MCSection *, const MCSymbolRefExpr *> SecToAlignSym;
3381ad6265SDimitry Andric 
3481ad6265SDimitry Andric public:
LoongArchAsmBackend(const MCSubtargetInfo & STI,uint8_t OSABI,bool Is64Bit,const MCTargetOptions & Options)3506c3fb27SDimitry Andric   LoongArchAsmBackend(const MCSubtargetInfo &STI, uint8_t OSABI, bool Is64Bit,
3606c3fb27SDimitry Andric                       const MCTargetOptions &Options)
37cb14a3feSDimitry Andric       : MCAsmBackend(llvm::endianness::little,
38cb14a3feSDimitry Andric                      LoongArch::fixup_loongarch_relax),
39cb14a3feSDimitry Andric         STI(STI), OSABI(OSABI), Is64Bit(Is64Bit), TargetOptions(Options) {}
~LoongArchAsmBackend()4081ad6265SDimitry Andric   ~LoongArchAsmBackend() override {}
4181ad6265SDimitry Andric 
42cb14a3feSDimitry Andric   bool handleAddSubRelocations(const MCAsmLayout &Layout, const MCFragment &F,
43cb14a3feSDimitry Andric                                const MCFixup &Fixup, const MCValue &Target,
44cb14a3feSDimitry Andric                                uint64_t &FixedValue) const override;
45cb14a3feSDimitry Andric 
4681ad6265SDimitry Andric   void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
4781ad6265SDimitry Andric                   const MCValue &Target, MutableArrayRef<char> Data,
4881ad6265SDimitry Andric                   uint64_t Value, bool IsResolved,
4981ad6265SDimitry Andric                   const MCSubtargetInfo *STI) const override;
5081ad6265SDimitry Andric 
51*7a6dacacSDimitry Andric   // Return Size with extra Nop Bytes for alignment directive in code section.
52*7a6dacacSDimitry Andric   bool shouldInsertExtraNopBytesForCodeAlign(const MCAlignFragment &AF,
53*7a6dacacSDimitry Andric                                              unsigned &Size) override;
54*7a6dacacSDimitry Andric 
55*7a6dacacSDimitry Andric   // Insert target specific fixup type for alignment directive in code section.
56*7a6dacacSDimitry Andric   bool shouldInsertFixupForCodeAlign(MCAssembler &Asm,
57*7a6dacacSDimitry Andric                                      const MCAsmLayout &Layout,
58*7a6dacacSDimitry Andric                                      MCAlignFragment &AF) override;
59*7a6dacacSDimitry Andric 
6081ad6265SDimitry Andric   bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
615f757f3fSDimitry Andric                              const MCValue &Target,
625f757f3fSDimitry Andric                              const MCSubtargetInfo *STI) override;
6381ad6265SDimitry Andric 
fixupNeedsRelaxation(const MCFixup & Fixup,uint64_t Value,const MCRelaxableFragment * DF,const MCAsmLayout & Layout)6481ad6265SDimitry Andric   bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
6581ad6265SDimitry Andric                             const MCRelaxableFragment *DF,
6681ad6265SDimitry Andric                             const MCAsmLayout &Layout) const override {
6781ad6265SDimitry Andric     return false;
6881ad6265SDimitry Andric   }
6981ad6265SDimitry Andric 
getNumFixupKinds()7081ad6265SDimitry Andric   unsigned getNumFixupKinds() const override {
71bdd1243dSDimitry Andric     return LoongArch::NumTargetFixupKinds;
7281ad6265SDimitry Andric   }
7381ad6265SDimitry Andric 
74bdd1243dSDimitry Andric   std::optional<MCFixupKind> getFixupKind(StringRef Name) const override;
75bdd1243dSDimitry Andric 
76bdd1243dSDimitry Andric   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
77bdd1243dSDimitry Andric 
relaxInstruction(MCInst & Inst,const MCSubtargetInfo & STI)7881ad6265SDimitry Andric   void relaxInstruction(MCInst &Inst,
7981ad6265SDimitry Andric                         const MCSubtargetInfo &STI) const override {}
8081ad6265SDimitry Andric 
811db9f3b2SDimitry Andric   std::pair<bool, bool> relaxLEB128(MCLEBFragment &LF, MCAsmLayout &Layout,
821db9f3b2SDimitry Andric                                     int64_t &Value) const override;
831db9f3b2SDimitry Andric 
84*7a6dacacSDimitry Andric   bool relaxDwarfLineAddr(MCDwarfLineAddrFragment &DF, MCAsmLayout &Layout,
85*7a6dacacSDimitry Andric                           bool &WasRelaxed) const override;
86*7a6dacacSDimitry Andric   bool relaxDwarfCFA(MCDwarfCallFrameFragment &DF, MCAsmLayout &Layout,
87*7a6dacacSDimitry Andric                      bool &WasRelaxed) const override;
88*7a6dacacSDimitry Andric 
8981ad6265SDimitry Andric   bool writeNopData(raw_ostream &OS, uint64_t Count,
9081ad6265SDimitry Andric                     const MCSubtargetInfo *STI) const override;
9181ad6265SDimitry Andric 
9281ad6265SDimitry Andric   std::unique_ptr<MCObjectTargetWriter>
9381ad6265SDimitry Andric   createObjectTargetWriter() const override;
getTargetOptions()9406c3fb27SDimitry Andric   const MCTargetOptions &getTargetOptions() const { return TargetOptions; }
getSecToAlignSym()95*7a6dacacSDimitry Andric   DenseMap<MCSection *, const MCSymbolRefExpr *> &getSecToAlignSym() {
96*7a6dacacSDimitry Andric     return SecToAlignSym;
97*7a6dacacSDimitry Andric   }
9881ad6265SDimitry Andric };
99972a253aSDimitry Andric } // end namespace llvm
10081ad6265SDimitry Andric 
10181ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHASMBACKEND_H
102