360 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			360 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
 | |
| #define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
 | |
| 
 | |
| #include "MCTargetDesc/MipsABIFlagsSection.h"
 | |
| #include "MCTargetDesc/MipsABIInfo.h"
 | |
| #include "llvm/ADT/Optional.h"
 | |
| #include "llvm/ADT/STLExtras.h"
 | |
| #include "llvm/MC/MCELFStreamer.h"
 | |
| #include "llvm/MC/MCRegisterInfo.h"
 | |
| #include "llvm/MC/MCStreamer.h"
 | |
| 
 | |
| namespace llvm {
 | |
| 
 | |
| struct MipsABIFlagsSection;
 | |
| 
 | |
| class MipsTargetStreamer : public MCTargetStreamer {
 | |
| public:
 | |
|   MipsTargetStreamer(MCStreamer &S);
 | |
| 
 | |
|   virtual void setPic(bool Value) {}
 | |
| 
 | |
|   virtual void emitDirectiveSetMicroMips();
 | |
|   virtual void emitDirectiveSetNoMicroMips();
 | |
|   virtual void setUsesMicroMips();
 | |
|   virtual void emitDirectiveSetMips16();
 | |
|   virtual void emitDirectiveSetNoMips16();
 | |
| 
 | |
|   virtual void emitDirectiveSetReorder();
 | |
|   virtual void emitDirectiveSetNoReorder();
 | |
|   virtual void emitDirectiveSetMacro();
 | |
|   virtual void emitDirectiveSetNoMacro();
 | |
|   virtual void emitDirectiveSetMsa();
 | |
|   virtual void emitDirectiveSetNoMsa();
 | |
|   virtual void emitDirectiveSetMt();
 | |
|   virtual void emitDirectiveSetNoMt();
 | |
|   virtual void emitDirectiveSetCRC();
 | |
|   virtual void emitDirectiveSetNoCRC();
 | |
|   virtual void emitDirectiveSetVirt();
 | |
|   virtual void emitDirectiveSetNoVirt();
 | |
|   virtual void emitDirectiveSetGINV();
 | |
|   virtual void emitDirectiveSetNoGINV();
 | |
|   virtual void emitDirectiveSetAt();
 | |
|   virtual void emitDirectiveSetAtWithArg(unsigned RegNo);
 | |
|   virtual void emitDirectiveSetNoAt();
 | |
|   virtual void emitDirectiveEnd(StringRef Name);
 | |
| 
 | |
|   virtual void emitDirectiveEnt(const MCSymbol &Symbol);
 | |
|   virtual void emitDirectiveAbiCalls();
 | |
|   virtual void emitDirectiveNaN2008();
 | |
|   virtual void emitDirectiveNaNLegacy();
 | |
|   virtual void emitDirectiveOptionPic0();
 | |
|   virtual void emitDirectiveOptionPic2();
 | |
|   virtual void emitDirectiveInsn();
 | |
|   virtual void emitFrame(unsigned StackReg, unsigned StackSize,
 | |
|                          unsigned ReturnReg);
 | |
|   virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
 | |
|   virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
 | |
| 
 | |
|   virtual void emitDirectiveSetArch(StringRef Arch);
 | |
|   virtual void emitDirectiveSetMips0();
 | |
|   virtual void emitDirectiveSetMips1();
 | |
|   virtual void emitDirectiveSetMips2();
 | |
|   virtual void emitDirectiveSetMips3();
 | |
|   virtual void emitDirectiveSetMips4();
 | |
|   virtual void emitDirectiveSetMips5();
 | |
|   virtual void emitDirectiveSetMips32();
 | |
|   virtual void emitDirectiveSetMips32R2();
 | |
|   virtual void emitDirectiveSetMips32R3();
 | |
|   virtual void emitDirectiveSetMips32R5();
 | |
|   virtual void emitDirectiveSetMips32R6();
 | |
|   virtual void emitDirectiveSetMips64();
 | |
|   virtual void emitDirectiveSetMips64R2();
 | |
|   virtual void emitDirectiveSetMips64R3();
 | |
|   virtual void emitDirectiveSetMips64R5();
 | |
|   virtual void emitDirectiveSetMips64R6();
 | |
|   virtual void emitDirectiveSetDsp();
 | |
|   virtual void emitDirectiveSetDspr2();
 | |
|   virtual void emitDirectiveSetNoDsp();
 | |
|   virtual void emitDirectiveSetPop();
 | |
|   virtual void emitDirectiveSetPush();
 | |
|   virtual void emitDirectiveSetSoftFloat();
 | |
|   virtual void emitDirectiveSetHardFloat();
 | |
| 
 | |
|   // PIC support
 | |
|   virtual void emitDirectiveCpLoad(unsigned RegNo);
 | |
|   virtual bool emitDirectiveCpRestore(int Offset,
 | |
|                                       function_ref<unsigned()> GetATReg,
 | |
|                                       SMLoc IDLoc, const MCSubtargetInfo *STI);
 | |
|   virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
 | |
|                                     const MCSymbol &Sym, bool IsReg);
 | |
|   virtual void emitDirectiveCpreturn(unsigned SaveLocation,
 | |
|                                      bool SaveLocationIsRegister);
 | |
| 
 | |
|   // FP abiflags directives
 | |
|   virtual void emitDirectiveModuleFP();
 | |
|   virtual void emitDirectiveModuleOddSPReg();
 | |
|   virtual void emitDirectiveModuleSoftFloat();
 | |
|   virtual void emitDirectiveModuleHardFloat();
 | |
|   virtual void emitDirectiveModuleMT();
 | |
|   virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value);
 | |
