| //===-- 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 |