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
27a20e1e7ef596842127794372244fd5c646f71296Chad Rosier  /// 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;
69f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  /// NumLocalDynamics - Number of local-dynamic TLS accesses.
70f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  unsigned NumLocalDynamics;
711e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
72e8bd0a332ab43c30a7745381075a9749070b6a50Evan Chengpublic:
73d15dff24c6a3712298e16453eb8d09c4404563a5Chris Lattner  X86MachineFunctionInfo() : ForceFramePointer(false),
7489d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng                             CalleeSavedFrameSize(0),
75d15dff24c6a3712298e16453eb8d09c4404563a5Chris Lattner                             BytesToPopOnReturn(0),
76c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer                             ReturnAddrIndex(0),
7761a921344090457f9429e44c7906ea75ce97e020Dan Gohman                             TailCallReturnAddrDelta(0),
7857c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman                             SRetReturnReg(0),
791e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman                             GlobalBaseReg(0),
801e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman                             VarArgsFrameIndex(0),
811e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman                             RegSaveFrameIndex(0),
821e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman                             VarArgsGPOffset(0),
8376927d758657b3a511c73467ec5a7288795c1513Rafael Espindola                             VarArgsFPOffset(0),
84f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg                             ArgumentStackSize(0),
85f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg                             NumLocalDynamics(0) {}
86a20e1e7ef596842127794372244fd5c646f71296Chad Rosier
872392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman  explicit X86MachineFunctionInfo(MachineFunction &MF)
882392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman    : ForceFramePointer(false),
892392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman      CalleeSavedFrameSize(0),
902392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman      BytesToPopOnReturn(0),
912392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman      ReturnAddrIndex(0),
922392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman      TailCallReturnAddrDelta(0),
932392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman      SRetReturnReg(0),
94fa85eb62378900a884a7eb4933a9deb6513d26abJim Grosbach      GlobalBaseReg(0),
951e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman      VarArgsFrameIndex(0),
961e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman      RegSaveFrameIndex(0),
971e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman      VarArgsGPOffset(0),
9876927d758657b3a511c73467ec5a7288795c1513Rafael Espindola      VarArgsFPOffset(0),
99f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg      ArgumentStackSize(0),
1003591955bce8dd3fe638a913f23bf479670dbff4dChad Rosier      NumLocalDynamics(0) {}
1012b02688b6eee1340cb916934182a02698eea9f36Chad Rosier
102a20e1e7ef596842127794372244fd5c646f71296Chad Rosier  bool getForceFramePointer() const { return ForceFramePointer;}
103e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng  void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; }
104f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov
10589d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng  unsigned getCalleeSavedFrameSize() const { return CalleeSavedFrameSize; }
10689d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng  void setCalleeSavedFrameSize(unsigned bytes) { CalleeSavedFrameSize = bytes; }
10789d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng
108f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; }
109f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  void setBytesToPopOnReturn (unsigned bytes) { BytesToPopOnReturn = bytes;}
110f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov
111a2780e11ef0b757f0e5851bcf76c28c2f07dd379Anton Korobeynikov  int getRAIndex() const { return ReturnAddrIndex; }
112a2780e11ef0b757f0e5851bcf76c28c2f07dd379Anton Korobeynikov  void setRAIndex(int Index) { ReturnAddrIndex = Index; }
113c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer
114c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer  int getTCReturnAddrDelta() const { return TailCallReturnAddrDelta; }
115c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer  void setTCReturnAddrDelta(int delta) {TailCallReturnAddrDelta = delta;}
11661a921344090457f9429e44c7906ea75ce97e020Dan Gohman
11761a921344090457f9429e44c7906ea75ce97e020Dan Gohman  unsigned getSRetReturnReg() const { return SRetReturnReg; }
11861a921344090457f9429e44c7906ea75ce97e020Dan Gohman  void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
11957c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman
12057c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman  unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
12157c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman  void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
122fa85eb62378900a884a7eb4933a9deb6513d26abJim Grosbach
1231e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
1241e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFrameIndex(int Idx) { VarArgsFrameIndex = Idx; }
1251e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
1261e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getRegSaveFrameIndex() const { return RegSaveFrameIndex; }
1271e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setRegSaveFrameIndex(int Idx) { RegSaveFrameIndex = Idx; }
1281e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
1291e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  unsigned getVarArgsGPOffset() const { return VarArgsGPOffset; }
1301e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsGPOffset(unsigned Offset) { VarArgsGPOffset = Offset; }
1311e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
1321e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  unsigned getVarArgsFPOffset() const { return VarArgsFPOffset; }
1331e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFPOffset(unsigned Offset) { VarArgsFPOffset = Offset; }
13476927d758657b3a511c73467ec5a7288795c1513Rafael Espindola
13576927d758657b3a511c73467ec5a7288795c1513Rafael Espindola  unsigned getArgumentStackSize() const { return ArgumentStackSize; }
13676927d758657b3a511c73467ec5a7288795c1513Rafael Espindola  void setArgumentStackSize(unsigned size) { ArgumentStackSize = size; }
137f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg
138f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; }
139f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; }
1402b02688b6eee1340cb916934182a02698eea9f36Chad Rosier
141e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng};
1426288b93f00e8747eaff69f2954a76efc587e7b55Dan Gohman
143e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng} // End llvm namespace
144e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng
145e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng#endif
146