xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
106c3fb27SDimitry Andric //===-- RISCVAsmBackend.h - RISC-V Assembler Backend ----------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVASMBACKEND_H
100b57cec5SDimitry Andric #define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVASMBACKEND_H
110b57cec5SDimitry Andric 
12e8d8bef9SDimitry Andric #include "MCTargetDesc/RISCVBaseInfo.h"
130b57cec5SDimitry Andric #include "MCTargetDesc/RISCVFixupKinds.h"
140b57cec5SDimitry Andric #include "MCTargetDesc/RISCVMCTargetDesc.h"
150b57cec5SDimitry Andric #include "llvm/MC/MCAsmBackend.h"
160b57cec5SDimitry Andric #include "llvm/MC/MCFixupKindInfo.h"
170b57cec5SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric namespace llvm {
200b57cec5SDimitry Andric class MCAssembler;
210b57cec5SDimitry Andric class MCObjectTargetWriter;
220b57cec5SDimitry Andric class raw_ostream;
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric class RISCVAsmBackend : public MCAsmBackend {
250b57cec5SDimitry Andric   const MCSubtargetInfo &STI;
260b57cec5SDimitry Andric   uint8_t OSABI;
270b57cec5SDimitry Andric   bool Is64Bit;
280b57cec5SDimitry Andric   bool ForceRelocs = false;
290b57cec5SDimitry Andric   const MCTargetOptions &TargetOptions;
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric public:
RISCVAsmBackend(const MCSubtargetInfo & STI,uint8_t OSABI,bool Is64Bit,const MCTargetOptions & Options)320b57cec5SDimitry Andric   RISCVAsmBackend(const MCSubtargetInfo &STI, uint8_t OSABI, bool Is64Bit,
330b57cec5SDimitry Andric                   const MCTargetOptions &Options)
345f757f3fSDimitry Andric       : MCAsmBackend(llvm::endianness::little, RISCV::fixup_riscv_relax),
355f757f3fSDimitry Andric         STI(STI), OSABI(OSABI), Is64Bit(Is64Bit), TargetOptions(Options) {
360b57cec5SDimitry Andric     RISCVFeatures::validate(STI.getTargetTriple(), STI.getFeatureBits());
370b57cec5SDimitry Andric   }
3881ad6265SDimitry Andric   ~RISCVAsmBackend() override = default;
390b57cec5SDimitry Andric 
setForceRelocs()400b57cec5SDimitry Andric   void setForceRelocs() { ForceRelocs = true; }
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   // Return Size with extra Nop Bytes for alignment directive in code section.
430b57cec5SDimitry Andric   bool shouldInsertExtraNopBytesForCodeAlign(const MCAlignFragment &AF,
440b57cec5SDimitry Andric                                              unsigned &Size) override;
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric   // Insert target specific fixup type for alignment directive in code section.
470b57cec5SDimitry Andric   bool shouldInsertFixupForCodeAlign(MCAssembler &Asm,
480b57cec5SDimitry Andric                                      MCAlignFragment &AF) override;
490b57cec5SDimitry Andric 
50*0fca6ea1SDimitry Andric   bool evaluateTargetFixup(const MCAssembler &Asm, const MCFixup &Fixup,
51*0fca6ea1SDimitry Andric                            const MCFragment *DF, const MCValue &Target,
52*0fca6ea1SDimitry Andric                            const MCSubtargetInfo *STI, uint64_t &Value,
53*0fca6ea1SDimitry Andric                            bool &WasForced) override;
5455e4f9d5SDimitry Andric 
55*0fca6ea1SDimitry Andric   bool handleAddSubRelocations(const MCAssembler &Asm, const MCFragment &F,
5606c3fb27SDimitry Andric                                const MCFixup &Fixup, const MCValue &Target,
5706c3fb27SDimitry Andric                                uint64_t &FixedValue) const override;
5806c3fb27SDimitry Andric 
590b57cec5SDimitry Andric   void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
600b57cec5SDimitry Andric                   const MCValue &Target, MutableArrayRef<char> Data,
610b57cec5SDimitry Andric                   uint64_t Value, bool IsResolved,
620b57cec5SDimitry Andric                   const MCSubtargetInfo *STI) const override;
630b57cec5SDimitry Andric 
640b57cec5SDimitry Andric   std::unique_ptr<MCObjectTargetWriter>
650b57cec5SDimitry Andric   createObjectTargetWriter() const override;
660b57cec5SDimitry Andric 
670b57cec5SDimitry Andric   bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
685f757f3fSDimitry Andric                              const MCValue &Target,
695f757f3fSDimitry Andric                              const MCSubtargetInfo *STI) override;
700b57cec5SDimitry Andric 
71*0fca6ea1SDimitry Andric   bool fixupNeedsRelaxationAdvanced(const MCAssembler &Asm,
72*0fca6ea1SDimitry Andric                                     const MCFixup &Fixup, bool Resolved,
730b57cec5SDimitry Andric                                     uint64_t Value,
740b57cec5SDimitry Andric                                     const MCRelaxableFragment *DF,
750b57cec5SDimitry Andric                                     const bool WasForced) const override;
760b57cec5SDimitry Andric 
getNumFixupKinds()770b57cec5SDimitry Andric   unsigned getNumFixupKinds() const override {
780b57cec5SDimitry Andric     return RISCV::NumTargetFixupKinds;
790b57cec5SDimitry Andric   }
800b57cec5SDimitry Andric 
81bdd1243dSDimitry Andric   std::optional<MCFixupKind> getFixupKind(StringRef Name) const override;
820b57cec5SDimitry Andric 
835ffd83dbSDimitry Andric   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric   bool mayNeedRelaxation(const MCInst &Inst,
860b57cec5SDimitry Andric                          const MCSubtargetInfo &STI) const override;
870b57cec5SDimitry Andric   unsigned getRelaxedOpcode(unsigned Op) const;
880b57cec5SDimitry Andric 
895ffd83dbSDimitry Andric   void relaxInstruction(MCInst &Inst,
905ffd83dbSDimitry Andric                         const MCSubtargetInfo &STI) const override;
910b57cec5SDimitry Andric 
92*0fca6ea1SDimitry Andric   bool relaxDwarfLineAddr(const MCAssembler &Asm, MCDwarfLineAddrFragment &DF,
93fe6060f1SDimitry Andric                           bool &WasRelaxed) const override;
94*0fca6ea1SDimitry Andric   bool relaxDwarfCFA(const MCAssembler &Asm, MCDwarfCallFrameFragment &DF,
95fe6060f1SDimitry Andric                      bool &WasRelaxed) const override;
96*0fca6ea1SDimitry Andric   std::pair<bool, bool> relaxLEB128(const MCAssembler &Asm, MCLEBFragment &LF,
975f757f3fSDimitry Andric                                     int64_t &Value) const override;
98fe6060f1SDimitry Andric 
99349cc55cSDimitry Andric   bool writeNopData(raw_ostream &OS, uint64_t Count,
100349cc55cSDimitry Andric                     const MCSubtargetInfo *STI) const override;
1010b57cec5SDimitry Andric 
getTargetOptions()1020b57cec5SDimitry Andric   const MCTargetOptions &getTargetOptions() const { return TargetOptions; }
1030b57cec5SDimitry Andric };
1040b57cec5SDimitry Andric }
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric #endif
107