1 //===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H 11 #define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H 12 13 #include "MCTargetDesc/MipsABIFlagsSection.h" 14 #include "MCTargetDesc/MipsABIInfo.h" 15 #include "llvm/MC/MCELFStreamer.h" 16 #include "llvm/MC/MCRegisterInfo.h" 17 #include "llvm/MC/MCStreamer.h" 18 19 namespace llvm { 20 21 struct MipsABIFlagsSection; 22 23 class MipsTargetStreamer : public MCTargetStreamer { 24 public: 25 MipsTargetStreamer(MCStreamer &S); 26 virtual void emitDirectiveSetMicroMips(); 27 virtual void emitDirectiveSetNoMicroMips(); 28 virtual void emitDirectiveSetMips16(); 29 virtual void emitDirectiveSetNoMips16(); 30 31 virtual void emitDirectiveSetReorder(); 32 virtual void emitDirectiveSetNoReorder(); 33 virtual void emitDirectiveSetMacro(); 34 virtual void emitDirectiveSetNoMacro(); 35 virtual void emitDirectiveSetMsa(); 36 virtual void emitDirectiveSetNoMsa(); 37 virtual void emitDirectiveSetAt(); 38 virtual void emitDirectiveSetAtWithArg(unsigned RegNo); 39 virtual void emitDirectiveSetNoAt(); 40 virtual void emitDirectiveEnd(StringRef Name); 41 42 virtual void emitDirectiveEnt(const MCSymbol &Symbol); 43 virtual void emitDirectiveAbiCalls(); 44 virtual void emitDirectiveNaN2008(); 45 virtual void emitDirectiveNaNLegacy(); 46 virtual void emitDirectiveOptionPic0(); 47 virtual void emitDirectiveOptionPic2(); 48 virtual void emitDirectiveInsn(); 49 virtual void emitFrame(unsigned StackReg, unsigned StackSize, 50 unsigned ReturnReg); 51 virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff); 52 virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff); 53 54 virtual void emitDirectiveSetArch(StringRef Arch); 55 virtual void emitDirectiveSetMips0(); 56 virtual void emitDirectiveSetMips1(); 57 virtual void emitDirectiveSetMips2(); 58 virtual void emitDirectiveSetMips3(); 59 virtual void emitDirectiveSetMips4(); 60 virtual void emitDirectiveSetMips5(); 61 virtual void emitDirectiveSetMips32(); 62 virtual void emitDirectiveSetMips32R2(); 63 virtual void emitDirectiveSetMips32R3(); 64 virtual void emitDirectiveSetMips32R5(); 65 virtual void emitDirectiveSetMips32R6(); 66 virtual void emitDirectiveSetMips64(); 67 virtual void emitDirectiveSetMips64R2(); 68 virtual void emitDirectiveSetMips64R3(); 69 virtual void emitDirectiveSetMips64R5(); 70 virtual void emitDirectiveSetMips64R6(); 71 virtual void emitDirectiveSetDsp(); 72 virtual void emitDirectiveSetNoDsp(); 73 virtual void emitDirectiveSetPop(); 74 virtual void emitDirectiveSetPush(); 75 virtual void emitDirectiveSetSoftFloat(); 76 virtual void emitDirectiveSetHardFloat(); 77 78 // PIC support 79 virtual void emitDirectiveCpLoad(unsigned RegNo); 80 virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset, 81 const MCSymbol &Sym, bool IsReg); 82 83 // FP abiflags directives 84 virtual void emitDirectiveModuleFP(); 85 virtual void emitDirectiveModuleOddSPReg(); 86 virtual void emitDirectiveModuleSoftFloat(); 87 virtual void emitDirectiveModuleHardFloat(); 88 virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value); 89 virtual void emitDirectiveSetOddSPReg(); 90 virtual void emitDirectiveSetNoOddSPReg(); 91 forbidModuleDirective()92 void forbidModuleDirective() { ModuleDirectiveAllowed = false; } reallowModuleDirective()93 void reallowModuleDirective() { ModuleDirectiveAllowed = true; } isModuleDirectiveAllowed()94 bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; } 95 96 // This method enables template classes to set internal abi flags 97 // structure values. 98 template <class PredicateLibrary> updateABIInfo(const PredicateLibrary & P)99 void updateABIInfo(const PredicateLibrary &P) { 100 ABI = &P.getABI(); 101 ABIFlagsSection.setAllFromPredicates(P); 102 } 103 getABIFlagsSection()104 MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; } getABI()105 const MipsABIInfo &getABI() const { 106 assert(ABI && "ABI hasn't been set!"); 107 return *ABI; 108 } 109 110 protected: 111 const MipsABIInfo *ABI; 112 MipsABIFlagsSection ABIFlagsSection; 113 114 bool GPRInfoSet; 115 unsigned GPRBitMask; 116 int GPROffset; 117 118 bool FPRInfoSet; 119 unsigned FPRBitMask; 120 int FPROffset; 121 122 bool FrameInfoSet; 123 int FrameOffset; 124 unsigned FrameReg; 125 unsigned ReturnReg; 126 127 private: 128 bool ModuleDirectiveAllowed; 129 }; 130 131 // This part is for ascii assembly output 132 class MipsTargetAsmStreamer : public MipsTargetStreamer { 133 formatted_raw_ostream &OS; 134 135 public: 136 MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); 137 void emitDirectiveSetMicroMips() override; 138 void emitDirectiveSetNoMicroMips() override; 139 void emitDirectiveSetMips16() override; 140 void emitDirectiveSetNoMips16() override; 141 142 void emitDirectiveSetReorder() override; 143 void emitDirectiveSetNoReorder() override; 144 void emitDirectiveSetMacro() override; 145 void emitDirectiveSetNoMacro() override; 146 void emitDirectiveSetMsa() override; 147 void emitDirectiveSetNoMsa() override; 148 void emitDirectiveSetAt() override; 149 void emitDirectiveSetAtWithArg(unsigned RegNo) override; 150 void emitDirectiveSetNoAt() override; 151 void emitDirectiveEnd(StringRef Name) override; 152 153 void emitDirectiveEnt(const MCSymbol &Symbol) override; 154 void emitDirectiveAbiCalls() override; 155 void emitDirectiveNaN2008() override; 156 void emitDirectiveNaNLegacy() override; 157 void emitDirectiveOptionPic0() override; 158 void emitDirectiveOptionPic2() override; 159 void emitDirectiveInsn() override; 160 void emitFrame(unsigned StackReg, unsigned StackSize, 161 unsigned ReturnReg) override; 162 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override; 163 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override; 164 165 void emitDirectiveSetArch(StringRef Arch) override; 166 void emitDirectiveSetMips0() override; 167 void emitDirectiveSetMips1() override; 168 void emitDirectiveSetMips2() override; 169 void emitDirectiveSetMips3() override; 170 void emitDirectiveSetMips4() override; 171 void emitDirectiveSetMips5() override; 172 void emitDirectiveSetMips32() override; 173 void emitDirectiveSetMips32R2() override; 174 void emitDirectiveSetMips32R3() override; 175 void emitDirectiveSetMips32R5() override; 176 void emitDirectiveSetMips32R6() override; 177 void emitDirectiveSetMips64() override; 178 void emitDirectiveSetMips64R2() override; 179 void emitDirectiveSetMips64R3() override; 180 void emitDirectiveSetMips64R5() override; 181 void emitDirectiveSetMips64R6() override; 182 void emitDirectiveSetDsp() override; 183 void emitDirectiveSetNoDsp() override; 184 void emitDirectiveSetPop() override; 185 void emitDirectiveSetPush() override; 186 void emitDirectiveSetSoftFloat() override; 187 void emitDirectiveSetHardFloat() override; 188 189 // PIC support 190 void emitDirectiveCpLoad(unsigned RegNo) override; 191 void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset, 192 const MCSymbol &Sym, bool IsReg) override; 193 194 // FP abiflags directives 195 void emitDirectiveModuleFP() override; 196 void emitDirectiveModuleOddSPReg() override; 197 void emitDirectiveModuleSoftFloat() override; 198 void emitDirectiveModuleHardFloat() override; 199 void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override; 200 void emitDirectiveSetOddSPReg() override; 201 void emitDirectiveSetNoOddSPReg() override; 202 }; 203 204 // This part is for ELF object output 205 class MipsTargetELFStreamer : public MipsTargetStreamer { 206 bool MicroMipsEnabled; 207 const MCSubtargetInfo &STI; 208 bool Pic; 209 210 public: isMicroMipsEnabled()211 bool isMicroMipsEnabled() const { return MicroMipsEnabled; } 212 MCELFStreamer &getStreamer(); 213 MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); 214 215 void emitLabel(MCSymbol *Symbol) override; 216 void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; 217 void finish() override; 218 219 void emitDirectiveSetMicroMips() override; 220 void emitDirectiveSetNoMicroMips() override; 221 void emitDirectiveSetMips16() override; 222 223 void emitDirectiveSetNoReorder() override; 224 void emitDirectiveEnd(StringRef Name) override; 225 226 void emitDirectiveEnt(const MCSymbol &Symbol) override; 227 void emitDirectiveAbiCalls() override; 228 void emitDirectiveNaN2008() override; 229 void emitDirectiveNaNLegacy() override; 230 void emitDirectiveOptionPic0() override; 231 void emitDirectiveOptionPic2() override; 232 void emitDirectiveInsn() override; 233 void emitFrame(unsigned StackReg, unsigned StackSize, 234 unsigned ReturnReg) override; 235 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override; 236 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override; 237 238 // PIC support 239 void emitDirectiveCpLoad(unsigned RegNo) override; 240 void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset, 241 const MCSymbol &Sym, bool IsReg) override; 242 243 void emitMipsAbiFlags(); 244 }; 245 } 246 #endif 247