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