Path: blob/main/contrib/llvm-project/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.h
213845 views
//===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H9#define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H1011#include "MCTargetDesc/MipsABIFlagsSection.h"12#include "MCTargetDesc/MipsABIInfo.h"13#include "llvm/ADT/STLExtras.h"14#include "llvm/MC/MCELFStreamer.h"15#include "llvm/MC/MCRegisterInfo.h"16#include "llvm/MC/MCStreamer.h"1718namespace llvm {1920class formatted_raw_ostream;2122class MipsTargetStreamer : public MCTargetStreamer {23public:24MipsTargetStreamer(MCStreamer &S);2526virtual void emitGPRel32Value(const MCExpr *);27virtual void emitGPRel64Value(const MCExpr *);28virtual void emitDTPRel32Value(const MCExpr *);29virtual void emitDTPRel64Value(const MCExpr *);30virtual void emitTPRel32Value(const MCExpr *);31virtual void emitTPRel64Value(const MCExpr *);3233virtual void setPic(bool Value) {}3435virtual void emitDirectiveSetMicroMips();36virtual void emitDirectiveSetNoMicroMips();37virtual void setUsesMicroMips();38virtual void emitDirectiveSetMips16();39virtual void emitDirectiveSetNoMips16();4041virtual void emitDirectiveSetReorder();42virtual void emitDirectiveSetNoReorder();43virtual void emitDirectiveSetMacro();44virtual void emitDirectiveSetNoMacro();45virtual void emitDirectiveSetMsa();46virtual void emitDirectiveSetNoMsa();47virtual void emitDirectiveSetMt();48virtual void emitDirectiveSetNoMt();49virtual void emitDirectiveSetCRC();50virtual void emitDirectiveSetNoCRC();51virtual void emitDirectiveSetVirt();52virtual void emitDirectiveSetNoVirt();53virtual void emitDirectiveSetGINV();54virtual void emitDirectiveSetNoGINV();55virtual void emitDirectiveSetAt();56virtual void emitDirectiveSetAtWithArg(unsigned RegNo);57virtual void emitDirectiveSetNoAt();58virtual void emitDirectiveEnd(StringRef Name);5960virtual void emitDirectiveEnt(const MCSymbol &Symbol);61virtual void emitDirectiveAbiCalls();62virtual void emitDirectiveNaN2008();63virtual void emitDirectiveNaNLegacy();64virtual void emitDirectiveOptionPic0();65virtual void emitDirectiveOptionPic2();66virtual void emitDirectiveInsn();67virtual void emitFrame(MCRegister StackReg, unsigned StackSize,68MCRegister ReturnReg);69virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);70virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);7172virtual void emitDirectiveSetArch(StringRef Arch);73virtual void emitDirectiveSetMips0();74virtual void emitDirectiveSetMips1();75virtual void emitDirectiveSetMips2();76virtual void emitDirectiveSetMips3();77virtual void emitDirectiveSetMips4();78virtual void emitDirectiveSetMips5();79virtual void emitDirectiveSetMips32();80virtual void emitDirectiveSetMips32R2();81virtual void emitDirectiveSetMips32R3();82virtual void emitDirectiveSetMips32R5();83virtual void emitDirectiveSetMips32R6();84virtual void emitDirectiveSetMips64();85virtual void emitDirectiveSetMips64R2();86virtual void emitDirectiveSetMips64R3();87virtual void emitDirectiveSetMips64R5();88virtual void emitDirectiveSetMips64R6();89virtual void emitDirectiveSetDsp();90virtual void emitDirectiveSetDspr2();91virtual void emitDirectiveSetNoDsp();92virtual void emitDirectiveSetMips3D();93virtual void emitDirectiveSetNoMips3D();94virtual void emitDirectiveSetPop();95virtual void emitDirectiveSetPush();96virtual void emitDirectiveSetSoftFloat();97virtual void emitDirectiveSetHardFloat();9899// PIC support100virtual void emitDirectiveCpAdd(unsigned RegNo);101virtual void emitDirectiveCpLoad(unsigned RegNo);102virtual void emitDirectiveCpLocal(unsigned RegNo);103virtual bool emitDirectiveCpRestore(int Offset,104function_ref<unsigned()> GetATReg,105SMLoc IDLoc, const MCSubtargetInfo *STI);106virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,107const MCSymbol &Sym, bool IsReg);108virtual void emitDirectiveCpreturn(unsigned SaveLocation,109bool SaveLocationIsRegister);110111// FP abiflags directives112virtual void emitDirectiveModuleFP();113virtual void emitDirectiveModuleOddSPReg();114virtual void emitDirectiveModuleSoftFloat();115virtual void emitDirectiveModuleHardFloat();116virtual void emitDirectiveModuleMT();117virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value);118virtual void emitDirectiveSetOddSPReg();119virtual void emitDirectiveSetNoOddSPReg();120virtual void emitDirectiveModuleCRC();121virtual void emitDirectiveModuleNoCRC();122virtual void emitDirectiveModuleVirt();123virtual void emitDirectiveModuleNoVirt();124virtual void emitDirectiveModuleGINV();125virtual void emitDirectiveModuleNoGINV();126127void emitR(unsigned Opcode, MCRegister Reg0, SMLoc IDLoc,128const MCSubtargetInfo *STI);129void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,130const MCSubtargetInfo *STI);131void emitRX(unsigned Opcode, MCRegister Reg0, MCOperand Op1, SMLoc IDLoc,132const MCSubtargetInfo *STI);133void emitRI(unsigned Opcode, MCRegister Reg0, int32_t Imm, SMLoc IDLoc,134const MCSubtargetInfo *STI);135void emitRR(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, SMLoc IDLoc,136const MCSubtargetInfo *STI);137void emitRRX(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, MCOperand Op2,138SMLoc IDLoc, const MCSubtargetInfo *STI);139void emitRRR(unsigned Opcode, MCRegister Reg0, MCRegister Reg1,140MCRegister Reg2, SMLoc IDLoc, const MCSubtargetInfo *STI);141void emitRRRX(unsigned Opcode, MCRegister Reg0, MCRegister Reg1,142MCRegister Reg2, MCOperand Op3, SMLoc IDLoc,143const MCSubtargetInfo *STI);144void emitRRI(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, int16_t Imm,145SMLoc IDLoc, const MCSubtargetInfo *STI);146void emitRRIII(unsigned Opcode, MCRegister Reg0, MCRegister Reg1,147int16_t Imm0, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,148const MCSubtargetInfo *STI);149void emitAddu(MCRegister DstReg, MCRegister SrcReg, MCRegister TrgReg,150bool Is64Bit, const MCSubtargetInfo *STI);151void emitDSLL(MCRegister DstReg, MCRegister SrcReg, int16_t ShiftAmount,152SMLoc IDLoc, const MCSubtargetInfo *STI);153void emitEmptyDelaySlot(bool hasShortDelaySlot, SMLoc IDLoc,154const MCSubtargetInfo *STI);155void emitNop(SMLoc IDLoc, const MCSubtargetInfo *STI);156157/// Emit a store instruction with an offset. If the offset is out of range158/// then it will be synthesized using the assembler temporary.159///160/// GetATReg() is a callback that can be used to obtain the current assembler161/// temporary and is only called when the assembler temporary is required. It162/// must handle the case where no assembler temporary is available (typically163/// by reporting an error).164void emitStoreWithImmOffset(unsigned Opcode, MCRegister SrcReg,165MCRegister BaseReg, int64_t Offset,166function_ref<unsigned()> GetATReg, SMLoc IDLoc,167const MCSubtargetInfo *STI);168void emitLoadWithImmOffset(unsigned Opcode, MCRegister DstReg,169MCRegister BaseReg, int64_t Offset,170MCRegister TmpReg, SMLoc IDLoc,171const MCSubtargetInfo *STI);172void emitGPRestore(int Offset, SMLoc IDLoc, const MCSubtargetInfo *STI);173174void forbidModuleDirective() { ModuleDirectiveAllowed = false; }175void reallowModuleDirective() { ModuleDirectiveAllowed = true; }176bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; }177178// This method enables template classes to set internal abi flags179// structure values.180template <class PredicateLibrary>181void updateABIInfo(const PredicateLibrary &P) {182ABI = P.getABI();183ABIFlagsSection.setAllFromPredicates(P);184}185186MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; }187const MipsABIInfo &getABI() const {188assert(ABI && "ABI hasn't been set!");189return *ABI;190}191192protected:193std::optional<MipsABIInfo> ABI;194MipsABIFlagsSection ABIFlagsSection;195196bool GPRInfoSet;197unsigned GPRBitMask;198int GPROffset;199200bool FPRInfoSet;201unsigned FPRBitMask;202int FPROffset;203204bool FrameInfoSet;205int FrameOffset;206unsigned FrameReg;207unsigned GPReg;208unsigned ReturnReg;209210private:211bool ModuleDirectiveAllowed;212};213214// This part is for ascii assembly output215class MipsTargetAsmStreamer : public MipsTargetStreamer {216formatted_raw_ostream &OS;217218public:219MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);220221void emitGPRel32Value(const MCExpr *) override;222void emitGPRel64Value(const MCExpr *) override;223void emitDTPRel32Value(const MCExpr *) override;224void emitDTPRel64Value(const MCExpr *) override;225void emitTPRel32Value(const MCExpr *) override;226void emitTPRel64Value(const MCExpr *) override;227228void emitDirectiveSetMicroMips() override;229void emitDirectiveSetNoMicroMips() override;230void emitDirectiveSetMips16() override;231void emitDirectiveSetNoMips16() override;232233void emitDirectiveSetReorder() override;234void emitDirectiveSetNoReorder() override;235void emitDirectiveSetMacro() override;236void emitDirectiveSetNoMacro() override;237void emitDirectiveSetMsa() override;238void emitDirectiveSetNoMsa() override;239void emitDirectiveSetMt() override;240void emitDirectiveSetNoMt() override;241void emitDirectiveSetCRC() override;242void emitDirectiveSetNoCRC() override;243void emitDirectiveSetVirt() override;244void emitDirectiveSetNoVirt() override;245void emitDirectiveSetGINV() override;246void emitDirectiveSetNoGINV() override;247void emitDirectiveSetAt() override;248void emitDirectiveSetAtWithArg(unsigned RegNo) override;249void emitDirectiveSetNoAt() override;250void emitDirectiveEnd(StringRef Name) override;251252void emitDirectiveEnt(const MCSymbol &Symbol) override;253void emitDirectiveAbiCalls() override;254void emitDirectiveNaN2008() override;255void emitDirectiveNaNLegacy() override;256void emitDirectiveOptionPic0() override;257void emitDirectiveOptionPic2() override;258void emitDirectiveInsn() override;259void emitFrame(MCRegister StackReg, unsigned StackSize,260MCRegister ReturnReg) override;261void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;262void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;263264void emitDirectiveSetArch(StringRef Arch) override;265void emitDirectiveSetMips0() override;266void emitDirectiveSetMips1() override;267void emitDirectiveSetMips2() override;268void emitDirectiveSetMips3() override;269void emitDirectiveSetMips4() override;270void emitDirectiveSetMips5() override;271void emitDirectiveSetMips32() override;272void emitDirectiveSetMips32R2() override;273void emitDirectiveSetMips32R3() override;274void emitDirectiveSetMips32R5() override;275void emitDirectiveSetMips32R6() override;276void emitDirectiveSetMips64() override;277void emitDirectiveSetMips64R2() override;278void emitDirectiveSetMips64R3() override;279void emitDirectiveSetMips64R5() override;280void emitDirectiveSetMips64R6() override;281void emitDirectiveSetDsp() override;282void emitDirectiveSetDspr2() override;283void emitDirectiveSetNoDsp() override;284void emitDirectiveSetMips3D() override;285void emitDirectiveSetNoMips3D() override;286void emitDirectiveSetPop() override;287void emitDirectiveSetPush() override;288void emitDirectiveSetSoftFloat() override;289void emitDirectiveSetHardFloat() override;290291// PIC support292void emitDirectiveCpAdd(unsigned RegNo) override;293void emitDirectiveCpLoad(unsigned RegNo) override;294void emitDirectiveCpLocal(unsigned RegNo) override;295296/// Emit a .cprestore directive. If the offset is out of range then it will297/// be synthesized using the assembler temporary.298///299/// GetATReg() is a callback that can be used to obtain the current assembler300/// temporary and is only called when the assembler temporary is required. It301/// must handle the case where no assembler temporary is available (typically302/// by reporting an error).303bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,304SMLoc IDLoc, const MCSubtargetInfo *STI) override;305void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,306const MCSymbol &Sym, bool IsReg) override;307void emitDirectiveCpreturn(unsigned SaveLocation,308bool SaveLocationIsRegister) override;309310// FP abiflags directives311void emitDirectiveModuleFP() override;312void emitDirectiveModuleOddSPReg() override;313void emitDirectiveModuleSoftFloat() override;314void emitDirectiveModuleHardFloat() override;315void emitDirectiveModuleMT() override;316void emitDirectiveModuleCRC() override;317void emitDirectiveModuleNoCRC() override;318void emitDirectiveModuleVirt() override;319void emitDirectiveModuleNoVirt() override;320void emitDirectiveModuleGINV() override;321void emitDirectiveModuleNoGINV() override;322void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;323void emitDirectiveSetOddSPReg() override;324void emitDirectiveSetNoOddSPReg() override;325};326327// This part is for ELF object output328class MipsTargetELFStreamer : public MipsTargetStreamer {329bool MicroMipsEnabled;330const MCSubtargetInfo &STI;331bool Pic;332333public:334bool isMicroMipsEnabled() const { return MicroMipsEnabled; }335MCELFStreamer &getStreamer();336MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);337338void setPic(bool Value) override { Pic = Value; }339340void emitLabel(MCSymbol *Symbol) override;341void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;342void finish() override;343344void emitGPRel32Value(const MCExpr *) override;345void emitGPRel64Value(const MCExpr *) override;346void emitDTPRel32Value(const MCExpr *) override;347void emitDTPRel64Value(const MCExpr *) override;348void emitTPRel32Value(const MCExpr *) override;349void emitTPRel64Value(const MCExpr *) override;350351void emitDirectiveSetMicroMips() override;352void emitDirectiveSetNoMicroMips() override;353void setUsesMicroMips() override;354void emitDirectiveSetMips16() override;355356void emitDirectiveSetNoReorder() override;357void emitDirectiveEnd(StringRef Name) override;358359void emitDirectiveEnt(const MCSymbol &Symbol) override;360void emitDirectiveAbiCalls() override;361void emitDirectiveNaN2008() override;362void emitDirectiveNaNLegacy() override;363void emitDirectiveOptionPic0() override;364void emitDirectiveOptionPic2() override;365void emitDirectiveInsn() override;366void emitFrame(MCRegister StackReg, unsigned StackSize,367MCRegister ReturnReg) override;368void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;369void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;370371// PIC support372void emitDirectiveCpAdd(unsigned RegNo) override;373void emitDirectiveCpLoad(unsigned RegNo) override;374void emitDirectiveCpLocal(unsigned RegNo) override;375bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,376SMLoc IDLoc, const MCSubtargetInfo *STI) override;377void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,378const MCSymbol &Sym, bool IsReg) override;379void emitDirectiveCpreturn(unsigned SaveLocation,380bool SaveLocationIsRegister) override;381382void emitMipsAbiFlags();383};384}385#endif386387388