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