X86MachineFunctionInfo.h revision 31d157ae1ac2cd9c787dc3c1d28e64c682803844
131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- X86MachineFuctionInfo.h - X86 machine function info -----*- C++ -*-===// 231d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu// 3e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng// The LLVM Compiler Infrastructure 4e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 731d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu// 8e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng//===----------------------------------------------------------------------===// 9e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng// 10e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng// This file declares X86-specific per-machine-function information. 11e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng// 12e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng//===----------------------------------------------------------------------===// 13e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng 14e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng#ifndef X86MACHINEFUNCTIONINFO_H 15e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng#define X86MACHINEFUNCTIONINFO_H 16e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng 17e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng#include "llvm/CodeGen/MachineFunction.h" 18e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng 19e8bd0a332ab43c30a7745381075a9749070b6a50Evan Chengnamespace llvm { 20e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng 216288b93f00e8747eaff69f2954a76efc587e7b55Dan Gohman/// X86MachineFunctionInfo - This class is derived from MachineFunction and 226288b93f00e8747eaff69f2954a76efc587e7b55Dan Gohman/// contains private X86 target-specific information for each MachineFunction. 23d15dff24c6a3712298e16453eb8d09c4404563a5Chris Lattnerclass X86MachineFunctionInfo : public MachineFunctionInfo { 242d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 252d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 26f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov /// ForceFramePointer - True if the function is required to use of frame 27f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov /// pointer for reasons other than it containing dynamic allocation or 28f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov /// that FP eliminatation is turned off. For example, Cygwin main function 29f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov /// contains stack pointer re-alignment code which requires FP. 30e5e228df19d6e9e1218fecfb49f8ef1f53d6759cEvan Cheng bool ForceFramePointer; 31f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov 3289d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng /// CalleeSavedFrameSize - Size of the callee-saved register portion of the 3389d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng /// stack frame in bytes. 3489d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng unsigned CalleeSavedFrameSize; 3589d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng 361e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// BytesToPopOnReturn - Number of bytes function pops on return (in addition 371e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// to the space used by the return address). 38f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov /// Used on windows platform for stdcall & fastcall name decoration 39f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov unsigned BytesToPopOnReturn; 40f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov 410475ab58b8e92fa8e8b90ddbf023bc60587c5e25Evan Cheng /// ReturnAddrIndex - FrameIndex for return slot. 42a2780e11ef0b757f0e5851bcf76c28c2f07dd379Anton Korobeynikov int ReturnAddrIndex; 43c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer 44f22f9b35d6e6444028ed288bfae526f53740b5c1Evan Cheng /// TailCallReturnAddrDelta - The number of bytes by which return address 45f22f9b35d6e6444028ed288bfae526f53740b5c1Evan Cheng /// stack slot is moved as the result of tail call optimization. 46c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer int TailCallReturnAddrDelta; 47c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer 4861a921344090457f9429e44c7906ea75ce97e020Dan Gohman /// SRetReturnReg - Some subtargets require that sret lowering includes 4961a921344090457f9429e44c7906ea75ce97e020Dan Gohman /// returning the value of the returned struct in a register. This field 5061a921344090457f9429e44c7906ea75ce97e020Dan Gohman /// holds the virtual register into which the sret argument is passed. 5161a921344090457f9429e44c7906ea75ce97e020Dan Gohman unsigned SRetReturnReg; 5261a921344090457f9429e44c7906ea75ce97e020Dan Gohman 53d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// GlobalBaseReg - keeps track of the virtual register initialized for 54d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// use as the global base register. This is used for PIC in some PIC 55d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// relocation models. 5657c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman unsigned GlobalBaseReg; 5757c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman 581e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsFrameIndex - FrameIndex for start of varargs area. 591e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int VarArgsFrameIndex; 601e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// RegSaveFrameIndex - X86-64 vararg func register save area. 611e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int RegSaveFrameIndex; 621e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsGPOffset - X86-64 vararg func int reg offset. 631e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned VarArgsGPOffset; 641e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsFPOffset - X86-64 vararg func fp reg offset. 651e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned VarArgsFPOffset; 6676927d758657b3a511c73467ec5a7288795c1513Rafael Espindola /// ArgumentStackSize - The number of bytes on stack consumed by the arguments 6776927d758657b3a511c73467ec5a7288795c1513Rafael Espindola /// being passed on the stack. 6876927d758657b3a511c73467ec5a7288795c1513Rafael Espindola unsigned ArgumentStackSize; 691e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 70e8bd0a332ab43c30a7745381075a9749070b6a50Evan Chengpublic: 71d15dff24c6a3712298e16453eb8d09c4404563a5Chris Lattner X86MachineFunctionInfo() : ForceFramePointer(false), 7289d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng CalleeSavedFrameSize(0), 73d15dff24c6a3712298e16453eb8d09c4404563a5Chris Lattner BytesToPopOnReturn(0), 74c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer ReturnAddrIndex(0), 7561a921344090457f9429e44c7906ea75ce97e020Dan Gohman TailCallReturnAddrDelta(0), 7657c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman SRetReturnReg(0), 771e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman GlobalBaseReg(0), 781e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman VarArgsFrameIndex(0), 791e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman RegSaveFrameIndex(0), 801e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman VarArgsGPOffset(0), 8176927d758657b3a511c73467ec5a7288795c1513Rafael Espindola VarArgsFPOffset(0), 8276927d758657b3a511c73467ec5a7288795c1513Rafael Espindola ArgumentStackSize(0) {} 83f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov 842392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman explicit X86MachineFunctionInfo(MachineFunction &MF) 852392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman : ForceFramePointer(false), 862392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman CalleeSavedFrameSize(0), 872392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman BytesToPopOnReturn(0), 882392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman ReturnAddrIndex(0), 892392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman TailCallReturnAddrDelta(0), 902392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman SRetReturnReg(0), 91fa85eb62378900a884a7eb4933a9deb6513d26abJim Grosbach GlobalBaseReg(0), 921e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman VarArgsFrameIndex(0), 931e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman RegSaveFrameIndex(0), 941e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman VarArgsGPOffset(0), 9576927d758657b3a511c73467ec5a7288795c1513Rafael Espindola VarArgsFPOffset(0), 9676927d758657b3a511c73467ec5a7288795c1513Rafael Espindola ArgumentStackSize(0) {} 97f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov 98e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng bool getForceFramePointer() const { return ForceFramePointer;} 99e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; } 100f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov 10189d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng unsigned getCalleeSavedFrameSize() const { return CalleeSavedFrameSize; } 10289d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng void setCalleeSavedFrameSize(unsigned bytes) { CalleeSavedFrameSize = bytes; } 10389d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng 104f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; } 105f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov void setBytesToPopOnReturn (unsigned bytes) { BytesToPopOnReturn = bytes;} 106f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov 107a2780e11ef0b757f0e5851bcf76c28c2f07dd379Anton Korobeynikov int getRAIndex() const { return ReturnAddrIndex; } 108a2780e11ef0b757f0e5851bcf76c28c2f07dd379Anton Korobeynikov void setRAIndex(int Index) { ReturnAddrIndex = Index; } 109c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer 110c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer int getTCReturnAddrDelta() const { return TailCallReturnAddrDelta; } 111c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer void setTCReturnAddrDelta(int delta) {TailCallReturnAddrDelta = delta;} 11261a921344090457f9429e44c7906ea75ce97e020Dan Gohman 11361a921344090457f9429e44c7906ea75ce97e020Dan Gohman unsigned getSRetReturnReg() const { return SRetReturnReg; } 11461a921344090457f9429e44c7906ea75ce97e020Dan Gohman void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 11557c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman 11657c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman unsigned getGlobalBaseReg() const { return GlobalBaseReg; } 11757c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; } 118fa85eb62378900a884a7eb4933a9deb6513d26abJim Grosbach 1191e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 1201e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsFrameIndex(int Idx) { VarArgsFrameIndex = Idx; } 1211e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 1221e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int getRegSaveFrameIndex() const { return RegSaveFrameIndex; } 1231e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setRegSaveFrameIndex(int Idx) { RegSaveFrameIndex = Idx; } 1241e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 1251e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned getVarArgsGPOffset() const { return VarArgsGPOffset; } 1261e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsGPOffset(unsigned Offset) { VarArgsGPOffset = Offset; } 1271e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 1281e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned getVarArgsFPOffset() const { return VarArgsFPOffset; } 1291e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsFPOffset(unsigned Offset) { VarArgsFPOffset = Offset; } 13076927d758657b3a511c73467ec5a7288795c1513Rafael Espindola 13176927d758657b3a511c73467ec5a7288795c1513Rafael Espindola unsigned getArgumentStackSize() const { return ArgumentStackSize; } 13276927d758657b3a511c73467ec5a7288795c1513Rafael Espindola void setArgumentStackSize(unsigned size) { ArgumentStackSize = size; } 133e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng}; 1346288b93f00e8747eaff69f2954a76efc587e7b55Dan Gohman 135e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng} // End llvm namespace 136e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng 137e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng#endif 138