14552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=// 24215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 34215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// The LLVM Compiler Infrastructure 44215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 74215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 94215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 104215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// This file declares the Mips specific subclass of MachineFunctionInfo. 114215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// 124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 134215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 144215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#ifndef MIPS_MACHINE_FUNCTION_INFO_H 154215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#define MIPS_MACHINE_FUNCTION_INFO_H 164215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 174215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#include "llvm/CodeGen/MachineFunction.h" 182d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h" 1979aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include <utility> 204215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 214215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesnamespace llvm { 224215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 234215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// MipsFunctionInfo - This class is derived from MachineFunction private 244215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// Mips target-specific information for each MachineFunction. 254215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesclass MipsFunctionInfo : public MachineFunctionInfo { 262d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 274215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 2821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka MachineFunction& MF; 29225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// SRetReturnReg - Some subtargets require that sret lowering includes 30225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// returning the value of the returned struct in a register. This field 31225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// holds the virtual register into which the sret argument is passed. 32225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes unsigned SRetReturnReg; 33225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes 349911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// GlobalBaseReg - keeps track of the virtual register initialized for 359911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// use as the global base register. This is used for PIC in some PIC 369911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// relocation models. 379911405183f8596fe9d521467f83f6652a296cf4Dan Gohman unsigned GlobalBaseReg; 389911405183f8596fe9d521467f83f6652a296cf4Dan Gohman 391e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsFrameIndex - FrameIndex for start of varargs area. 401e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int VarArgsFrameIndex; 411e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 42da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka // Range of frame object indices. 43da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka // InArgFIRange: Range of indices of all frame objects created during call to 44da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka // LowerFormalArguments. 45da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka // OutArgFIRange: Range of indices of all frame objects created during call to 46bb481f882093fb738d2bb15610c79364bada5496Jia Liu // LowerCall except for the frame object for restoring $gp. 47da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka std::pair<int, int> InArgFIRange, OutArgFIRange; 48bb481f882093fb738d2bb15610c79364bada5496Jia Liu int GPFI; // Index of the frame object for restoring $gp 49bb481f882093fb738d2bb15610c79364bada5496Jia Liu mutable int DynAllocFI; // Frame index of dynamically allocated stack area. 50f15f49850768f5889c2e12aeb273e158597a1223Akira Hatanaka unsigned MaxCallFrameSize; 514e694c96f1c0c2d09a287ff69bab5896e04dd3fdBruno Cardoso Lopes 5295f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka bool EmitNOAT; 5395f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka 544215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopespublic: 55acf1d482bff0eb8e9a3562a1f53033a53baf3727Che-Liang Chiou MipsFunctionInfo(MachineFunction& MF) 5621afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), 57da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)), 5821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka OutArgFIRange(std::make_pair(-1, 0)), GPFI(0), DynAllocFI(0), 5995f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka MaxCallFrameSize(0), EmitNOAT(false) 604215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes {} 614215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 62da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka bool isInArgFI(int FI) const { 63da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka return FI <= InArgFIRange.first && FI >= InArgFIRange.second; 64da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka } 65da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka void setLastInArgFI(int FI) { InArgFIRange.second = FI; } 66da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka 67bb481f882093fb738d2bb15610c79364bada5496Jia Liu bool isOutArgFI(int FI) const { 68da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka return FI <= OutArgFIRange.first && FI >= OutArgFIRange.second; 69da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka } 70da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka void extendOutArgFIRange(int FirstFI, int LastFI) { 71da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka if (!OutArgFIRange.second) 72da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka // this must be the first time this function was called. 73da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka OutArgFIRange.first = FirstFI; 74da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka OutArgFIRange.second = LastFI; 75da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka } 76da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka 7769c19f7316ed8e545c7339421b910543eb8e9eefAkira Hatanaka int getGPFI() const { return GPFI; } 7869c19f7316ed8e545c7339421b910543eb8e9eefAkira Hatanaka void setGPFI(int FI) { GPFI = FI; } 7969c19f7316ed8e545c7339421b910543eb8e9eefAkira Hatanaka bool needGPSaveRestore() const { return getGPFI(); } 80da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka bool isGPFI(int FI) const { return GPFI && GPFI == FI; } 810a6040063fd9419041a81ada8f75b389381eb6b9Bruno Cardoso Lopes 8221afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka // The first call to this function creates a frame object for dynamically 8321afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka // allocated stack area. 8421afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka int getDynAllocFI() const { 8521afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka if (!DynAllocFI) 8621afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka DynAllocFI = MF.getFrameInfo()->CreateFixedObject(4, 0, true); 8721afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka 8821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka return DynAllocFI; 8921afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka } 9021afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka bool isDynAllocFI(int FI) const { return DynAllocFI && DynAllocFI == FI; } 9121afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka 92225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes unsigned getSRetReturnReg() const { return SRetReturnReg; } 93225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 949911405183f8596fe9d521467f83f6652a296cf4Dan Gohman 95648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka bool globalBaseRegFixed() const; 96648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka bool globalBaseRegSet() const; 97648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka unsigned getGlobalBaseReg(); 981e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 991e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 1001e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 101da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka 102f15f49850768f5889c2e12aeb273e158597a1223Akira Hatanaka unsigned getMaxCallFrameSize() const { return MaxCallFrameSize; } 103f15f49850768f5889c2e12aeb273e158597a1223Akira Hatanaka void setMaxCallFrameSize(unsigned S) { MaxCallFrameSize = S; } 10495f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka 10595f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka bool getEmitNOAT() const { return EmitNOAT; } 10695f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka void setEmitNOAT() { EmitNOAT = true; } 1074215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes}; 1084215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 1094215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes} // end of namespace llvm 1104215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 1112d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#endif // MIPS_MACHINE_FUNCTION_INFO_H 112