|   virtual void emitDirectiveSetOddSPReg();
 | |
|   virtual void emitDirectiveSetNoOddSPReg();
 | |
|   virtual void emitDirectiveModuleCRC();
 | |
|   virtual void emitDirectiveModuleNoCRC();
 | |
|   virtual void emitDirectiveModuleVirt();
 | |
|   virtual void emitDirectiveModuleNoVirt();
 | |
|   virtual void emitDirectiveModuleGINV();
 | |
|   virtual void emitDirectiveModuleNoGINV();
 | |
| 
 | |
|   void emitR(unsigned Opcode, unsigned Reg0, SMLoc IDLoc,
 | |
|              const MCSubtargetInfo *STI);
 | |
|   void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,
 | |
|               const MCSubtargetInfo *STI);
 | |
|   void emitRX(unsigned Opcode, unsigned Reg0, MCOperand Op1, SMLoc IDLoc,
 | |
|               const MCSubtargetInfo *STI);
 | |
|   void emitRI(unsigned Opcode, unsigned Reg0, int32_t Imm, SMLoc IDLoc,
 | |
|               const MCSubtargetInfo *STI);
 | |
|   void emitRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, SMLoc IDLoc,
 | |
|               const MCSubtargetInfo *STI);
 | |
|   void emitRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, MCOperand Op2,
 | |
|                SMLoc IDLoc, const MCSubtargetInfo *STI);
 | |
|   void emitRRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2,
 | |
|                SMLoc IDLoc, const MCSubtargetInfo *STI);
 | |
|   void emitRRI(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm,
 | |
|                SMLoc IDLoc, const MCSubtargetInfo *STI);
 | |
|   void emitRRIII(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm0,
 | |
|                  int16_t Imm1, int16_t Imm2, SMLoc IDLoc,
 | |
|                  const MCSubtargetInfo *STI);
 | |
|   void emitAddu(unsigned DstReg, unsigned SrcReg, unsigned TrgReg, bool Is64Bit,
 | |
|                 const MCSubtargetInfo *STI);
 | |
