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