1*9880d681SAndroid Build Coastguard Worker //===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H 11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/MipsABIFlagsSection.h" 14*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/MipsABIInfo.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Optional.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCELFStreamer.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker struct MipsABIFlagsSection; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker class MipsTargetStreamer : public MCTargetStreamer { 26*9880d681SAndroid Build Coastguard Worker public: 27*9880d681SAndroid Build Coastguard Worker MipsTargetStreamer(MCStreamer &S); 28*9880d681SAndroid Build Coastguard Worker setPic(bool Value)29*9880d681SAndroid Build Coastguard Worker virtual void setPic(bool Value) {} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMicroMips(); 32*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoMicroMips(); 33*9880d681SAndroid Build Coastguard Worker virtual void setUsesMicroMips(); 34*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips16(); 35*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoMips16(); 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetReorder(); 38*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoReorder(); 39*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMacro(); 40*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoMacro(); 41*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMsa(); 42*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoMsa(); 43*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetAt(); 44*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetAtWithArg(unsigned RegNo); 45*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoAt(); 46*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveEnd(StringRef Name); 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveEnt(const MCSymbol &Symbol); 49*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveAbiCalls(); 50*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveNaN2008(); 51*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveNaNLegacy(); 52*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveOptionPic0(); 53*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveOptionPic2(); 54*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveInsn(); 55*9880d681SAndroid Build Coastguard Worker virtual void emitFrame(unsigned StackReg, unsigned StackSize, 56*9880d681SAndroid Build Coastguard Worker unsigned ReturnReg); 57*9880d681SAndroid Build Coastguard Worker virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff); 58*9880d681SAndroid Build Coastguard Worker virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff); 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetArch(StringRef Arch); 61*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips0(); 62*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips1(); 63*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips2(); 64*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips3(); 65*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips4(); 66*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips5(); 67*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips32(); 68*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips32R2(); 69*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips32R3(); 70*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips32R5(); 71*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips32R6(); 72*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips64(); 73*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips64R2(); 74*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips64R3(); 75*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips64R5(); 76*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetMips64R6(); 77*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetDsp(); 78*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoDsp(); 79*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetPop(); 80*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetPush(); 81*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetSoftFloat(); 82*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetHardFloat(); 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker // PIC support 85*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveCpLoad(unsigned RegNo); 86*9880d681SAndroid Build Coastguard Worker virtual bool emitDirectiveCpRestore(int Offset, 87*9880d681SAndroid Build Coastguard Worker function_ref<unsigned()> GetATReg, 88*9880d681SAndroid Build Coastguard Worker SMLoc IDLoc, const MCSubtargetInfo *STI); 89*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset, 90*9880d681SAndroid Build Coastguard Worker const MCSymbol &Sym, bool IsReg); 91*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveCpreturn(unsigned SaveLocation, 92*9880d681SAndroid Build Coastguard Worker bool SaveLocationIsRegister); 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker // FP abiflags directives 95*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveModuleFP(); 96*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveModuleOddSPReg(); 97*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveModuleSoftFloat(); 98*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveModuleHardFloat(); 99*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value); 100*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetOddSPReg(); 101*9880d681SAndroid Build Coastguard Worker virtual void emitDirectiveSetNoOddSPReg(); 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker void emitR(unsigned Opcode, unsigned Reg0, SMLoc IDLoc, 104*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 105*9880d681SAndroid Build Coastguard Worker void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc, 106*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 107*9880d681SAndroid Build Coastguard Worker void emitRX(unsigned Opcode, unsigned Reg0, MCOperand Op1, SMLoc IDLoc, 108*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 109*9880d681SAndroid Build Coastguard Worker void emitRI(unsigned Opcode, unsigned Reg0, int32_t Imm, SMLoc IDLoc, 110*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 111*9880d681SAndroid Build Coastguard Worker void emitRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, SMLoc IDLoc, 112*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 113*9880d681SAndroid Build Coastguard Worker void emitRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, MCOperand Op2, 114*9880d681SAndroid Build Coastguard Worker SMLoc IDLoc, const MCSubtargetInfo *STI); 115*9880d681SAndroid Build Coastguard Worker void emitRRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2, 116*9880d681SAndroid Build Coastguard Worker SMLoc IDLoc, const MCSubtargetInfo *STI); 117*9880d681SAndroid Build Coastguard Worker void emitRRI(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm, 118*9880d681SAndroid Build Coastguard Worker SMLoc IDLoc, const MCSubtargetInfo *STI); 119*9880d681SAndroid Build Coastguard Worker void emitAddu(unsigned DstReg, unsigned SrcReg, unsigned TrgReg, bool Is64Bit, 120*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 121*9880d681SAndroid Build Coastguard Worker void emitDSLL(unsigned DstReg, unsigned SrcReg, int16_t ShiftAmount, 122*9880d681SAndroid Build Coastguard Worker SMLoc IDLoc, const MCSubtargetInfo *STI); 123*9880d681SAndroid Build Coastguard Worker void emitEmptyDelaySlot(bool hasShortDelaySlot, SMLoc IDLoc, 124*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 125*9880d681SAndroid Build Coastguard Worker void emitNop(SMLoc IDLoc, const MCSubtargetInfo *STI); 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker /// Emit a store instruction with an offset. If the offset is out of range 128*9880d681SAndroid Build Coastguard Worker /// then it will be synthesized using the assembler temporary. 129*9880d681SAndroid Build Coastguard Worker /// 130*9880d681SAndroid Build Coastguard Worker /// GetATReg() is a callback that can be used to obtain the current assembler 131*9880d681SAndroid Build Coastguard Worker /// temporary and is only called when the assembler temporary is required. It 132*9880d681SAndroid Build Coastguard Worker /// must handle the case where no assembler temporary is available (typically 133*9880d681SAndroid Build Coastguard Worker /// by reporting an error). 134*9880d681SAndroid Build Coastguard Worker void emitStoreWithImmOffset(unsigned Opcode, unsigned SrcReg, 135*9880d681SAndroid Build Coastguard Worker unsigned BaseReg, int64_t Offset, 136*9880d681SAndroid Build Coastguard Worker function_ref<unsigned()> GetATReg, SMLoc IDLoc, 137*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 138*9880d681SAndroid Build Coastguard Worker void emitStoreWithSymOffset(unsigned Opcode, unsigned SrcReg, 139*9880d681SAndroid Build Coastguard Worker unsigned BaseReg, MCOperand &HiOperand, 140*9880d681SAndroid Build Coastguard Worker MCOperand &LoOperand, unsigned ATReg, SMLoc IDLoc, 141*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 142*9880d681SAndroid Build Coastguard Worker void emitLoadWithImmOffset(unsigned Opcode, unsigned DstReg, unsigned BaseReg, 143*9880d681SAndroid Build Coastguard Worker int64_t Offset, unsigned TmpReg, SMLoc IDLoc, 144*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 145*9880d681SAndroid Build Coastguard Worker void emitLoadWithSymOffset(unsigned Opcode, unsigned DstReg, unsigned BaseReg, 146*9880d681SAndroid Build Coastguard Worker MCOperand &HiOperand, MCOperand &LoOperand, 147*9880d681SAndroid Build Coastguard Worker unsigned ATReg, SMLoc IDLoc, 148*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI); 149*9880d681SAndroid Build Coastguard Worker void emitGPRestore(int Offset, SMLoc IDLoc, const MCSubtargetInfo *STI); 150*9880d681SAndroid Build Coastguard Worker forbidModuleDirective()151*9880d681SAndroid Build Coastguard Worker void forbidModuleDirective() { ModuleDirectiveAllowed = false; } reallowModuleDirective()152*9880d681SAndroid Build Coastguard Worker void reallowModuleDirective() { ModuleDirectiveAllowed = true; } isModuleDirectiveAllowed()153*9880d681SAndroid Build Coastguard Worker bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; } 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker // This method enables template classes to set internal abi flags 156*9880d681SAndroid Build Coastguard Worker // structure values. 157*9880d681SAndroid Build Coastguard Worker template <class PredicateLibrary> updateABIInfo(const PredicateLibrary & P)158*9880d681SAndroid Build Coastguard Worker void updateABIInfo(const PredicateLibrary &P) { 159*9880d681SAndroid Build Coastguard Worker ABI = P.getABI(); 160*9880d681SAndroid Build Coastguard Worker ABIFlagsSection.setAllFromPredicates(P); 161*9880d681SAndroid Build Coastguard Worker } 162*9880d681SAndroid Build Coastguard Worker getABIFlagsSection()163*9880d681SAndroid Build Coastguard Worker MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; } getABI()164*9880d681SAndroid Build Coastguard Worker const MipsABIInfo &getABI() const { 165*9880d681SAndroid Build Coastguard Worker assert(ABI.hasValue() && "ABI hasn't been set!"); 166*9880d681SAndroid Build Coastguard Worker return *ABI; 167*9880d681SAndroid Build Coastguard Worker } 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker protected: 170*9880d681SAndroid Build Coastguard Worker llvm::Optional<MipsABIInfo> ABI; 171*9880d681SAndroid Build Coastguard Worker MipsABIFlagsSection ABIFlagsSection; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker bool GPRInfoSet; 174*9880d681SAndroid Build Coastguard Worker unsigned GPRBitMask; 175*9880d681SAndroid Build Coastguard Worker int GPROffset; 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker bool FPRInfoSet; 178*9880d681SAndroid Build Coastguard Worker unsigned FPRBitMask; 179*9880d681SAndroid Build Coastguard Worker int FPROffset; 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker bool FrameInfoSet; 182*9880d681SAndroid Build Coastguard Worker int FrameOffset; 183*9880d681SAndroid Build Coastguard Worker unsigned FrameReg; 184*9880d681SAndroid Build Coastguard Worker unsigned ReturnReg; 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker private: 187*9880d681SAndroid Build Coastguard Worker bool ModuleDirectiveAllowed; 188*9880d681SAndroid Build Coastguard Worker }; 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker // This part is for ascii assembly output 191*9880d681SAndroid Build Coastguard Worker class MipsTargetAsmStreamer : public MipsTargetStreamer { 192*9880d681SAndroid Build Coastguard Worker formatted_raw_ostream &OS; 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker public: 195*9880d681SAndroid Build Coastguard Worker MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); 196*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMicroMips() override; 197*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoMicroMips() override; 198*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips16() override; 199*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoMips16() override; 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetReorder() override; 202*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoReorder() override; 203*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMacro() override; 204*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoMacro() override; 205*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMsa() override; 206*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoMsa() override; 207*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetAt() override; 208*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetAtWithArg(unsigned RegNo) override; 209*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoAt() override; 210*9880d681SAndroid Build Coastguard Worker void emitDirectiveEnd(StringRef Name) override; 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker void emitDirectiveEnt(const MCSymbol &Symbol) override; 213*9880d681SAndroid Build Coastguard Worker void emitDirectiveAbiCalls() override; 214*9880d681SAndroid Build Coastguard Worker void emitDirectiveNaN2008() override; 215*9880d681SAndroid Build Coastguard Worker void emitDirectiveNaNLegacy() override; 216*9880d681SAndroid Build Coastguard Worker void emitDirectiveOptionPic0() override; 217*9880d681SAndroid Build Coastguard Worker void emitDirectiveOptionPic2() override; 218*9880d681SAndroid Build Coastguard Worker void emitDirectiveInsn() override; 219*9880d681SAndroid Build Coastguard Worker void emitFrame(unsigned StackReg, unsigned StackSize, 220*9880d681SAndroid Build Coastguard Worker unsigned ReturnReg) override; 221*9880d681SAndroid Build Coastguard Worker void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override; 222*9880d681SAndroid Build Coastguard Worker void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override; 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetArch(StringRef Arch) override; 225*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips0() override; 226*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips1() override; 227*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips2() override; 228*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips3() override; 229*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips4() override; 230*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips5() override; 231*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips32() override; 232*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips32R2() override; 233*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips32R3() override; 234*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips32R5() override; 235*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips32R6() override; 236*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips64() override; 237*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips64R2() override; 238*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips64R3() override; 239*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips64R5() override; 240*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips64R6() override; 241*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetDsp() override; 242*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoDsp() override; 243*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetPop() override; 244*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetPush() override; 245*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetSoftFloat() override; 246*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetHardFloat() override; 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker // PIC support 249*9880d681SAndroid Build Coastguard Worker void emitDirectiveCpLoad(unsigned RegNo) override; 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker /// Emit a .cprestore directive. If the offset is out of range then it will 252*9880d681SAndroid Build Coastguard Worker /// be synthesized using the assembler temporary. 253*9880d681SAndroid Build Coastguard Worker /// 254*9880d681SAndroid Build Coastguard Worker /// GetATReg() is a callback that can be used to obtain the current assembler 255*9880d681SAndroid Build Coastguard Worker /// temporary and is only called when the assembler temporary is required. It 256*9880d681SAndroid Build Coastguard Worker /// must handle the case where no assembler temporary is available (typically 257*9880d681SAndroid Build Coastguard Worker /// by reporting an error). 258*9880d681SAndroid Build Coastguard Worker bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg, 259*9880d681SAndroid Build Coastguard Worker SMLoc IDLoc, const MCSubtargetInfo *STI) override; 260*9880d681SAndroid Build Coastguard Worker void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset, 261*9880d681SAndroid Build Coastguard Worker const MCSymbol &Sym, bool IsReg) override; 262*9880d681SAndroid Build Coastguard Worker void emitDirectiveCpreturn(unsigned SaveLocation, 263*9880d681SAndroid Build Coastguard Worker bool SaveLocationIsRegister) override; 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker // FP abiflags directives 266*9880d681SAndroid Build Coastguard Worker void emitDirectiveModuleFP() override; 267*9880d681SAndroid Build Coastguard Worker void emitDirectiveModuleOddSPReg() override; 268*9880d681SAndroid Build Coastguard Worker void emitDirectiveModuleSoftFloat() override; 269*9880d681SAndroid Build Coastguard Worker void emitDirectiveModuleHardFloat() override; 270*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override; 271*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetOddSPReg() override; 272*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoOddSPReg() override; 273*9880d681SAndroid Build Coastguard Worker }; 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker // This part is for ELF object output 276*9880d681SAndroid Build Coastguard Worker class MipsTargetELFStreamer : public MipsTargetStreamer { 277*9880d681SAndroid Build Coastguard Worker bool MicroMipsEnabled; 278*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI; 279*9880d681SAndroid Build Coastguard Worker bool Pic; 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker public: isMicroMipsEnabled()282*9880d681SAndroid Build Coastguard Worker bool isMicroMipsEnabled() const { return MicroMipsEnabled; } 283*9880d681SAndroid Build Coastguard Worker MCELFStreamer &getStreamer(); 284*9880d681SAndroid Build Coastguard Worker MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); 285*9880d681SAndroid Build Coastguard Worker setPic(bool Value)286*9880d681SAndroid Build Coastguard Worker void setPic(bool Value) override { Pic = Value; } 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker void emitLabel(MCSymbol *Symbol) override; 289*9880d681SAndroid Build Coastguard Worker void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; 290*9880d681SAndroid Build Coastguard Worker void finish() override; 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMicroMips() override; 293*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoMicroMips() override; 294*9880d681SAndroid Build Coastguard Worker void setUsesMicroMips() override; 295*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetMips16() override; 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker void emitDirectiveSetNoReorder() override; 298*9880d681SAndroid Build Coastguard Worker void emitDirectiveEnd(StringRef Name) override; 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker void emitDirectiveEnt(const MCSymbol &Symbol) override; 301*9880d681SAndroid Build Coastguard Worker void emitDirectiveAbiCalls() override; 302*9880d681SAndroid Build Coastguard Worker void emitDirectiveNaN2008() override; 303*9880d681SAndroid Build Coastguard Worker void emitDirectiveNaNLegacy() override; 304*9880d681SAndroid Build Coastguard Worker void emitDirectiveOptionPic0() override; 305*9880d681SAndroid Build Coastguard Worker void emitDirectiveOptionPic2() override; 306*9880d681SAndroid Build Coastguard Worker void emitDirectiveInsn() override; 307*9880d681SAndroid Build Coastguard Worker void emitFrame(unsigned StackReg, unsigned StackSize, 308*9880d681SAndroid Build Coastguard Worker unsigned ReturnReg) override; 309*9880d681SAndroid Build Coastguard Worker void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override; 310*9880d681SAndroid Build Coastguard Worker void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override; 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker // PIC support 313*9880d681SAndroid Build Coastguard Worker void emitDirectiveCpLoad(unsigned RegNo) override; 314*9880d681SAndroid Build Coastguard Worker bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg, 315*9880d681SAndroid Build Coastguard Worker SMLoc IDLoc, const MCSubtargetInfo *STI) override; 316*9880d681SAndroid Build Coastguard Worker void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset, 317*9880d681SAndroid Build Coastguard Worker const MCSymbol &Sym, bool IsReg) override; 318*9880d681SAndroid Build Coastguard Worker void emitDirectiveCpreturn(unsigned SaveLocation, 319*9880d681SAndroid Build Coastguard Worker bool SaveLocationIsRegister) override; 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Worker void emitMipsAbiFlags(); 322*9880d681SAndroid Build Coastguard Worker }; 323*9880d681SAndroid Build Coastguard Worker } 324*9880d681SAndroid Build Coastguard Worker #endif 325