1//===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file declares the Mips specific subclass of MachineFunctionInfo. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef MIPS_MACHINE_FUNCTION_INFO_H 15#define MIPS_MACHINE_FUNCTION_INFO_H 16 17#include "MipsSubtarget.h" 18#include "llvm/CodeGen/MachineFunction.h" 19#include "llvm/CodeGen/MachineFrameInfo.h" 20#include "llvm/Target/TargetFrameLowering.h" 21#include "llvm/Target/TargetMachine.h" 22#include <utility> 23 24namespace llvm { 25 26/// MipsFunctionInfo - This class is derived from MachineFunction private 27/// Mips target-specific information for each MachineFunction. 28class MipsFunctionInfo : public MachineFunctionInfo { 29 virtual void anchor(); 30 31 MachineFunction& MF; 32 /// SRetReturnReg - Some subtargets require that sret lowering includes 33 /// returning the value of the returned struct in a register. This field 34 /// holds the virtual register into which the sret argument is passed. 35 unsigned SRetReturnReg; 36 37 /// GlobalBaseReg - keeps track of the virtual register initialized for 38 /// use as the global base register. This is used for PIC in some PIC 39 /// relocation models. 40 unsigned GlobalBaseReg; 41 42 /// VarArgsFrameIndex - FrameIndex for start of varargs area. 43 int VarArgsFrameIndex; 44 45 // Range of frame object indices. 46 // InArgFIRange: Range of indices of all frame objects created during call to 47 // LowerFormalArguments. 48 // OutArgFIRange: Range of indices of all frame objects created during call to 49 // LowerCall except for the frame object for restoring $gp. 50 std::pair<int, int> InArgFIRange, OutArgFIRange; 51 unsigned MaxCallFrameSize; 52 53 bool EmitNOAT; 54 55public: 56 MipsFunctionInfo(MachineFunction& MF) 57 : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), 58 VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)), 59 OutArgFIRange(std::make_pair(-1, 0)), MaxCallFrameSize(0), EmitNOAT(false) 60 {} 61 62 bool isInArgFI(int FI) const { 63 return FI <= InArgFIRange.first && FI >= InArgFIRange.second; 64 } 65 void setLastInArgFI(int FI) { InArgFIRange.second = FI; } 66 67 bool isOutArgFI(int FI) const { 68 return FI <= OutArgFIRange.first && FI >= OutArgFIRange.second; 69 } 70 void extendOutArgFIRange(int FirstFI, int LastFI) { 71 if (!OutArgFIRange.second) 72 // this must be the first time this function was called. 73 OutArgFIRange.first = FirstFI; 74 OutArgFIRange.second = LastFI; 75 } 76 77 unsigned getSRetReturnReg() const { return SRetReturnReg; } 78 void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 79 80 bool globalBaseRegSet() const; 81 unsigned getGlobalBaseReg(); 82 83 int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 84 void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 85 86 unsigned getMaxCallFrameSize() const { return MaxCallFrameSize; } 87 void setMaxCallFrameSize(unsigned S) { MaxCallFrameSize = S; } 88 89 bool getEmitNOAT() const { return EmitNOAT; } 90 void setEmitNOAT() { EmitNOAT = true; } 91}; 92 93} // end of namespace llvm 94 95#endif // MIPS_MACHINE_FUNCTION_INFO_H 96