109467b48Spatrick //===- MipsMachineFunctionInfo.h - Private data used for Mips ---*- C++ -*-===// 209467b48Spatrick // 309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609467b48Spatrick // 709467b48Spatrick //===----------------------------------------------------------------------===// 809467b48Spatrick // 909467b48Spatrick // This file declares the Mips specific subclass of MachineFunctionInfo. 1009467b48Spatrick // 1109467b48Spatrick //===----------------------------------------------------------------------===// 1209467b48Spatrick 1309467b48Spatrick #ifndef LLVM_LIB_TARGET_MIPS_MIPSMACHINEFUNCTION_H 1409467b48Spatrick #define LLVM_LIB_TARGET_MIPS_MIPSMACHINEFUNCTION_H 1509467b48Spatrick 1609467b48Spatrick #include "Mips16HardFloatInfo.h" 1709467b48Spatrick #include "llvm/CodeGen/MachineFunction.h" 1809467b48Spatrick #include "llvm/CodeGen/MachineMemOperand.h" 1909467b48Spatrick #include <map> 2009467b48Spatrick 2109467b48Spatrick namespace llvm { 2209467b48Spatrick 2309467b48Spatrick /// MipsFunctionInfo - This class is derived from MachineFunction private 2409467b48Spatrick /// Mips target-specific information for each MachineFunction. 2509467b48Spatrick class MipsFunctionInfo : public MachineFunctionInfo { 2609467b48Spatrick public: MipsFunctionInfo(const Function & F,const TargetSubtargetInfo * STI)27*d415bd75Srobert MipsFunctionInfo(const Function &F, const TargetSubtargetInfo *STI) {} 28*d415bd75Srobert 29*d415bd75Srobert MachineFunctionInfo * 30*d415bd75Srobert clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, 31*d415bd75Srobert const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB) 32*d415bd75Srobert const override; 3309467b48Spatrick 3409467b48Spatrick ~MipsFunctionInfo() override; 3509467b48Spatrick getSRetReturnReg()3609467b48Spatrick unsigned getSRetReturnReg() const { return SRetReturnReg; } setSRetReturnReg(unsigned Reg)3709467b48Spatrick void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 3809467b48Spatrick 3909467b48Spatrick bool globalBaseRegSet() const; 40097a140dSpatrick Register getGlobalBaseReg(MachineFunction &MF); 41097a140dSpatrick Register getGlobalBaseRegForGlobalISel(MachineFunction &MF); 4209467b48Spatrick 4309467b48Spatrick // Insert instructions to initialize the global base register in the 4409467b48Spatrick // first MBB of the function. 45097a140dSpatrick void initGlobalBaseReg(MachineFunction &MF); 4609467b48Spatrick getVarArgsFrameIndex()4709467b48Spatrick int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } setVarArgsFrameIndex(int Index)4809467b48Spatrick void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 4909467b48Spatrick hasByvalArg()5009467b48Spatrick bool hasByvalArg() const { return HasByvalArg; } setFormalArgInfo(unsigned Size,bool HasByval)5109467b48Spatrick void setFormalArgInfo(unsigned Size, bool HasByval) { 5209467b48Spatrick IncomingArgSize = Size; 5309467b48Spatrick HasByvalArg = HasByval; 5409467b48Spatrick } 5509467b48Spatrick getIncomingArgSize()5609467b48Spatrick unsigned getIncomingArgSize() const { return IncomingArgSize; } 5709467b48Spatrick callsEhReturn()5809467b48Spatrick bool callsEhReturn() const { return CallsEhReturn; } setCallsEhReturn()5909467b48Spatrick void setCallsEhReturn() { CallsEhReturn = true; } 6009467b48Spatrick 61097a140dSpatrick void createEhDataRegsFI(MachineFunction &MF); getEhDataRegFI(unsigned Reg)6209467b48Spatrick int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; } 6309467b48Spatrick bool isEhDataRegFI(int FI) const; 6409467b48Spatrick 6509467b48Spatrick /// Create a MachinePointerInfo that has an ExternalSymbolPseudoSourceValue 6609467b48Spatrick /// object representing a GOT entry for an external function. 67097a140dSpatrick MachinePointerInfo callPtrInfo(MachineFunction &MF, const char *ES); 6809467b48Spatrick 6909467b48Spatrick // Functions with the "interrupt" attribute require special prologues, 7009467b48Spatrick // epilogues and additional spill slots. isISR()7109467b48Spatrick bool isISR() const { return IsISR; } setISR()7209467b48Spatrick void setISR() { IsISR = true; } 73097a140dSpatrick void createISRRegFI(MachineFunction &MF); getISRRegFI(Register Reg)74097a140dSpatrick int getISRRegFI(Register Reg) const { return ISRDataRegFI[Reg]; } 7509467b48Spatrick bool isISRRegFI(int FI) const; 7609467b48Spatrick 7709467b48Spatrick /// Create a MachinePointerInfo that has a GlobalValuePseudoSourceValue object 7809467b48Spatrick /// representing a GOT entry for a global function. 79097a140dSpatrick MachinePointerInfo callPtrInfo(MachineFunction &MF, const GlobalValue *GV); 8009467b48Spatrick setSaveS2()8109467b48Spatrick void setSaveS2() { SaveS2 = true; } hasSaveS2()8209467b48Spatrick bool hasSaveS2() const { return SaveS2; } 8309467b48Spatrick 84097a140dSpatrick int getMoveF64ViaSpillFI(MachineFunction &MF, const TargetRegisterClass *RC); 8509467b48Spatrick 8609467b48Spatrick std::map<const char *, const Mips16HardFloatInfo::FuncSignature *> 8709467b48Spatrick StubsNeeded; 8809467b48Spatrick 8909467b48Spatrick private: 9009467b48Spatrick virtual void anchor(); 9109467b48Spatrick 9209467b48Spatrick /// SRetReturnReg - Some subtargets require that sret lowering includes 9309467b48Spatrick /// returning the value of the returned struct in a register. This field 9409467b48Spatrick /// holds the virtual register into which the sret argument is passed. 95097a140dSpatrick Register SRetReturnReg; 9609467b48Spatrick 9709467b48Spatrick /// GlobalBaseReg - keeps track of the virtual register initialized for 9809467b48Spatrick /// use as the global base register. This is used for PIC in some PIC 9909467b48Spatrick /// relocation models. 100097a140dSpatrick Register GlobalBaseReg; 10109467b48Spatrick 10209467b48Spatrick /// VarArgsFrameIndex - FrameIndex for start of varargs area. 10309467b48Spatrick int VarArgsFrameIndex = 0; 10409467b48Spatrick 10509467b48Spatrick /// True if function has a byval argument. 10609467b48Spatrick bool HasByvalArg; 10709467b48Spatrick 10809467b48Spatrick /// Size of incoming argument area. 10909467b48Spatrick unsigned IncomingArgSize; 11009467b48Spatrick 11109467b48Spatrick /// CallsEhReturn - Whether the function calls llvm.eh.return. 11209467b48Spatrick bool CallsEhReturn = false; 11309467b48Spatrick 11409467b48Spatrick /// Frame objects for spilling eh data registers. 11509467b48Spatrick int EhDataRegFI[4]; 11609467b48Spatrick 11709467b48Spatrick /// ISR - Whether the function is an Interrupt Service Routine. 11809467b48Spatrick bool IsISR = false; 11909467b48Spatrick 12009467b48Spatrick /// Frame objects for spilling C0_STATUS, C0_EPC 12109467b48Spatrick int ISRDataRegFI[2]; 12209467b48Spatrick 12309467b48Spatrick // saveS2 12409467b48Spatrick bool SaveS2 = false; 12509467b48Spatrick 12609467b48Spatrick /// FrameIndex for expanding BuildPairF64 nodes to spill and reload when the 12709467b48Spatrick /// O32 FPXX ABI is enabled. -1 is used to denote invalid index. 12809467b48Spatrick int MoveF64ViaSpillFI = -1; 12909467b48Spatrick }; 13009467b48Spatrick 13109467b48Spatrick } // end namespace llvm 13209467b48Spatrick 13309467b48Spatrick #endif // LLVM_LIB_TARGET_MIPS_MIPSMACHINEFUNCTION_H 134