xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MipsTargetStreamer.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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