X86MachineFunctionInfo.h revision de2d8694e25a814696358e95141f4b1aa4d8847e
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