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