|   void emitDSLL(unsigned DstReg, unsigned SrcReg, int16_t ShiftAmount,
 | |
|                 SMLoc IDLoc, const MCSubtargetInfo *STI);
 | |
|   void emitEmptyDelaySlot(bool hasShortDelaySlot, SMLoc IDLoc,
 | |
|                           const MCSubtargetInfo *STI);
 | |
|   void emitNop(SMLoc IDLoc, const MCSubtargetInfo *STI);
 | |
| 
 | |
|   /// Emit a store instruction with an offset. If the offset is out of range
 | |
|   /// then it will be synthesized using the assembler temporary.
 | |
|   ///
 | |
|   /// GetATReg() is a callback that can be used to obtain the current assembler
 | |
|   /// temporary and is only called when the assembler temporary is required. It
 | |
|   /// must handle the case where no assembler temporary is available (typically
 | |
|   /// by reporting an error).
 | |
|   void emitStoreWithImmOffset(unsigned Opcode, unsigned SrcReg,
 | |
|                               unsigned BaseReg, int64_t Offset,
 | |
|                               function_ref<unsigned()> GetATReg, SMLoc IDLoc,
 | |
|                               const MCSubtargetInfo *STI);
 | |
|   void emitStoreWithSymOffset(unsigned Opcode, unsigned SrcReg,
 | |
|                               unsigned BaseReg, MCOperand &HiOperand,
 | |
|                               MCOperand &LoOperand, unsigned ATReg, SMLoc IDLoc,
 | |
|                               const MCSubtargetInfo *STI);
 | |
|   void emitLoadWithImmOffset(unsigned Opcode, unsigned DstReg, unsigned BaseReg,
 | |
|                              int64_t Offset, unsigned TmpReg, SMLoc IDLoc,
 | |
|                              const MCSubtargetInfo *STI);
 | |
|   void emitLoadWithSymOffset(unsigned Opcode, unsigned DstReg, unsigned BaseReg,
 | |
|                              MCOperand &HiOperand, MCOperand &LoOperand,
 | |
|                              unsigned ATReg, SMLoc IDLoc,
 | |
|                              const MCSubtargetInfo *STI);
 | |
|   void emitGPRestore(int Offset, SMLoc IDLoc, const MCSubtargetInfo *STI);
 | |
| 
 | |
|   void forbidModuleDirective() { ModuleDirectiveAllowed = false; }
 | |
|   void reallowModuleDirective() { ModuleDirectiveAllowed = true; }
 | |
|   bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; }
 | |
| 
 | |
|   // This method enables template classes to set internal abi flags
 | |
|   // structure values.
 | |
|   template <class PredicateLibrary>
 | |
|   void updateABIInfo(const PredicateLibrary &P) {
 | |
|     ABI = P.getABI();
 | |
|     ABIFlagsSection.setAllFromPredicates(P);
 | |
|   }
 | |
| 
 | |
|   MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; }
 | |
|   const MipsABIInfo &getABI() const {
 | |
|     assert(ABI.hasValue() && "ABI hasn't been set!");
 | |
|     return *ABI;
 | |
|   }
 | |
| 
 | |
| protected:
 | |
|   llvm::Optional<MipsABIInfo> ABI;
 | |
|   MipsABIFlagsSection ABIFlagsSection;
 | |
| 
 | |
|   bool GPRInfoSet;
 | |
|   unsigned GPRBitMask;
 | |
|   int GPROffset;
 | |
| 
 | |
|   bool FPRInfoSet;
 | |
|   unsigned FPRBitMask;
 | |
|   int FPROffset;
 | |
| 
 | |
|   bool FrameInfoSet;
 | |
|   int FrameOffset;
 | |
|   unsigned FrameReg;
 | |
|   unsigned ReturnReg;
 | |
| 
 | |
| private:
 | |
|   bool ModuleDirectiveAllowed;
 | |
| };
 | |
| 
 | |
| // This part is for ascii assembly output
 | |
