MipsMachineFunction.h revision f15f49850768f5889c2e12aeb273e158597a1223
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 <utility> 18#include "llvm/ADT/SmallVector.h" 19#include "llvm/ADT/VectorExtras.h" 20#include "llvm/CodeGen/MachineFunction.h" 21#include "llvm/CodeGen/MachineFrameInfo.h" 22 23namespace llvm { 24 25/// MipsFunctionInfo - This class is derived from MachineFunction private 26/// Mips target-specific information for each MachineFunction. 27class MipsFunctionInfo : public MachineFunctionInfo { 28 29private: 30 /// SRetReturnReg - Some subtargets require that sret lowering includes 31 /// returning the value of the returned struct in a register. This field 32 /// holds the virtual register into which the sret argument is passed. 33 unsigned SRetReturnReg; 34 35 /// GlobalBaseReg - keeps track of the virtual register initialized for 36 /// use as the global base register. This is used for PIC in some PIC 37 /// relocation models. 38 unsigned GlobalBaseReg; 39 40 /// VarArgsFrameIndex - FrameIndex for start of varargs area. 41 int VarArgsFrameIndex; 42 43 // Range of frame object indices. 44 // InArgFIRange: Range of indices of all frame objects created during call to 45 // LowerFormalArguments. 46 // OutArgFIRange: Range of indices of all frame objects created during call to 47 // LowerCall except for the frame object for restoring $gp. 48 std::pair<int, int> InArgFIRange, OutArgFIRange; 49 int GPFI; // Index of the frame object for restoring $gp 50 bool HasCall; // True if function has a function call. 51 unsigned MaxCallFrameSize; 52public: 53 MipsFunctionInfo(MachineFunction& MF) 54 : SRetReturnReg(0), GlobalBaseReg(0), 55 VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)), 56 OutArgFIRange(std::make_pair(-1, 0)), GPFI(0), HasCall(false), 57 MaxCallFrameSize(0) 58 {} 59 60 bool isInArgFI(int FI) const { 61 return FI <= InArgFIRange.first && FI >= InArgFIRange.second; 62 } 63 void setLastInArgFI(int FI) { InArgFIRange.second = FI; } 64 65 bool isOutArgFI(int FI) const { 66 return FI <= OutArgFIRange.first && FI >= OutArgFIRange.second; 67 } 68 void extendOutArgFIRange(int FirstFI, int LastFI) { 69 if (!OutArgFIRange.second) 70 // this must be the first time this function was called. 71 OutArgFIRange.first = FirstFI; 72 OutArgFIRange.second = LastFI; 73 } 74 75 int getGPFI() const { return GPFI; } 76 void setGPFI(int FI) { GPFI = FI; } 77 bool needGPSaveRestore() const { return getGPFI(); } 78 bool isGPFI(int FI) const { return GPFI && GPFI == FI; } 79 80 unsigned getSRetReturnReg() const { return SRetReturnReg; } 81 void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 82 83 unsigned getGlobalBaseReg() const { return GlobalBaseReg; } 84 void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; } 85 86 int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 87 void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 88 89 bool hasCall() const { return HasCall; } 90 void setHasCall() { HasCall = true; } 91 92 unsigned getMaxCallFrameSize() const { return MaxCallFrameSize; } 93 void setMaxCallFrameSize(unsigned S) { MaxCallFrameSize = S; } 94}; 95 96} // end of namespace llvm 97 98#endif // MIPS_MACHINE_FUNCTION_INFO_H 99