| //===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file declares the Mips specific subclass of MachineFunctionInfo. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef MIPS_MACHINE_FUNCTION_INFO_H | |
| #define MIPS_MACHINE_FUNCTION_INFO_H | |
| #include <utility> | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/ADT/VectorExtras.h" | |
| #include "llvm/CodeGen/MachineFunction.h" | |
| #include "llvm/CodeGen/MachineFrameInfo.h" | |
| namespace llvm { | |
| /// MipsFunctionInfo - This class is derived from MachineFunction private | |
| /// Mips target-specific information for each MachineFunction. | |
| class MipsFunctionInfo : public MachineFunctionInfo { | |
| private: | |
| MachineFunction& MF; | |
| /// SRetReturnReg - Some subtargets require that sret lowering includes | |
| /// returning the value of the returned struct in a register. This field | |
| /// holds the virtual register into which the sret argument is passed. | |
| unsigned SRetReturnReg; | |
| /// GlobalBaseReg - keeps track of the virtual register initialized for | |
| /// use as the global base register. This is used for PIC in some PIC | |
| /// relocation models. | |
| unsigned GlobalBaseReg; | |
| /// VarArgsFrameIndex - FrameIndex for start of varargs area. | |
| int VarArgsFrameIndex; | |
| // Range of frame object indices. | |
| // InArgFIRange: Range of indices of all frame objects created during call to | |
| // LowerFormalArguments. | |
| // OutArgFIRange: Range of indices of all frame objects created during call to | |
| // LowerCall except for the frame object for restoring $gp. | |
| std::pair<int, int> InArgFIRange, OutArgFIRange; | |
| int GPFI; // Index of the frame object for restoring $gp | |
| mutable int DynAllocFI; // Frame index of dynamically allocated stack area. | |
| unsigned MaxCallFrameSize; | |
| public: | |
| MipsFunctionInfo(MachineFunction& MF) | |
| : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), | |
| VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)), | |
| OutArgFIRange(std::make_pair(-1, 0)), GPFI(0), DynAllocFI(0), | |
| MaxCallFrameSize(0) | |
| {} | |
| bool isInArgFI(int FI) const { | |
| return FI <= InArgFIRange.first && FI >= InArgFIRange.second; | |
| } | |
| void setLastInArgFI(int FI) { InArgFIRange.second = FI; } | |
| bool isOutArgFI(int FI) const { | |
| return FI <= OutArgFIRange.first && FI >= OutArgFIRange.second; | |
| } | |
| void extendOutArgFIRange(int FirstFI, int LastFI) { | |
| if (!OutArgFIRange.second) | |
| // this must be the first time this function was called. | |
| OutArgFIRange.first = FirstFI; | |
| OutArgFIRange.second = LastFI; | |
| } | |
| int getGPFI() const { return GPFI; } | |
| void setGPFI(int FI) { GPFI = FI; } | |
| bool needGPSaveRestore() const { return getGPFI(); } | |
| bool isGPFI(int FI) const { return GPFI && GPFI == FI; } | |
| // The first call to this function creates a frame object for dynamically | |
| // allocated stack area. | |
| int getDynAllocFI() const { | |
| if (!DynAllocFI) | |
| DynAllocFI = MF.getFrameInfo()->CreateFixedObject(4, 0, true); | |
| return DynAllocFI; | |
| } | |
| bool isDynAllocFI(int FI) const { return DynAllocFI && DynAllocFI == FI; } | |
| unsigned getSRetReturnReg() const { return SRetReturnReg; } | |
| void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } | |
| unsigned getGlobalBaseReg() const { return GlobalBaseReg; } | |
| void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; } | |
| int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } | |
| void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } | |
| unsigned getMaxCallFrameSize() const { return MaxCallFrameSize; } | |
| void setMaxCallFrameSize(unsigned S) { MaxCallFrameSize = S; } | |
| }; | |
| } // end of namespace llvm | |
| #endif // MIPS_MACHINE_FUNCTION_INFO_H |