xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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"
207a6dacacSDimitry Andric #include "llvm/MC/MCExpr.h"
2181ad6265SDimitry Andric #include "llvm/MC/MCFixupKindInfo.h"
227a6dacacSDimitry 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;
327a6dacacSDimitry Andric   DenseMap<MCSection *, const MCSymbolRefExpr *> SecToAlignSym;
3381ad6265SDimitry Andric 
3481ad6265SDimitry Andric public:
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) {}
4081ad6265SDimitry Andric   ~LoongArchAsmBackend() override {}
4181ad6265SDimitry Andric 
42*0fca6ea1SDimitry Andric   bool handleAddSubRelocations(const MCAssembler &Asm, 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 
517a6dacacSDimitry Andric   // Return Size with extra Nop Bytes for alignment directive in code section.
527a6dacacSDimitry Andric   bool shouldInsertExtraNopBytesForCodeAlign(const MCAlignFragment &AF,
537a6dacacSDimitry Andric                                              unsigned &Size) override;
547a6dacacSDimitry Andric 
557a6dacacSDimitry Andric   // Insert target specific fixup type for alignment directive in code section.
567a6dacacSDimitry Andric   bool shouldInsertFixupForCodeAlign(MCAssembler &Asm,
577a6dacacSDimitry Andric                                      MCAlignFragment &AF) override;
587a6dacacSDimitry Andric 
5981ad6265SDimitry Andric   bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
605f757f3fSDimitry Andric                              const MCValue &Target,
615f757f3fSDimitry Andric                              const MCSubtargetInfo *STI) override;
6281ad6265SDimitry Andric 
6381ad6265SDimitry Andric   unsigned getNumFixupKinds() const override {
64bdd1243dSDimitry Andric     return LoongArch::NumTargetFixupKinds;
6581ad6265SDimitry Andric   }
6681ad6265SDimitry Andric 
67bdd1243dSDimitry Andric   std::optional<MCFixupKind> getFixupKind(StringRef Name) const override;
68bdd1243dSDimitry Andric 
69bdd1243dSDimitry Andric   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
70bdd1243dSDimitry Andric 
7181ad6265SDimitry Andric   void relaxInstruction(MCInst &Inst,
7281ad6265SDimitry Andric                         const MCSubtargetInfo &STI) const override {}
7381ad6265SDimitry Andric 
74*0fca6ea1SDimitry Andric   std::pair<bool, bool> relaxLEB128(const MCAssembler &Asm, MCLEBFragment &LF,
751db9f3b2SDimitry Andric                                     int64_t &Value) const override;
761db9f3b2SDimitry Andric 
77*0fca6ea1SDimitry Andric   bool relaxDwarfLineAddr(const MCAssembler &Asm, MCDwarfLineAddrFragment &DF,
787a6dacacSDimitry Andric                           bool &WasRelaxed) const override;
79*0fca6ea1SDimitry Andric   bool relaxDwarfCFA(const MCAssembler &Asm, MCDwarfCallFrameFragment &DF,
807a6dacacSDimitry Andric                      bool &WasRelaxed) const override;
817a6dacacSDimitry Andric 
8281ad6265SDimitry Andric   bool writeNopData(raw_ostream &OS, uint64_t Count,
8381ad6265SDimitry Andric                     const MCSubtargetInfo *STI) const override;
8481ad6265SDimitry Andric 
8581ad6265SDimitry Andric   std::unique_ptr<MCObjectTargetWriter>
8681ad6265SDimitry Andric   createObjectTargetWriter() const override;
8706c3fb27SDimitry Andric   const MCTargetOptions &getTargetOptions() const { return TargetOptions; }
887a6dacacSDimitry Andric   DenseMap<MCSection *, const MCSymbolRefExpr *> &getSecToAlignSym() {
897a6dacacSDimitry Andric     return SecToAlignSym;
907a6dacacSDimitry Andric   }
9181ad6265SDimitry Andric };
92972a253aSDimitry Andric } // end namespace llvm
9381ad6265SDimitry Andric 
9481ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHASMBACKEND_H
95