blob: 3a7a98db50f4ff5e52cd91551499d868e1134db3 [file] [log] [blame]
Nick Lewyckyc3890d22015-07-29 22:32:47 +00001//===-- X86MachineFunctionInfo.h - X86 machine function info ----*- C++ -*-===//
Jia Liub22310f2012-02-18 12:03:15 +00002//
Evan Chengdc614c12006-06-06 23:30:24 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Jia Liub22310f2012-02-18 12:03:15 +00007//
Evan Chengdc614c12006-06-06 23:30:24 +00008//===----------------------------------------------------------------------===//
9//
10// This file declares X86-specific per-machine-function information.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_X86_X86MACHINEFUNCTIONINFO_H
15#define LLVM_LIB_TARGET_X86_X86MACHINEFUNCTIONINFO_H
Evan Chengdc614c12006-06-06 23:30:24 +000016
Reid Klecknerce009332014-12-22 23:58:37 +000017#include "llvm/CodeGen/CallingConvLower.h"
Evan Chengdc614c12006-06-06 23:30:24 +000018#include "llvm/CodeGen/MachineFunction.h"
Reid Kleckner16e55412014-08-29 21:42:08 +000019#include "llvm/CodeGen/MachineValueType.h"
20#include <vector>
Evan Chengdc614c12006-06-06 23:30:24 +000021
22namespace llvm {
23
Dan Gohman6f873b42009-04-15 01:20:18 +000024/// X86MachineFunctionInfo - This class is derived from MachineFunction and
25/// contains private X86 target-specific information for each MachineFunction.
Chris Lattnerff0598d2007-04-17 17:21:52 +000026class X86MachineFunctionInfo : public MachineFunctionInfo {
David Blaikiea379b1812011-12-20 02:50:00 +000027 virtual void anchor();
28
Anton Korobeynikov3c5b3df2006-09-20 22:03:51 +000029 /// ForceFramePointer - True if the function is required to use of frame
Chad Rosier24c19d22012-08-01 18:39:17 +000030 /// pointer for reasons other than it containing dynamic allocation or
Anton Korobeynikov3c5b3df2006-09-20 22:03:51 +000031 /// that FP eliminatation is turned off. For example, Cygwin main function
32 /// contains stack pointer re-alignment code which requires FP.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000033 bool ForceFramePointer = false;
Anton Korobeynikov3c5b3df2006-09-20 22:03:51 +000034
Michael Liao5bf95782014-12-04 05:20:33 +000035 /// RestoreBasePointerOffset - Non-zero if the function has base pointer
36 /// and makes call to llvm.eh.sjlj.setjmp. When non-zero, the value is a
37 /// displacement from the frame pointer to a slot where the base pointer
38 /// is stashed.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000039 signed char RestoreBasePointerOffset = 0;
Michael Liao5bf95782014-12-04 05:20:33 +000040
Evan Cheng9ae2eb42007-07-17 07:59:08 +000041 /// CalleeSavedFrameSize - Size of the callee-saved register portion of the
42 /// stack frame in bytes.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000043 unsigned CalleeSavedFrameSize = 0;
Evan Cheng9ae2eb42007-07-17 07:59:08 +000044
Dan Gohman31ae5862010-04-17 14:41:14 +000045 /// BytesToPopOnReturn - Number of bytes function pops on return (in addition
46 /// to the space used by the return address).
Anton Korobeynikov3c5b3df2006-09-20 22:03:51 +000047 /// Used on windows platform for stdcall & fastcall name decoration
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000048 unsigned BytesToPopOnReturn = 0;
Anton Korobeynikov3c5b3df2006-09-20 22:03:51 +000049
Evan Chengf55b7382008-01-05 00:41:47 +000050 /// ReturnAddrIndex - FrameIndex for return slot.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000051 int ReturnAddrIndex = 0;
Arnold Schwaighofer9ccea992007-10-11 19:40:01 +000052
David Majnemer13d0b112015-02-10 21:22:05 +000053 /// \brief FrameIndex for return slot.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000054 int FrameAddrIndex = 0;
David Majnemer13d0b112015-02-10 21:22:05 +000055
Evan Chengd064aef2010-02-06 03:28:46 +000056 /// TailCallReturnAddrDelta - The number of bytes by which return address
57 /// stack slot is moved as the result of tail call optimization.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000058 int TailCallReturnAddrDelta = 0;
Arnold Schwaighofer9ccea992007-10-11 19:40:01 +000059
Dan Gohmanf166d2d2008-04-21 23:59:07 +000060 /// SRetReturnReg - Some subtargets require that sret lowering includes
61 /// returning the value of the returned struct in a register. This field
62 /// holds the virtual register into which the sret argument is passed.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000063 unsigned SRetReturnReg = 0;
Dan Gohmanf166d2d2008-04-21 23:59:07 +000064
Dan Gohman0d1e9a82008-10-03 15:45:36 +000065 /// GlobalBaseReg - keeps track of the virtual register initialized for
66 /// use as the global base register. This is used for PIC in some PIC
67 /// relocation models.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000068 unsigned GlobalBaseReg = 0;
Dan Gohman6ebe7342008-09-30 00:58:23 +000069
Dan Gohman31ae5862010-04-17 14:41:14 +000070 /// VarArgsFrameIndex - FrameIndex for start of varargs area.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000071 int VarArgsFrameIndex = 0;
Dan Gohman31ae5862010-04-17 14:41:14 +000072 /// RegSaveFrameIndex - X86-64 vararg func register save area.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000073 int RegSaveFrameIndex = 0;
Dan Gohman31ae5862010-04-17 14:41:14 +000074 /// VarArgsGPOffset - X86-64 vararg func int reg offset.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000075 unsigned VarArgsGPOffset = 0;
Dan Gohman31ae5862010-04-17 14:41:14 +000076 /// VarArgsFPOffset - X86-64 vararg func fp reg offset.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000077 unsigned VarArgsFPOffset = 0;
Rafael Espindolac2174212011-08-30 19:39:58 +000078 /// ArgumentStackSize - The number of bytes on stack consumed by the arguments
79 /// being passed on the stack.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000080 unsigned ArgumentStackSize = 0;
Hans Wennborg789acfb2012-06-01 16:27:21 +000081 /// NumLocalDynamics - Number of local-dynamic TLS accesses.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000082 unsigned NumLocalDynamics = 0;
Michael Kuperstein13fbd452015-02-01 16:56:04 +000083 /// HasPushSequences - Keeps track of whether this function uses sequences
84 /// of pushes to pass function parameters.
Reid Kleckneraf04c2a2015-07-07 18:12:06 +000085 bool HasPushSequences = false;
Dan Gohman31ae5862010-04-17 14:41:14 +000086
Reid Klecknerd7045fa2015-12-15 21:41:34 +000087 /// True if the function recovers from an SEH exception, and therefore needs
88 /// to spill and restore the frame pointer.
Reid Klecknere69bdb82015-07-07 23:45:58 +000089 bool HasSEHFramePtrSave = false;
90
91 /// The frame index of a stack object containing the original frame pointer
92 /// used to address arguments in a function using a base pointer.
93 int SEHFramePtrSaveIndex = 0;
94
Reid Kleckner16e55412014-08-29 21:42:08 +000095private:
96 /// ForwardedMustTailRegParms - A list of virtual and physical registers
97 /// that must be forwarded to every musttail call.
Reid Klecknerce009332014-12-22 23:58:37 +000098 SmallVector<ForwardedRegister, 1> ForwardedMustTailRegParms;
Reid Kleckner16e55412014-08-29 21:42:08 +000099
100public:
Reid Kleckneraf04c2a2015-07-07 18:12:06 +0000101 X86MachineFunctionInfo() = default;
Chad Rosier24c19d22012-08-01 18:39:17 +0000102
Hans Wennborg13958b72015-07-22 20:46:11 +0000103 explicit X86MachineFunctionInfo(MachineFunction &MF) {}
Chad Rosier97c22142012-07-10 18:27:15 +0000104
Chad Rosier24c19d22012-08-01 18:39:17 +0000105 bool getForceFramePointer() const { return ForceFramePointer;}
Evan Chengdc614c12006-06-06 23:30:24 +0000106 void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; }
Anton Korobeynikov3c5b3df2006-09-20 22:03:51 +0000107
Michael Kuperstein13fbd452015-02-01 16:56:04 +0000108 bool getHasPushSequences() const { return HasPushSequences; }
109 void setHasPushSequences(bool HasPush) { HasPushSequences = HasPush; }
110
Michael Liaod8faa612014-12-04 00:56:38 +0000111 bool getRestoreBasePointer() const { return RestoreBasePointerOffset!=0; }
112 void setRestoreBasePointer(const MachineFunction *MF);
113 int getRestoreBasePointerOffset() const {return RestoreBasePointerOffset; }
114
Evan Cheng9ae2eb42007-07-17 07:59:08 +0000115 unsigned getCalleeSavedFrameSize() const { return CalleeSavedFrameSize; }
116 void setCalleeSavedFrameSize(unsigned bytes) { CalleeSavedFrameSize = bytes; }
117
Anton Korobeynikov3c5b3df2006-09-20 22:03:51 +0000118 unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; }
119 void setBytesToPopOnReturn (unsigned bytes) { BytesToPopOnReturn = bytes;}
120
Anton Korobeynikov597c8b72007-08-15 17:12:32 +0000121 int getRAIndex() const { return ReturnAddrIndex; }
122 void setRAIndex(int Index) { ReturnAddrIndex = Index; }
Arnold Schwaighofer9ccea992007-10-11 19:40:01 +0000123
David Majnemer13d0b112015-02-10 21:22:05 +0000124 int getFAIndex() const { return FrameAddrIndex; }
125 void setFAIndex(int Index) { FrameAddrIndex = Index; }
126
Arnold Schwaighofer9ccea992007-10-11 19:40:01 +0000127 int getTCReturnAddrDelta() const { return TailCallReturnAddrDelta; }
128 void setTCReturnAddrDelta(int delta) {TailCallReturnAddrDelta = delta;}
Dan Gohmanf166d2d2008-04-21 23:59:07 +0000129
130 unsigned getSRetReturnReg() const { return SRetReturnReg; }
131 void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
Dan Gohman6ebe7342008-09-30 00:58:23 +0000132
133 unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
134 void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
Jim Grosbach4dac8902010-04-06 20:26:37 +0000135
Dan Gohman31ae5862010-04-17 14:41:14 +0000136 int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
137 void setVarArgsFrameIndex(int Idx) { VarArgsFrameIndex = Idx; }
138
139 int getRegSaveFrameIndex() const { return RegSaveFrameIndex; }
140 void setRegSaveFrameIndex(int Idx) { RegSaveFrameIndex = Idx; }
141
142 unsigned getVarArgsGPOffset() const { return VarArgsGPOffset; }
143 void setVarArgsGPOffset(unsigned Offset) { VarArgsGPOffset = Offset; }
144
145 unsigned getVarArgsFPOffset() const { return VarArgsFPOffset; }
146 void setVarArgsFPOffset(unsigned Offset) { VarArgsFPOffset = Offset; }
Rafael Espindolac2174212011-08-30 19:39:58 +0000147
148 unsigned getArgumentStackSize() const { return ArgumentStackSize; }
149 void setArgumentStackSize(unsigned size) { ArgumentStackSize = size; }
Hans Wennborg789acfb2012-06-01 16:27:21 +0000150
151 unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; }
152 void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; }
Chad Rosier97c22142012-07-10 18:27:15 +0000153
Reid Klecknere69bdb82015-07-07 23:45:58 +0000154 bool getHasSEHFramePtrSave() const { return HasSEHFramePtrSave; }
155 void setHasSEHFramePtrSave(bool V) { HasSEHFramePtrSave = V; }
156
157 int getSEHFramePtrSaveIndex() const { return SEHFramePtrSaveIndex; }
158 void setSEHFramePtrSaveIndex(int Index) { SEHFramePtrSaveIndex = Index; }
159
Reid Klecknerce009332014-12-22 23:58:37 +0000160 SmallVectorImpl<ForwardedRegister> &getForwardedMustTailRegParms() {
Reid Kleckner16e55412014-08-29 21:42:08 +0000161 return ForwardedMustTailRegParms;
162 }
Evan Chengdc614c12006-06-06 23:30:24 +0000163};
Dan Gohman6f873b42009-04-15 01:20:18 +0000164
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000165} // End llvm namespace
Evan Chengdc614c12006-06-06 23:30:24 +0000166
167#endif