387 lines · c
1//===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H10#define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H11 12#include "MCTargetDesc/MipsABIFlagsSection.h"13#include "MCTargetDesc/MipsABIInfo.h"14#include "llvm/ADT/STLExtras.h"15#include "llvm/MC/MCELFStreamer.h"16#include "llvm/MC/MCRegisterInfo.h"17#include "llvm/MC/MCStreamer.h"18 19namespace llvm {20 21class formatted_raw_ostream;22 23class MipsTargetStreamer : public MCTargetStreamer {24public:25 MipsTargetStreamer(MCStreamer &S);26 27 virtual void emitGPRel32Value(const MCExpr *);28 virtual void emitGPRel64Value(const MCExpr *);29 virtual void emitDTPRel32Value(const MCExpr *);30 virtual void emitDTPRel64Value(const MCExpr *);31 virtual void emitTPRel32Value(const MCExpr *);32 virtual void emitTPRel64Value(const MCExpr *);33 34 virtual void setPic(bool Value) {}35 36 virtual void emitDirectiveSetMicroMips();37 virtual void emitDirectiveSetNoMicroMips();38 virtual void setUsesMicroMips();39 virtual void emitDirectiveSetMips16();40 virtual void emitDirectiveSetNoMips16();41 42 virtual void emitDirectiveSetReorder();43 virtual void emitDirectiveSetNoReorder();44 virtual void emitDirectiveSetMacro();45 virtual void emitDirectiveSetNoMacro();46 virtual void emitDirectiveSetMsa();47 virtual void emitDirectiveSetNoMsa();48 virtual void emitDirectiveSetMt();49 virtual void emitDirectiveSetNoMt();50 virtual void emitDirectiveSetCRC();51 virtual void emitDirectiveSetNoCRC();52 virtual void emitDirectiveSetVirt();53 virtual void emitDirectiveSetNoVirt();54 virtual void emitDirectiveSetGINV();55 virtual void emitDirectiveSetNoGINV();56 virtual void emitDirectiveSetAt();57 virtual void emitDirectiveSetAtWithArg(unsigned RegNo);58 virtual void emitDirectiveSetNoAt();59 virtual void emitDirectiveEnd(StringRef Name);60 61 virtual void emitDirectiveEnt(const MCSymbol &Symbol);62 virtual void emitDirectiveAbiCalls();63 virtual void emitDirectiveNaN2008();64 virtual void emitDirectiveNaNLegacy();65 virtual void emitDirectiveOptionPic0();66 virtual void emitDirectiveOptionPic2();67 virtual void emitDirectiveInsn();68 virtual void emitFrame(MCRegister StackReg, unsigned StackSize,69 MCRegister ReturnReg);70 virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);71 virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);72 73 virtual void emitDirectiveSetArch(StringRef Arch);74 virtual void emitDirectiveSetMips0();75 virtual void emitDirectiveSetMips1();76 virtual void emitDirectiveSetMips2();77 virtual void emitDirectiveSetMips3();78 virtual void emitDirectiveSetMips4();79 virtual void emitDirectiveSetMips5();80 virtual void emitDirectiveSetMips32();81 virtual void emitDirectiveSetMips32R2();82 virtual void emitDirectiveSetMips32R3();83 virtual void emitDirectiveSetMips32R5();84 virtual void emitDirectiveSetMips32R6();85 virtual void emitDirectiveSetMips64();86 virtual void emitDirectiveSetMips64R2();87 virtual void emitDirectiveSetMips64R3();88 virtual void emitDirectiveSetMips64R5();89 virtual void emitDirectiveSetMips64R6();90 virtual void emitDirectiveSetDsp();91 virtual void emitDirectiveSetDspr2();92 virtual void emitDirectiveSetNoDsp();93 virtual void emitDirectiveSetMips3D();94 virtual void emitDirectiveSetNoMips3D();95 virtual void emitDirectiveSetPop();96 virtual void emitDirectiveSetPush();97 virtual void emitDirectiveSetSoftFloat();98 virtual void emitDirectiveSetHardFloat();99 100 // PIC support101 virtual void emitDirectiveCpAdd(MCRegister Reg);102 virtual void emitDirectiveCpLoad(MCRegister Reg);103 virtual void emitDirectiveCpLocal(MCRegister Reg);104 virtual bool emitDirectiveCpRestore(int Offset,105 function_ref<MCRegister()> GetATReg,106 SMLoc IDLoc, const MCSubtargetInfo *STI);107 virtual void emitDirectiveCpsetup(MCRegister Reg, int RegOrOffset,108 const MCSymbol &Sym, bool IsReg);109 virtual void emitDirectiveCpreturn(unsigned SaveLocation,110 bool SaveLocationIsRegister);111 112 // FP abiflags directives113 virtual void emitDirectiveModuleFP();114 virtual void emitDirectiveModuleOddSPReg();115 virtual void emitDirectiveModuleSoftFloat();116 virtual void emitDirectiveModuleHardFloat();117 virtual void emitDirectiveModuleMT();118 virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value);119 virtual void emitDirectiveSetOddSPReg();120 virtual void emitDirectiveSetNoOddSPReg();121 virtual void emitDirectiveModuleCRC();122 virtual void emitDirectiveModuleNoCRC();123 virtual void emitDirectiveModuleVirt();124 virtual void emitDirectiveModuleNoVirt();125 virtual void emitDirectiveModuleGINV();126 virtual void emitDirectiveModuleNoGINV();127 128 void emitR(unsigned Opcode, MCRegister Reg0, SMLoc IDLoc,129 const MCSubtargetInfo *STI);130 void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,131 const MCSubtargetInfo *STI);132 void emitRX(unsigned Opcode, MCRegister Reg0, MCOperand Op1, SMLoc IDLoc,133 const MCSubtargetInfo *STI);134 void emitRI(unsigned Opcode, MCRegister Reg0, int32_t Imm, SMLoc IDLoc,135 const MCSubtargetInfo *STI);136 void emitRR(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, SMLoc IDLoc,137 const MCSubtargetInfo *STI);138 void emitRRX(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, MCOperand Op2,139 SMLoc IDLoc, const MCSubtargetInfo *STI);140 void emitRRR(unsigned Opcode, MCRegister Reg0, MCRegister Reg1,141 MCRegister Reg2, SMLoc IDLoc, const MCSubtargetInfo *STI);142 void emitRRRX(unsigned Opcode, MCRegister Reg0, MCRegister Reg1,143 MCRegister Reg2, MCOperand Op3, SMLoc IDLoc,144 const MCSubtargetInfo *STI);145 void emitRRI(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, int16_t Imm,146 SMLoc IDLoc, const MCSubtargetInfo *STI);147 void emitRRIII(unsigned Opcode, MCRegister Reg0, MCRegister Reg1,148 int16_t Imm0, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,149 const MCSubtargetInfo *STI);150 void emitAddu(MCRegister DstReg, MCRegister SrcReg, MCRegister TrgReg,151 bool Is64Bit, const MCSubtargetInfo *STI);152 void emitDSLL(MCRegister DstReg, MCRegister SrcReg, int16_t ShiftAmount,153 SMLoc IDLoc, const MCSubtargetInfo *STI);154 void emitEmptyDelaySlot(bool hasShortDelaySlot, SMLoc IDLoc,155 const MCSubtargetInfo *STI);156 void emitNop(SMLoc IDLoc, const MCSubtargetInfo *STI);157 158 /// Emit a store instruction with an offset. If the offset is out of range159 /// then it will be synthesized using the assembler temporary.160 ///161 /// GetATReg() is a callback that can be used to obtain the current assembler162 /// temporary and is only called when the assembler temporary is required. It163 /// must handle the case where no assembler temporary is available (typically164 /// by reporting an error).165 void emitStoreWithImmOffset(unsigned Opcode, MCRegister SrcReg,166 MCRegister BaseReg, int64_t Offset,167 function_ref<MCRegister()> GetATReg, SMLoc IDLoc,168 const MCSubtargetInfo *STI);169 void emitLoadWithImmOffset(unsigned Opcode, MCRegister DstReg,170 MCRegister BaseReg, int64_t Offset,171 MCRegister TmpReg, SMLoc IDLoc,172 const MCSubtargetInfo *STI);173 void emitGPRestore(int Offset, SMLoc IDLoc, const MCSubtargetInfo *STI);174 175 void forbidModuleDirective() { ModuleDirectiveAllowed = false; }176 void reallowModuleDirective() { ModuleDirectiveAllowed = true; }177 bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; }178 179 // This method enables template classes to set internal abi flags180 // structure values.181 template <class PredicateLibrary>182 void updateABIInfo(const PredicateLibrary &P) {183 ABI = P.getABI();184 ABIFlagsSection.setAllFromPredicates(P);185 }186 187 MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; }188 const MipsABIInfo &getABI() const {189 assert(ABI && "ABI hasn't been set!");190 return *ABI;191 }192 193protected:194 std::optional<MipsABIInfo> ABI;195 MipsABIFlagsSection ABIFlagsSection;196 197 bool GPRInfoSet;198 unsigned GPRBitMask;199 int GPROffset;200 201 bool FPRInfoSet;202 unsigned FPRBitMask;203 int FPROffset;204 205 bool FrameInfoSet;206 int FrameOffset;207 unsigned FrameReg;208 MCRegister GPReg;209 unsigned ReturnReg;210 211private:212 bool ModuleDirectiveAllowed;213};214 215// This part is for ascii assembly output216class MipsTargetAsmStreamer : public MipsTargetStreamer {217 formatted_raw_ostream &OS;218 219public:220 MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);221 222 void emitGPRel32Value(const MCExpr *) override;223 void emitGPRel64Value(const MCExpr *) override;224 void emitDTPRel32Value(const MCExpr *) override;225 void emitDTPRel64Value(const MCExpr *) override;226 void emitTPRel32Value(const MCExpr *) override;227 void emitTPRel64Value(const MCExpr *) override;228 229 void emitDirectiveSetMicroMips() override;230 void emitDirectiveSetNoMicroMips() override;231 void emitDirectiveSetMips16() override;232 void emitDirectiveSetNoMips16() override;233 234 void emitDirectiveSetReorder() override;235 void emitDirectiveSetNoReorder() override;236 void emitDirectiveSetMacro() override;237 void emitDirectiveSetNoMacro() override;238 void emitDirectiveSetMsa() override;239 void emitDirectiveSetNoMsa() override;240 void emitDirectiveSetMt() override;241 void emitDirectiveSetNoMt() override;242 void emitDirectiveSetCRC() override;243 void emitDirectiveSetNoCRC() override;244 void emitDirectiveSetVirt() override;245 void emitDirectiveSetNoVirt() override;246 void emitDirectiveSetGINV() override;247 void emitDirectiveSetNoGINV() override;248 void emitDirectiveSetAt() override;249 void emitDirectiveSetAtWithArg(unsigned RegNo) override;250 void emitDirectiveSetNoAt() override;251 void emitDirectiveEnd(StringRef Name) override;252 253 void emitDirectiveEnt(const MCSymbol &Symbol) override;254 void emitDirectiveAbiCalls() override;255 void emitDirectiveNaN2008() override;256 void emitDirectiveNaNLegacy() override;257 void emitDirectiveOptionPic0() override;258 void emitDirectiveOptionPic2() override;259 void emitDirectiveInsn() override;260 void emitFrame(MCRegister StackReg, unsigned StackSize,261 MCRegister ReturnReg) override;262 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;263 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;264 265 void emitDirectiveSetArch(StringRef Arch) override;266 void emitDirectiveSetMips0() override;267 void emitDirectiveSetMips1() override;268 void emitDirectiveSetMips2() override;269 void emitDirectiveSetMips3() override;270 void emitDirectiveSetMips4() override;271 void emitDirectiveSetMips5() override;272 void emitDirectiveSetMips32() override;273 void emitDirectiveSetMips32R2() override;274 void emitDirectiveSetMips32R3() override;275 void emitDirectiveSetMips32R5() override;276 void emitDirectiveSetMips32R6() override;277 void emitDirectiveSetMips64() override;278 void emitDirectiveSetMips64R2() override;279 void emitDirectiveSetMips64R3() override;280 void emitDirectiveSetMips64R5() override;281 void emitDirectiveSetMips64R6() override;282 void emitDirectiveSetDsp() override;283 void emitDirectiveSetDspr2() override;284 void emitDirectiveSetNoDsp() override;285 void emitDirectiveSetMips3D() override;286 void emitDirectiveSetNoMips3D() override;287 void emitDirectiveSetPop() override;288 void emitDirectiveSetPush() override;289 void emitDirectiveSetSoftFloat() override;290 void emitDirectiveSetHardFloat() override;291 292 // PIC support293 void emitDirectiveCpAdd(MCRegister Reg) override;294 void emitDirectiveCpLoad(MCRegister Reg) override;295 void emitDirectiveCpLocal(MCRegister Reg) override;296 297 /// Emit a .cprestore directive. If the offset is out of range then it will298 /// be synthesized using the assembler temporary.299 ///300 /// GetATReg() is a callback that can be used to obtain the current assembler301 /// temporary and is only called when the assembler temporary is required. It302 /// must handle the case where no assembler temporary is available (typically303 /// by reporting an error).304 bool emitDirectiveCpRestore(int Offset, function_ref<MCRegister()> GetATReg,305 SMLoc IDLoc, const MCSubtargetInfo *STI) override;306 void emitDirectiveCpsetup(MCRegister Reg, int RegOrOffset,307 const MCSymbol &Sym, bool IsReg) override;308 void emitDirectiveCpreturn(unsigned SaveLocation,309 bool SaveLocationIsRegister) override;310 311 // FP abiflags directives312 void emitDirectiveModuleFP() override;313 void emitDirectiveModuleOddSPReg() override;314 void emitDirectiveModuleSoftFloat() override;315 void emitDirectiveModuleHardFloat() override;316 void emitDirectiveModuleMT() override;317 void emitDirectiveModuleCRC() override;318 void emitDirectiveModuleNoCRC() override;319 void emitDirectiveModuleVirt() override;320 void emitDirectiveModuleNoVirt() override;321 void emitDirectiveModuleGINV() override;322 void emitDirectiveModuleNoGINV() override;323 void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;324 void emitDirectiveSetOddSPReg() override;325 void emitDirectiveSetNoOddSPReg() override;326};327 328// This part is for ELF object output329class MipsTargetELFStreamer : public MipsTargetStreamer {330 bool MicroMipsEnabled;331 const MCSubtargetInfo &STI;332 bool Pic;333 334public:335 bool isMicroMipsEnabled() const { return MicroMipsEnabled; }336 MCELFStreamer &getStreamer();337 MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);338 339 void setPic(bool Value) override { Pic = Value; }340 341 void emitLabel(MCSymbol *Symbol) override;342 void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;343 void finish() override;344 345 void emitGPRel32Value(const MCExpr *) override;346 void emitGPRel64Value(const MCExpr *) override;347 void emitDTPRel32Value(const MCExpr *) override;348 void emitDTPRel64Value(const MCExpr *) override;349 void emitTPRel32Value(const MCExpr *) override;350 void emitTPRel64Value(const MCExpr *) override;351 352 void emitDirectiveSetMicroMips() override;353 void emitDirectiveSetNoMicroMips() override;354 void setUsesMicroMips() override;355 void emitDirectiveSetMips16() override;356 357 void emitDirectiveSetNoReorder() override;358 void emitDirectiveEnd(StringRef Name) override;359 360 void emitDirectiveEnt(const MCSymbol &Symbol) override;361 void emitDirectiveAbiCalls() override;362 void emitDirectiveNaN2008() override;363 void emitDirectiveNaNLegacy() override;364 void emitDirectiveOptionPic0() override;365 void emitDirectiveOptionPic2() override;366 void emitDirectiveInsn() override;367 void emitFrame(MCRegister StackReg, unsigned StackSize,368 MCRegister ReturnReg) override;369 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;370 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;371 372 // PIC support373 void emitDirectiveCpAdd(MCRegister Reg) override;374 void emitDirectiveCpLoad(MCRegister Reg) override;375 void emitDirectiveCpLocal(MCRegister Reg) override;376 bool emitDirectiveCpRestore(int Offset, function_ref<MCRegister()> GetATReg,377 SMLoc IDLoc, const MCSubtargetInfo *STI) override;378 void emitDirectiveCpsetup(MCRegister Reg, int RegOrOffset,379 const MCSymbol &Sym, bool IsReg) override;380 void emitDirectiveCpreturn(unsigned SaveLocation,381 bool SaveLocationIsRegister) override;382 383 void emitMipsAbiFlags();384};385}386#endif387