1*9880d681SAndroid Build Coastguard Worker //===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- 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 // This file declares the Mips specific subclass of MachineFunctionInfo. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_MIPS_MIPSMACHINEFUNCTION_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_MIPS_MIPSMACHINEFUNCTION_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "Mips16HardFloatInfo.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFrameInfo.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunction.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineMemOperand.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/PseudoSourceValue.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetFrameLowering.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h" 24*9880d681SAndroid Build Coastguard Worker #include <map> 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker namespace llvm { 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker /// MipsFunctionInfo - This class is derived from MachineFunction private 29*9880d681SAndroid Build Coastguard Worker /// Mips target-specific information for each MachineFunction. 30*9880d681SAndroid Build Coastguard Worker class MipsFunctionInfo : public MachineFunctionInfo { 31*9880d681SAndroid Build Coastguard Worker public: MipsFunctionInfo(MachineFunction & MF)32*9880d681SAndroid Build Coastguard Worker MipsFunctionInfo(MachineFunction &MF) 33*9880d681SAndroid Build Coastguard Worker : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), VarArgsFrameIndex(0), 34*9880d681SAndroid Build Coastguard Worker CallsEhReturn(false), IsISR(false), SaveS2(false), 35*9880d681SAndroid Build Coastguard Worker MoveF64ViaSpillFI(-1) {} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker ~MipsFunctionInfo(); 38*9880d681SAndroid Build Coastguard Worker getSRetReturnReg()39*9880d681SAndroid Build Coastguard Worker unsigned getSRetReturnReg() const { return SRetReturnReg; } setSRetReturnReg(unsigned Reg)40*9880d681SAndroid Build Coastguard Worker void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker bool globalBaseRegSet() const; 43*9880d681SAndroid Build Coastguard Worker unsigned getGlobalBaseReg(); 44*9880d681SAndroid Build Coastguard Worker getVarArgsFrameIndex()45*9880d681SAndroid Build Coastguard Worker int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } setVarArgsFrameIndex(int Index)46*9880d681SAndroid Build Coastguard Worker void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 47*9880d681SAndroid Build Coastguard Worker hasByvalArg()48*9880d681SAndroid Build Coastguard Worker bool hasByvalArg() const { return HasByvalArg; } setFormalArgInfo(unsigned Size,bool HasByval)49*9880d681SAndroid Build Coastguard Worker void setFormalArgInfo(unsigned Size, bool HasByval) { 50*9880d681SAndroid Build Coastguard Worker IncomingArgSize = Size; 51*9880d681SAndroid Build Coastguard Worker HasByvalArg = HasByval; 52*9880d681SAndroid Build Coastguard Worker } 53*9880d681SAndroid Build Coastguard Worker getIncomingArgSize()54*9880d681SAndroid Build Coastguard Worker unsigned getIncomingArgSize() const { return IncomingArgSize; } 55*9880d681SAndroid Build Coastguard Worker callsEhReturn()56*9880d681SAndroid Build Coastguard Worker bool callsEhReturn() const { return CallsEhReturn; } setCallsEhReturn()57*9880d681SAndroid Build Coastguard Worker void setCallsEhReturn() { CallsEhReturn = true; } 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker void createEhDataRegsFI(); getEhDataRegFI(unsigned Reg)60*9880d681SAndroid Build Coastguard Worker int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; } 61*9880d681SAndroid Build Coastguard Worker bool isEhDataRegFI(int FI) const; 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker /// Create a MachinePointerInfo that has an ExternalSymbolPseudoSourceValue 64*9880d681SAndroid Build Coastguard Worker /// object representing a GOT entry for an external function. 65*9880d681SAndroid Build Coastguard Worker MachinePointerInfo callPtrInfo(const char *ES); 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker // Functions with the "interrupt" attribute require special prologues, 68*9880d681SAndroid Build Coastguard Worker // epilogues and additional spill slots. isISR()69*9880d681SAndroid Build Coastguard Worker bool isISR() const { return IsISR; } setISR()70*9880d681SAndroid Build Coastguard Worker void setISR() { IsISR = true; } 71*9880d681SAndroid Build Coastguard Worker void createISRRegFI(); getISRRegFI(unsigned Reg)72*9880d681SAndroid Build Coastguard Worker int getISRRegFI(unsigned Reg) const { return ISRDataRegFI[Reg]; } 73*9880d681SAndroid Build Coastguard Worker bool isISRRegFI(int FI) const; 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker /// Create a MachinePointerInfo that has a GlobalValuePseudoSourceValue object 76*9880d681SAndroid Build Coastguard Worker /// representing a GOT entry for a global function. 77*9880d681SAndroid Build Coastguard Worker MachinePointerInfo callPtrInfo(const GlobalValue *GV); 78*9880d681SAndroid Build Coastguard Worker setSaveS2()79*9880d681SAndroid Build Coastguard Worker void setSaveS2() { SaveS2 = true; } hasSaveS2()80*9880d681SAndroid Build Coastguard Worker bool hasSaveS2() const { return SaveS2; } 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker int getMoveF64ViaSpillFI(const TargetRegisterClass *RC); 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *> 85*9880d681SAndroid Build Coastguard Worker StubsNeeded; 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker private: 88*9880d681SAndroid Build Coastguard Worker virtual void anchor(); 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker MachineFunction& MF; 91*9880d681SAndroid Build Coastguard Worker /// SRetReturnReg - Some subtargets require that sret lowering includes 92*9880d681SAndroid Build Coastguard Worker /// returning the value of the returned struct in a register. This field 93*9880d681SAndroid Build Coastguard Worker /// holds the virtual register into which the sret argument is passed. 94*9880d681SAndroid Build Coastguard Worker unsigned SRetReturnReg; 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker /// GlobalBaseReg - keeps track of the virtual register initialized for 97*9880d681SAndroid Build Coastguard Worker /// use as the global base register. This is used for PIC in some PIC 98*9880d681SAndroid Build Coastguard Worker /// relocation models. 99*9880d681SAndroid Build Coastguard Worker unsigned GlobalBaseReg; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker /// VarArgsFrameIndex - FrameIndex for start of varargs area. 102*9880d681SAndroid Build Coastguard Worker int VarArgsFrameIndex; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker /// True if function has a byval argument. 105*9880d681SAndroid Build Coastguard Worker bool HasByvalArg; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker /// Size of incoming argument area. 108*9880d681SAndroid Build Coastguard Worker unsigned IncomingArgSize; 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker /// CallsEhReturn - Whether the function calls llvm.eh.return. 111*9880d681SAndroid Build Coastguard Worker bool CallsEhReturn; 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker /// Frame objects for spilling eh data registers. 114*9880d681SAndroid Build Coastguard Worker int EhDataRegFI[4]; 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker /// ISR - Whether the function is an Interrupt Service Routine. 117*9880d681SAndroid Build Coastguard Worker bool IsISR; 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker /// Frame objects for spilling C0_STATUS, C0_EPC 120*9880d681SAndroid Build Coastguard Worker int ISRDataRegFI[2]; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker // saveS2 123*9880d681SAndroid Build Coastguard Worker bool SaveS2; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker /// FrameIndex for expanding BuildPairF64 nodes to spill and reload when the 126*9880d681SAndroid Build Coastguard Worker /// O32 FPXX ABI is enabled. -1 is used to denote invalid index. 127*9880d681SAndroid Build Coastguard Worker int MoveF64ViaSpillFI; 128*9880d681SAndroid Build Coastguard Worker }; 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker } // end of namespace llvm 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker #endif 133