| class MipsTargetAsmStreamer : public MipsTargetStreamer {
 | |
|   formatted_raw_ostream &OS;
 | |
| 
 | |
| public:
 | |
|   MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
 | |
|   void emitDirectiveSetMicroMips() override;
 | |
|   void emitDirectiveSetNoMicroMips() override;
 | |
|   void emitDirectiveSetMips16() override;
 | |
|   void emitDirectiveSetNoMips16() override;
 | |
| 
 | |
|   void emitDirectiveSetReorder() override;
 | |
|   void emitDirectiveSetNoReorder() override;
 | |
|   void emitDirectiveSetMacro() override;
 | |
|   void emitDirectiveSetNoMacro() override;
 | |
|   void emitDirectiveSetMsa() override;
 | |
|   void emitDirectiveSetNoMsa() override;
 | |
|   void emitDirectiveSetMt() override;
 | |
|   void emitDirectiveSetNoMt() override;
 | |
|   void emitDirectiveSetCRC() override;
 | |
|   void emitDirectiveSetNoCRC() override;
 | |
|   void emitDirectiveSetVirt() override;
 | |
|   void emitDirectiveSetNoVirt() override;
 | |
|   void emitDirectiveSetGINV() override;
 | |
|   void emitDirectiveSetNoGINV() override;
 | |
|   void emitDirectiveSetAt() override;
 | |
|   void emitDirectiveSetAtWithArg(unsigned RegNo) override;
 | |
|   void emitDirectiveSetNoAt() override;
 | |
|   void emitDirectiveEnd(StringRef Name) override;
 | |
| 
 | |
|   void emitDirectiveEnt(const MCSymbol &Symbol) override;
 | |
|   void emitDirectiveAbiCalls() override;
 | |
|   void emitDirectiveNaN2008() override;
 | |
|   void emitDirectiveNaNLegacy() override;
 | |
|   void emitDirectiveOptionPic0() override;
 | |
|   void emitDirectiveOptionPic2() override;
 | |
|   void emitDirectiveInsn() override;
 | |
|   void emitFrame(unsigned StackReg, unsigned StackSize,
 | |
|                  unsigned ReturnReg) override;
 | |
|   void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
 | |
|   void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
 | |
| 
 | |
|   void emitDirectiveSetArch(StringRef Arch) override;
 | |
|   void emitDirectiveSetMips0() override;
 | |
|   void emitDirectiveSetMips1() override;
 | |
|   void emitDirectiveSetMips2() override;
 | |
|   void emitDirectiveSetMips3() override;
 | |
|   void emitDirectiveSetMips4() override;
 | |
|   void emitDirectiveSetMips5() override;
 | |
|   void emitDirectiveSetMips32() override;
 | |
|   void emitDirectiveSetMips32R2() override;
 | |
|   void emitDirectiveSetMips32R3() override;
 | |
|   void emitDirectiveSetMips32R5() override;
 | |
|   void emitDirectiveSetMips32R6() override;
 | |
|   void emitDirectiveSetMips64() override;
 | |
|   void emitDirectiveSetMips64R2() override;
 | |
|   void emitDirectiveSetMips64R3() override;
 | |
|   void emitDirectiveSetMips64R5() override;
 | |
|   void emitDirectiveSetMips64R6() override;
 | |
|   void emitDirectiveSetDsp() override;
 | |
|   void emitDirectiveSetDspr2() override;
 | |
|   void emitDirectiveSetNoDsp() override;
 | |
|   void emitDirectiveSetPop() override;
 | |
|   void emitDirectiveSetPush() override;
 | |
|   void emitDirectiveSetSoftFloat() override;
 | |
|   void emitDirectiveSetHardFloat() override;
 | |
| 
 | |
|   // PIC support
 | |
|   void emitDirectiveCpLoad(unsigned RegNo) override;
 | |
| 
 | |
|   /// Emit a .cprestore directive.  If the offset is out of range then it will
 | |
|   /// be synthesized using the assembler temporary.
 | |
|   ///
 | |
|   /// GetATReg() is a callback that can be used to obtain the current assembler
 | |
|   /// temporary and is only called when the assembler temporary is required. It
 | |
|   /// must handle the case where no assembler temporary is available (typically
 | |
|   /// by reporting an error).
 | |
|   bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,
 | |
|                               SMLoc IDLoc, const MCSubtargetInfo *STI) override;
 | |
