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 17a76220a40c1fcb0aa986a2ea2c129b7549e84c3eAkira Hatanaka#include "MipsSubtarget.h" 182d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h" 19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/CodeGen/MachineFunction.h" 20a76220a40c1fcb0aa986a2ea2c129b7549e84c3eAkira Hatanaka#include "llvm/Target/TargetFrameLowering.h" 21a76220a40c1fcb0aa986a2ea2c129b7549e84c3eAkira Hatanaka#include "llvm/Target/TargetMachine.h" 2279aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include <utility> 234215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 244215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesnamespace llvm { 254215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 264215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// MipsFunctionInfo - This class is derived from MachineFunction private 274215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// Mips target-specific information for each MachineFunction. 284215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesclass MipsFunctionInfo : public MachineFunctionInfo { 292d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 304215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 3121afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka MachineFunction& MF; 32225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// SRetReturnReg - Some subtargets require that sret lowering includes 33225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// returning the value of the returned struct in a register. This field 34225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes /// holds the virtual register into which the sret argument is passed. 35225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes unsigned SRetReturnReg; 36225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes 379911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// GlobalBaseReg - keeps track of the virtual register initialized for 389911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// use as the global base register. This is used for PIC in some PIC 399911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// relocation models. 409911405183f8596fe9d521467f83f6652a296cf4Dan Gohman unsigned GlobalBaseReg; 419911405183f8596fe9d521467f83f6652a296cf4Dan Gohman 42f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler /// Mips16SPAliasReg - keeps track of the virtual register initialized for 43f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler /// use as an alias for SP for use in load/store of halfword/byte from/to 44f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler /// the stack 45f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler unsigned Mips16SPAliasReg; 46f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler 471e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsFrameIndex - FrameIndex for start of varargs area. 481e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int VarArgsFrameIndex; 491e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 507085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka /// True if function has a byval argument. 51b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka bool HasByvalArg; 52b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka 537085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka /// Size of incoming argument area. 54294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka unsigned IncomingArgSize; 55294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka 56544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka /// CallsEhReturn - Whether the function calls llvm.eh.return. 57544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka bool CallsEhReturn; 58544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka 59544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka /// Frame objects for spilling eh data registers. 60544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka int EhDataRegFI[4]; 61544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka 624215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopespublic: 63acf1d482bff0eb8e9a3562a1f53033a53baf3727Che-Liang Chiou MipsFunctionInfo(MachineFunction& MF) 64f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0), 65544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka VarArgsFrameIndex(0), CallsEhReturn(false) 664215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes {} 674215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 68225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes unsigned getSRetReturnReg() const { return SRetReturnReg; } 69225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 709911405183f8596fe9d521467f83f6652a296cf4Dan Gohman 71648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka bool globalBaseRegSet() const; 72648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka unsigned getGlobalBaseReg(); 731e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 74f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler bool mips16SPAliasRegSet() const; 75f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler unsigned getMips16SPAliasReg(); 76f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler 771e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 781e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 79da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka 80b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka bool hasByvalArg() const { return HasByvalArg; } 817085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka void setFormalArgInfo(unsigned Size, bool HasByval) { 827085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka IncomingArgSize = Size; 83b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka HasByvalArg = HasByval; 84b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka } 85294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka 86294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka unsigned getIncomingArgSize() const { return IncomingArgSize; } 87544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka 88544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka bool callsEhReturn() const { return CallsEhReturn; } 89544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka void setCallsEhReturn() { CallsEhReturn = true; } 90544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka 91544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka void createEhDataRegsFI(); 92544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; } 93544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka bool isEhDataRegFI(int FI) const; 94544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka 954215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes}; 964215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 974215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes} // end of namespace llvm 984215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes 992d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#endif // MIPS_MACHINE_FUNCTION_INFO_H 100