12f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey//===-- PPCMachineFunctionInfo.h - Private data used for PowerPC --*- C++ -*-=// 22f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// 32f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// The LLVM Compiler Infrastructure 42f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 72f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// 82f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey//===----------------------------------------------------------------------===// 92f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// 102f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// This file declares the PowerPC specific subclass of MachineFunctionInfo. 112f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// 122f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey//===----------------------------------------------------------------------===// 132f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 142f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey#ifndef PPC_MACHINE_FUNCTION_INFO_H 152f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey#define PPC_MACHINE_FUNCTION_INFO_H 162f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 172f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey#include "llvm/CodeGen/MachineFunction.h" 182f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 192f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskeynamespace llvm { 202f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 212f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey/// PPCFunctionInfo - This class is derived from MachineFunction private 222f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey/// PowerPC target-specific information for each MachineFunction. 232f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskeyclass PPCFunctionInfo : public MachineFunctionInfo { 242d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 252d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 262f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey /// FramePointerSaveIndex - Frame index of where the old frame pointer is 272f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey /// stored. Also used as an anchor for instructions that need to be altered 282f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey /// when using frame pointers (dyna_add, dyna_sub.) 292f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey int FramePointerSaveIndex; 30d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey 313fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner /// ReturnAddrSaveIndex - Frame index of where the return address is stored. 32d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey /// 333fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner int ReturnAddrSaveIndex; 343fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner 35c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// MustSaveLR - Indicates whether LR is defined (or clobbered) in the current 36c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// function. This is only valid after the initial scan of the function by 37c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// PEI. 38c12e5812be4dacc30781db84b045775c46580240Dale Johannesen bool MustSaveLR; 392f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 400cfb42adb5072fb19a01dba3ea58a33fd5927947Hal Finkel /// Does this function have any stack spills. 410cfb42adb5072fb19a01dba3ea58a33fd5927947Hal Finkel bool HasSpills; 420cfb42adb5072fb19a01dba3ea58a33fd5927947Hal Finkel 43324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel /// Does this function spill using instructions with only r+r (not r+i) 44324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel /// forms. 45324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel bool HasNonRISpills; 46324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel 477194aaf738a1b89441635340403f1c5b06ae18efBill Wendling /// SpillsCR - Indicates whether CR is spilled in the current function. 487194aaf738a1b89441635340403f1c5b06ae18efBill Wendling bool SpillsCR; 497194aaf738a1b89441635340403f1c5b06ae18efBill Wendling 503fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner /// LRStoreRequired - The bool indicates whether there is some explicit use of 513fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner /// the LR/LR8 stack slot that is not obvious from scanning the code. This 523fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner /// requires that the code generator produce a store of LR to the stack on 533fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner /// entry, even though LR may otherwise apparently not be used. 543fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner bool LRStoreRequired; 5530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 5630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// MinReservedArea - This is the frame size that is at least reserved in a 5730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// potential caller (parameter+linkage area). 5830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer unsigned MinReservedArea; 5930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 6030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// TailCallSPDelta - Stack pointer delta used when tail calling. Maximum 6130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// amount the stack pointer is adjusted to make the frame bigger for tail 6230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// calls. Used for creating an area before the register spill area. 6330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer int TailCallSPDelta; 6430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 6530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// HasFastCall - Does this function contain a fast call. Used to determine 6630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// how the caller's stack pointer should be calculated (epilog/dynamicalloc). 6730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer bool HasFastCall; 6830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 691e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsFrameIndex - FrameIndex for start of varargs area. 701e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int VarArgsFrameIndex; 711e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsStackOffset - StackOffset for start of stack 721e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// arguments. 731e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int VarArgsStackOffset; 741e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsNumGPR - Index of the first unused integer 751e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// register for parameter passing. 761e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned VarArgsNumGPR; 771e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// VarArgsNumFPR - Index of the first unused double 781e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman /// register for parameter passing. 791e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned VarArgsNumFPR; 801e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 814edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt /// CRSpillFrameIndex - FrameIndex for CR spill slot for 32-bit SVR4. 824edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt int CRSpillFrameIndex; 834edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt 842f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskeypublic: 852392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman explicit PPCFunctionInfo(MachineFunction &MF) 867194aaf738a1b89441635340403f1c5b06ae18efBill Wendling : FramePointerSaveIndex(0), 877194aaf738a1b89441635340403f1c5b06ae18efBill Wendling ReturnAddrSaveIndex(0), 880cfb42adb5072fb19a01dba3ea58a33fd5927947Hal Finkel HasSpills(false), 89324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel HasNonRISpills(false), 907194aaf738a1b89441635340403f1c5b06ae18efBill Wendling SpillsCR(false), 9130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer LRStoreRequired(false), 9230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer MinReservedArea(0), 9330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer TailCallSPDelta(0), 941e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman HasFastCall(false), 951e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman VarArgsFrameIndex(0), 961e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman VarArgsStackOffset(0), 971e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman VarArgsNumGPR(0), 984edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt VarArgsNumFPR(0), 994edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt CRSpillFrameIndex(0) {} 1002f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 1012f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey int getFramePointerSaveIndex() const { return FramePointerSaveIndex; } 1022f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; } 103d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey 1043fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner int getReturnAddrSaveIndex() const { return ReturnAddrSaveIndex; } 1053fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner void setReturnAddrSaveIndex(int idx) { ReturnAddrSaveIndex = idx; } 10630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 10730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer unsigned getMinReservedArea() const { return MinReservedArea; } 10830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer void setMinReservedArea(unsigned size) { MinReservedArea = size; } 10930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 11030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer int getTailCallSPDelta() const { return TailCallSPDelta; } 11130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer void setTailCallSPDelta(int size) { TailCallSPDelta = size; } 11230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 113c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// MustSaveLR - This is set when the prolog/epilog inserter does its initial 114c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// scan of the function. It is true if the LR/LR8 register is ever explicitly 115c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// defined/clobbered in the machine function (e.g. by calls and movpctolr, 116c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// which is used in PIC generation), or if the LR stack slot is explicitly 117c12e5812be4dacc30781db84b045775c46580240Dale Johannesen /// referenced by builtin_return_address. 118c12e5812be4dacc30781db84b045775c46580240Dale Johannesen void setMustSaveLR(bool U) { MustSaveLR = U; } 119c12e5812be4dacc30781db84b045775c46580240Dale Johannesen bool mustSaveLR() const { return MustSaveLR; } 1202f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 1210cfb42adb5072fb19a01dba3ea58a33fd5927947Hal Finkel void setHasSpills() { HasSpills = true; } 1220cfb42adb5072fb19a01dba3ea58a33fd5927947Hal Finkel bool hasSpills() const { return HasSpills; } 123324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel 124324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel void setHasNonRISpills() { HasNonRISpills = true; } 125324972904353594ad4a0cdfc79370f85e9fb9c8fHal Finkel bool hasNonRISpills() const { return HasNonRISpills; } 1260cfb42adb5072fb19a01dba3ea58a33fd5927947Hal Finkel 1277194aaf738a1b89441635340403f1c5b06ae18efBill Wendling void setSpillsCR() { SpillsCR = true; } 1287194aaf738a1b89441635340403f1c5b06ae18efBill Wendling bool isCRSpilled() const { return SpillsCR; } 1297194aaf738a1b89441635340403f1c5b06ae18efBill Wendling 1303fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner void setLRStoreRequired() { LRStoreRequired = true; } 1313fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner bool isLRStoreRequired() const { return LRStoreRequired; } 13230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 13330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer void setHasFastCall() { HasFastCall = true; } 13430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer bool hasFastCall() const { return HasFastCall;} 1351e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 1361e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } 1371e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 1381e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 1391e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman int getVarArgsStackOffset() const { return VarArgsStackOffset; } 1401e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsStackOffset(int Offset) { VarArgsStackOffset = Offset; } 1411e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 1421e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned getVarArgsNumGPR() const { return VarArgsNumGPR; } 1431e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsNumGPR(unsigned Num) { VarArgsNumGPR = Num; } 1441e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman 1451e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman unsigned getVarArgsNumFPR() const { return VarArgsNumFPR; } 1461e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman void setVarArgsNumFPR(unsigned Num) { VarArgsNumFPR = Num; } 1474edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt 1484edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt int getCRSpillFrameIndex() const { return CRSpillFrameIndex; } 1494edd84da1b3f7fd73e96a13b6b7e183ad04ac7c4Bill Schmidt void setCRSpillFrameIndex(int idx) { CRSpillFrameIndex = idx; } 1502f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey}; 1512f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 1522f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey} // end of namespace llvm 1532f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 1542f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 15524652d16f84e4fd605aaffdd5112a606be6c8074Reid Spencer#endif 156