|   void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
 | |
|                             const MCSymbol &Sym, bool IsReg) override;
 | |
|   void emitDirectiveCpreturn(unsigned SaveLocation,
 | |
|                              bool SaveLocationIsRegister) override;
 | |
| 
 | |
|   // FP abiflags directives
 | |
|   void emitDirectiveModuleFP() override;
 | |
|   void emitDirectiveModuleOddSPReg() override;
 | |
|   void emitDirectiveModuleSoftFloat() override;
 | |
|   void emitDirectiveModuleHardFloat() override;
 | |
|   void emitDirectiveModuleMT() override;
 | |
|   void emitDirectiveModuleCRC() override;
 | |
|   void emitDirectiveModuleNoCRC() override;
 | |
|   void emitDirectiveModuleVirt() override;
 | |
|   void emitDirectiveModuleNoVirt() override;
 | |
|   void emitDirectiveModuleGINV() override;
 | |
|   void emitDirectiveModuleNoGINV() override;
 | |
|   void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;
 | |
|   void emitDirectiveSetOddSPReg() override;
 | |
|   void emitDirectiveSetNoOddSPReg() override;
 | |
| };
 | |
| 
 | |
| // This part is for ELF object output
 | |
| class MipsTargetELFStreamer : public MipsTargetStreamer {
 | |
|   bool MicroMipsEnabled;
 | |
|   const MCSubtargetInfo &STI;
 | |
|   bool Pic;
 | |
| 
 | |
| public:
 | |
|   bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
 | |
|   MCELFStreamer &getStreamer();
 | |
|   MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
 | |
| 
 | |
|   void setPic(bool Value) override { Pic = Value; }
 | |
| 
 | |
|   void emitLabel(MCSymbol *Symbol) override;
 | |
|   void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
 | |
|   void finish() override;
 | |
| 
 | |
|   void emitDirectiveSetMicroMips() override;
 | |
|   void emitDirectiveSetNoMicroMips() override;
 | |
|   void setUsesMicroMips() override;
 | |
|   void emitDirectiveSetMips16() override;
 | |
| 
 | |
|   void emitDirectiveSetNoReorder() override;
 | |
|   void emitDirectiveEnd(StringRef Name) override;
 | |
| 
 | |
|   void emitDirectiveEnt(const MCSymbol &Symbol) override;
 | |
|   void emitDirectiveAbiCalls() override;
 | |
|   void emitDirectiveNaN2008() override;
 | |
|   void emitDirectiveNaNLegacy() override;
 | |
|   void emitDirectiveOptionPic0() override;
 | |
|   void emitDirectiveOptionPic2() override;
 | |
|   void emitDirectiveInsn() override;
 | |
|   void emitFrame(unsigned StackReg, unsigned StackSize,
 | |
|                  unsigned ReturnReg) override;
 | |
|   void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
 | |
|   void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
 | |
| 
 | |
|   // PIC support
 | |
|   void emitDirectiveCpLoad(unsigned RegNo) override;
 | |
|   bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,
 | |
|                               SMLoc IDLoc, const MCSubtargetInfo *STI) override;
 | |
|   void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
 | |
|                             const MCSymbol &Sym, bool IsReg) override;
 | |
|   void emitDirectiveCpreturn(unsigned SaveLocation,
 | |
|                              bool SaveLocationIsRegister) override;
 | |
| 
 | |
|   void emitMipsAbiFlags();
 | |
| };
 | |
| }
 | |
| #endif
 |