1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===-- X86MachineFunctionInfo.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
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_X86_X86MACHINEFUNCTIONINFO_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_X86_X86MACHINEFUNCTIONINFO_H
16e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng
17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/CodeGen/CallingConvLower.h"
18e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng#include "llvm/CodeGen/MachineFunction.h"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/CodeGen/MachineValueType.h"
20e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng
21e8bd0a332ab43c30a7745381075a9749070b6a50Evan Chengnamespace llvm {
22e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng
236288b93f00e8747eaff69f2954a76efc587e7b55Dan Gohman/// X86MachineFunctionInfo - This class is derived from MachineFunction and
246288b93f00e8747eaff69f2954a76efc587e7b55Dan Gohman/// contains private X86 target-specific information for each MachineFunction.
25d15dff24c6a3712298e16453eb8d09c4404563a5Chris Lattnerclass X86MachineFunctionInfo : public MachineFunctionInfo {
262d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
272d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
28f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  /// ForceFramePointer - True if the function is required to use of frame
29a20e1e7ef596842127794372244fd5c646f71296Chad Rosier  /// pointer for reasons other than it containing dynamic allocation or
30f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  /// that FP eliminatation is turned off. For example, Cygwin main function
31f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  /// contains stack pointer re-alignment code which requires FP.
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool ForceFramePointer = false;
33f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov
34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// RestoreBasePointerOffset - Non-zero if the function has base pointer
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// and makes call to llvm.eh.sjlj.setjmp. When non-zero, the value is a
36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// displacement from the frame pointer to a slot where the base pointer
37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// is stashed.
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  signed char RestoreBasePointerOffset = 0;
39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
4089d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng  /// CalleeSavedFrameSize - Size of the callee-saved register portion of the
4189d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng  /// stack frame in bytes.
42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned CalleeSavedFrameSize = 0;
4389d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng
441e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// BytesToPopOnReturn - Number of bytes function pops on return (in addition
451e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// to the space used by the return address).
46f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  /// Used on windows platform for stdcall & fastcall name decoration
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned BytesToPopOnReturn = 0;
48f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov
490475ab58b8e92fa8e8b90ddbf023bc60587c5e25Evan Cheng  /// ReturnAddrIndex - FrameIndex for return slot.
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int ReturnAddrIndex = 0;
51c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief FrameIndex for return slot.
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int FrameAddrIndex = 0;
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
55f22f9b35d6e6444028ed288bfae526f53740b5c1Evan Cheng  /// TailCallReturnAddrDelta - The number of bytes by which return address
56f22f9b35d6e6444028ed288bfae526f53740b5c1Evan Cheng  /// stack slot is moved as the result of tail call optimization.
57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int TailCallReturnAddrDelta = 0;
58c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer
5961a921344090457f9429e44c7906ea75ce97e020Dan Gohman  /// SRetReturnReg - Some subtargets require that sret lowering includes
6061a921344090457f9429e44c7906ea75ce97e020Dan Gohman  /// returning the value of the returned struct in a register. This field
6161a921344090457f9429e44c7906ea75ce97e020Dan Gohman  /// holds the virtual register into which the sret argument is passed.
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned SRetReturnReg = 0;
6361a921344090457f9429e44c7906ea75ce97e020Dan Gohman
64d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  /// GlobalBaseReg - keeps track of the virtual register initialized for
65d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  /// use as the global base register. This is used for PIC in some PIC
66d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  /// relocation models.
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned GlobalBaseReg = 0;
6857c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman
691e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// VarArgsFrameIndex - FrameIndex for start of varargs area.
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int VarArgsFrameIndex = 0;
711e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// RegSaveFrameIndex - X86-64 vararg func register save area.
72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int RegSaveFrameIndex = 0;
731e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// VarArgsGPOffset - X86-64 vararg func int reg offset.
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned VarArgsGPOffset = 0;
751e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// VarArgsFPOffset - X86-64 vararg func fp reg offset.
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned VarArgsFPOffset = 0;
7776927d758657b3a511c73467ec5a7288795c1513Rafael Espindola  /// ArgumentStackSize - The number of bytes on stack consumed by the arguments
7876927d758657b3a511c73467ec5a7288795c1513Rafael Espindola  /// being passed on the stack.
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned ArgumentStackSize = 0;
80f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  /// NumLocalDynamics - Number of local-dynamic TLS accesses.
81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned NumLocalDynamics = 0;
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// HasPushSequences - Keeps track of whether this function uses sequences
83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// of pushes to pass function parameters.
84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool HasPushSequences = false;
85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// True if the function recovers from an SEH exception, and therefore needs
87f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// to spill and restore the frame pointer.
88f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool HasSEHFramePtrSave = false;
89f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
90f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// The frame index of a stack object containing the original frame pointer
91f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// used to address arguments in a function using a base pointer.
92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int SEHFramePtrSaveIndex = 0;
9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// True if this function has a subset of CSRs that is handled explicitly via
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// copies.
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool IsSplitCSR = false;
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// True if this function uses the red zone.
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool UsesRedZone = false;
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// True if this function has WIN_ALLOCA instructions.
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool HasWinAlloca = false;
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate:
10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// ForwardedMustTailRegParms - A list of virtual and physical registers
10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// that must be forwarded to every musttail call.
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  SmallVector<ForwardedRegister, 1> ForwardedMustTailRegParms;
10837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
10937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
110f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  X86MachineFunctionInfo() = default;
111f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
112f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  explicit X86MachineFunctionInfo(MachineFunction &MF) {}
1132b02688b6eee1340cb916934182a02698eea9f36Chad Rosier
114a20e1e7ef596842127794372244fd5c646f71296Chad Rosier  bool getForceFramePointer() const { return ForceFramePointer;}
115e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng  void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; }
116f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov
117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool getHasPushSequences() const { return HasPushSequences; }
118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void setHasPushSequences(bool HasPush) { HasPushSequences = HasPush; }
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool getRestoreBasePointer() const { return RestoreBasePointerOffset!=0; }
121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void setRestoreBasePointer(const MachineFunction *MF);
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  int getRestoreBasePointerOffset() const {return RestoreBasePointerOffset; }
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
12489d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng  unsigned getCalleeSavedFrameSize() const { return CalleeSavedFrameSize; }
12589d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng  void setCalleeSavedFrameSize(unsigned bytes) { CalleeSavedFrameSize = bytes; }
12689d1659cf2db49162742ea3a261832b70e2897f9Evan Cheng
127f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; }
128f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov  void setBytesToPopOnReturn (unsigned bytes) { BytesToPopOnReturn = bytes;}
129f824868ed9d2cc756a797f6dbd67732f75e31cd6Anton Korobeynikov
130a2780e11ef0b757f0e5851bcf76c28c2f07dd379Anton Korobeynikov  int getRAIndex() const { return ReturnAddrIndex; }
131a2780e11ef0b757f0e5851bcf76c28c2f07dd379Anton Korobeynikov  void setRAIndex(int Index) { ReturnAddrIndex = Index; }
132c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer
133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  int getFAIndex() const { return FrameAddrIndex; }
134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void setFAIndex(int Index) { FrameAddrIndex = Index; }
135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
136c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer  int getTCReturnAddrDelta() const { return TailCallReturnAddrDelta; }
137c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer  void setTCReturnAddrDelta(int delta) {TailCallReturnAddrDelta = delta;}
13861a921344090457f9429e44c7906ea75ce97e020Dan Gohman
13961a921344090457f9429e44c7906ea75ce97e020Dan Gohman  unsigned getSRetReturnReg() const { return SRetReturnReg; }
14061a921344090457f9429e44c7906ea75ce97e020Dan Gohman  void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
14157c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman
14257c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman  unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
14357c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman  void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
144fa85eb62378900a884a7eb4933a9deb6513d26abJim Grosbach
1451e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
1461e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFrameIndex(int Idx) { VarArgsFrameIndex = Idx; }
1471e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
1481e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getRegSaveFrameIndex() const { return RegSaveFrameIndex; }
1491e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setRegSaveFrameIndex(int Idx) { RegSaveFrameIndex = Idx; }
1501e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
1511e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  unsigned getVarArgsGPOffset() const { return VarArgsGPOffset; }
1521e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsGPOffset(unsigned Offset) { VarArgsGPOffset = Offset; }
1531e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
1541e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  unsigned getVarArgsFPOffset() const { return VarArgsFPOffset; }
1551e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFPOffset(unsigned Offset) { VarArgsFPOffset = Offset; }
15676927d758657b3a511c73467ec5a7288795c1513Rafael Espindola
15776927d758657b3a511c73467ec5a7288795c1513Rafael Espindola  unsigned getArgumentStackSize() const { return ArgumentStackSize; }
15876927d758657b3a511c73467ec5a7288795c1513Rafael Espindola  void setArgumentStackSize(unsigned size) { ArgumentStackSize = size; }
159f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg
160f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; }
161f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; }
1622b02688b6eee1340cb916934182a02698eea9f36Chad Rosier
163f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool getHasSEHFramePtrSave() const { return HasSEHFramePtrSave; }
164f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void setHasSEHFramePtrSave(bool V) { HasSEHFramePtrSave = V; }
165f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
166f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int getSEHFramePtrSaveIndex() const { return SEHFramePtrSaveIndex; }
167f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void setSEHFramePtrSaveIndex(int Index) { SEHFramePtrSaveIndex = Index; }
168f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
169ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  SmallVectorImpl<ForwardedRegister> &getForwardedMustTailRegParms() {
17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return ForwardedMustTailRegParms;
17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool isSplitCSR() const { return IsSplitCSR; }
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void setIsSplitCSR(bool s) { IsSplitCSR = s; }
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool getUsesRedZone() const { return UsesRedZone; }
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void setUsesRedZone(bool V) { UsesRedZone = V; }
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool hasWinAlloca() const { return HasWinAlloca; }
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void setHasWinAlloca(bool v) { HasWinAlloca = v; }
181e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng};
1826288b93f00e8747eaff69f2954a76efc587e7b55Dan Gohman
183e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng} // End llvm namespace
184e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng
185e8bd0a332ab43c30a7745381075a9749070b6a50Evan Cheng#endif
186