ARMMachineFunctionInfo.h revision f65e4932f83ac0c36594d97fca73dc9a9fd26672
131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMMachineFuctionInfo.h - ARM machine function info -----*- C++ -*-===//
2764ab52dd80310a205c9888bf166d09dab858f90Jim Grosbach//
3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//                     The LLVM Compiler Infrastructure
4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7764ab52dd80310a205c9888bf166d09dab858f90Jim Grosbach//
8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file declares ARM-specific per-machine-function information.
11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#ifndef ARMMACHINEFUNCTIONINFO_H
15a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#define ARMMACHINEFUNCTIONINFO_H
16a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
17a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMSubtarget.h"
18a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ADT/BitVector.h"
19a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/CodeGen/MachineFunction.h"
20a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/Target/TargetMachine.h"
21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetRegisterInfo.h"
22a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
23a8e2989ece6dc46df59b0768184028257f913843Evan Chengnamespace llvm {
24a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
25ca3f06963c21ee34c7454be807c4d72af3b0f3adBob Wilson/// ARMFunctionInfo - This class is derived from MachineFunctionInfo and
26ca3f06963c21ee34c7454be807c4d72af3b0f3adBob Wilson/// contains private ARM-specific information for each MachineFunction.
27a8e2989ece6dc46df59b0768184028257f913843Evan Chengclass ARMFunctionInfo : public MachineFunctionInfo {
282d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
29a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
30a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// isThumb - True if this function is compiled under Thumb mode.
31bd24f3f398bc26d686836dc412f3c1997953f427Dale Johannesen  /// Used to initialized Align, so must precede it.
32a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  bool isThumb;
33a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
345e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  /// hasThumb2 - True if the target architecture supports Thumb2. Do not use
355e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  /// to determine if function is compiled under Thumb mode, for that use
365e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  /// 'isThumb'.
375e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  bool hasThumb2;
385e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin
39a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// VarArgsRegSaveSize - Size of the register save area for vararg functions.
40a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ///
41f65e4932f83ac0c36594d97fca73dc9a9fd26672Stepan Dyatkovskiy  unsigned ArgRegsSaveSize;
42a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
4375e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  /// HasStackFrame - True if this function has a stack frame. Set by
44a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// processFunctionBeforeCalleeSavedScan().
4575e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  bool HasStackFrame;
46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
47ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  /// RestoreSPFromFP - True if epilogue should restore SP from FP. Set by
48ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  /// emitPrologue.
49ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  bool RestoreSPFromFP;
50ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng
51f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  /// LRSpilledForFarJump - True if the LR register has been for spilled to
52f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  /// enable far jump.
53f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  bool LRSpilledForFarJump;
5478268b943669cd0c0e1e874e2a329fcf200bd59bEvan Cheng
5575e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  /// FramePtrSpillOffset - If HasStackFrame, this records the frame pointer
56a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// spill stack offset.
57a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned FramePtrSpillOffset;
58a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
59ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPRCS1Offset, GPRCS2Offset, DPRCSOffset - Starting offset of callee saved
60ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// register spills areas. For Mac OS X:
61a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ///
62ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPR callee-saved (1) : r4, r5, r6, r7, lr
63ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// --------------------------------------------
64ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPR callee-saved (2) : r8, r10, r11
65a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// --------------------------------------------
66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// DPR callee-saved : d8 - d15
67f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  ///
68f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// Also see AlignedDPRCSRegs below. Not all D-regs need to go in area 3.
69f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// Some may be spilled after the stack has been realigned.
70ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS1Offset;
71ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS2Offset;
72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned DPRCSOffset;
73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
74ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPRCS1Size, GPRCS2Size, DPRCSSize - Sizes of callee saved register spills
75ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// areas.
76ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS1Size;
77ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS2Size;
78a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned DPRCSSize;
79a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
80ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPRCS1Frames, GPRCS2Frames, DPRCSFrames - Keeps track of frame indices
81ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// which belong to these spill areas.
82ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  BitVector GPRCS1Frames;
83ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  BitVector GPRCS2Frames;
84cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng  BitVector DPRCSFrames;
85a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
86f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// NumAlignedDPRCS2Regs - The number of callee-saved DPRs that are saved in
87f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// the aligned portion of the stack frame.  This is always a contiguous
88f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// sequence of D-registers starting from d8.
89f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  ///
90f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// We do not keep track of the frame indices used for these registers - they
91f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// behave like any other frame index in the aligned stack frame.  These
92f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// registers also aren't included in DPRCSSize above.
93f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  unsigned NumAlignedDPRCS2Regs;
94f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen
95a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// JumpTableUId - Unique id for jumptables.
96a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ///
97a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned JumpTableUId;
98a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
995de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  unsigned PICLabelUId;
100f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
1011e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// VarArgsFrameIndex - FrameIndex for start of varargs area.
1021e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int VarArgsFrameIndex;
1031e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
10486050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  /// HasITBlocks - True if IT blocks have been inserted.
10586050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  bool HasITBlocks;
10686050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng
10798b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  /// CPEClones - Track constant pool entries clones created by Constant Island
10898b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  /// pass.
10998b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  DenseMap<unsigned, unsigned> CPEClones;
11098b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov
1118f50647662560167b88851f92c3c891d2e7c1696Jush Lu  /// GlobalBaseReg - keeps track of the virtual register initialized for
1128f50647662560167b88851f92c3c891d2e7c1696Jush Lu  /// use as the global base register. This is used for PIC in some PIC
1138f50647662560167b88851f92c3c891d2e7c1696Jush Lu  /// relocation models.
1148f50647662560167b88851f92c3c891d2e7c1696Jush Lu  unsigned GlobalBaseReg;
1158f50647662560167b88851f92c3c891d2e7c1696Jush Lu
116a8e2989ece6dc46df59b0768184028257f913843Evan Chengpublic:
117a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ARMFunctionInfo() :
1185e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin    isThumb(false),
1195e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin    hasThumb2(false),
120f65e4932f83ac0c36594d97fca73dc9a9fd26672Stepan Dyatkovskiy    ArgRegsSaveSize(0), HasStackFrame(false), RestoreSPFromFP(false),
1211f30dcbd8dcf18cabb4be780fcf492869d5dcab9Jim Grosbach    LRSpilledForFarJump(false),
122ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
123ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
124ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    GPRCS1Frames(0), GPRCS2Frames(0), DPRCSFrames(0),
125f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen    NumAlignedDPRCS2Regs(0),
1265de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    JumpTableUId(0), PICLabelUId(0),
1278f50647662560167b88851f92c3c891d2e7c1696Jush Lu    VarArgsFrameIndex(0), HasITBlocks(false), GlobalBaseReg(0) {}
128a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
1292392efef1bd2599231ab659dd6ba4233bf5df94cDan Gohman  explicit ARMFunctionInfo(MachineFunction &MF) :
130a8e2989ece6dc46df59b0768184028257f913843Evan Cheng    isThumb(MF.getTarget().getSubtarget<ARMSubtarget>().isThumb()),
1315e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin    hasThumb2(MF.getTarget().getSubtarget<ARMSubtarget>().hasThumb2()),
132f65e4932f83ac0c36594d97fca73dc9a9fd26672Stepan Dyatkovskiy    ArgRegsSaveSize(0), HasStackFrame(false), RestoreSPFromFP(false),
1331f30dcbd8dcf18cabb4be780fcf492869d5dcab9Jim Grosbach    LRSpilledForFarJump(false),
134ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
135ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
136ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    GPRCS1Frames(32), GPRCS2Frames(32), DPRCSFrames(32),
1375de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    JumpTableUId(0), PICLabelUId(0),
1388f50647662560167b88851f92c3c891d2e7c1696Jush Lu    VarArgsFrameIndex(0), HasITBlocks(false), GlobalBaseReg(0) {}
139a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
140a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  bool isThumbFunction() const { return isThumb; }
141f1daf7d8abebd6e0104a6b41a774ccbb19a51c60David Goodwin  bool isThumb1OnlyFunction() const { return isThumb && !hasThumb2; }
1425e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  bool isThumb2Function() const { return isThumb && hasThumb2; }
143a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
144f65e4932f83ac0c36594d97fca73dc9a9fd26672Stepan Dyatkovskiy  unsigned getArgRegsSaveSize() const { return ArgRegsSaveSize; }
145f65e4932f83ac0c36594d97fca73dc9a9fd26672Stepan Dyatkovskiy  void setArgRegsSaveSize(unsigned s) { ArgRegsSaveSize = s; }
146a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
14775e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  bool hasStackFrame() const { return HasStackFrame; }
14875e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  void setHasStackFrame(bool s) { HasStackFrame = s; }
14978268b943669cd0c0e1e874e2a329fcf200bd59bEvan Cheng
150ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  bool shouldRestoreSPFromFP() const { return RestoreSPFromFP; }
151ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  void setShouldRestoreSPFromFP(bool s) { RestoreSPFromFP = s; }
152ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng
153f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  bool isLRSpilledForFarJump() const { return LRSpilledForFarJump; }
154f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  void setLRIsSpilledForFarJump(bool s) { LRSpilledForFarJump = s; }
15578268b943669cd0c0e1e874e2a329fcf200bd59bEvan Cheng
156a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; }
157a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  void setFramePtrSpillOffset(unsigned o) { FramePtrSpillOffset = o; }
158764ab52dd80310a205c9888bf166d09dab858f90Jim Grosbach
159f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  unsigned getNumAlignedDPRCS2Regs() const { return NumAlignedDPRCS2Regs; }
160f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  void setNumAlignedDPRCS2Regs(unsigned n) { NumAlignedDPRCS2Regs = n; }
161f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen
162ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea1Offset() const { return GPRCS1Offset; }
163ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea2Offset() const { return GPRCS2Offset; }
164a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned getDPRCalleeSavedAreaOffset()  const { return DPRCSOffset; }
165a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
166ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea1Offset(unsigned o) { GPRCS1Offset = o; }
167ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea2Offset(unsigned o) { GPRCS2Offset = o; }
168a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  void setDPRCalleeSavedAreaOffset(unsigned o)  { DPRCSOffset = o; }
169a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
170ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea1Size() const { return GPRCS1Size; }
171ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea2Size() const { return GPRCS2Size; }
172a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned getDPRCalleeSavedAreaSize()  const { return DPRCSSize; }
173a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
174ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea1Size(unsigned s) { GPRCS1Size = s; }
175ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea2Size(unsigned s) { GPRCS2Size = s; }
176a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  void setDPRCalleeSavedAreaSize(unsigned s)  { DPRCSSize = s; }
177a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
178ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  bool isGPRCalleeSavedArea1Frame(int fi) const {
179ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    if (fi < 0 || fi >= (int)GPRCS1Frames.size())
180ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach      return false;
181ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    return GPRCS1Frames[fi];
182ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  }
183ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  bool isGPRCalleeSavedArea2Frame(int fi) const {
184ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    if (fi < 0 || fi >= (int)GPRCS2Frames.size())
1856318ffd7361677e3b4487025538997ee01304452Evan Cheng      return false;
186ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    return GPRCS2Frames[fi];
187a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
1886318ffd7361677e3b4487025538997ee01304452Evan Cheng  bool isDPRCalleeSavedAreaFrame(int fi) const {
1896318ffd7361677e3b4487025538997ee01304452Evan Cheng    if (fi < 0 || fi >= (int)DPRCSFrames.size())
1906318ffd7361677e3b4487025538997ee01304452Evan Cheng      return false;
1916318ffd7361677e3b4487025538997ee01304452Evan Cheng    return DPRCSFrames[fi];
192a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
193a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
194ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void addGPRCalleeSavedArea1Frame(int fi) {
195ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    if (fi >= 0) {
196ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach      int Size = GPRCS1Frames.size();
197ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach      if (fi >= Size) {
198ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach        Size *= 2;
199ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach        if (fi >= Size)
200ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach          Size = fi+1;
201ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach        GPRCS1Frames.resize(Size);
202ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach      }
203ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach      GPRCS1Frames[fi] = true;
204ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    }
205ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  }
206ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void addGPRCalleeSavedArea2Frame(int fi) {
2076318ffd7361677e3b4487025538997ee01304452Evan Cheng    if (fi >= 0) {
208ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach      int Size = GPRCS2Frames.size();
209cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng      if (fi >= Size) {
210cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng        Size *= 2;
211cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng        if (fi >= Size)
212cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng          Size = fi+1;
213ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach        GPRCS2Frames.resize(Size);
214cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng      }
215ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach      GPRCS2Frames[fi] = true;
2166318ffd7361677e3b4487025538997ee01304452Evan Cheng    }
217a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
2186318ffd7361677e3b4487025538997ee01304452Evan Cheng  void addDPRCalleeSavedAreaFrame(int fi) {
2196318ffd7361677e3b4487025538997ee01304452Evan Cheng    if (fi >= 0) {
220cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng      int Size = DPRCSFrames.size();
221cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng      if (fi >= Size) {
222cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng        Size *= 2;
223cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng        if (fi >= Size)
224cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng          Size = fi+1;
225cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng        DPRCSFrames.resize(Size);
226cda067bad95654d970e14d3555f4aa685e5ebcaeEvan Cheng      }
2276318ffd7361677e3b4487025538997ee01304452Evan Cheng      DPRCSFrames[fi] = true;
2286318ffd7361677e3b4487025538997ee01304452Evan Cheng    }
229a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
230a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
231a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned createJumpTableUId() {
232a8e2989ece6dc46df59b0768184028257f913843Evan Cheng    return JumpTableUId++;
233a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
234f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
235f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  unsigned getNumJumpTables() const {
236f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng    return JumpTableUId;
237f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  }
238f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
2395de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  void initPICLabelUId(unsigned UId) {
2405de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    PICLabelUId = UId;
241f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  }
242f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
2435de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  unsigned getNumPICLabels() const {
2445de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    return PICLabelUId;
245f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  }
246f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
2475de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  unsigned createPICLabelUId() {
2485de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    return PICLabelUId++;
249f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  }
2501e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
2511e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
2521e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
25386050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng
25486050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  bool hasITBlocks() const { return HasITBlocks; }
25586050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  void setHasITBlocks(bool h) { HasITBlocks = h; }
25698b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov
2578f50647662560167b88851f92c3c891d2e7c1696Jush Lu  unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
2588f50647662560167b88851f92c3c891d2e7c1696Jush Lu  void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
2598f50647662560167b88851f92c3c891d2e7c1696Jush Lu
26098b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  void recordCPEClone(unsigned CPIdx, unsigned CPCloneIdx) {
26198b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    if (!CPEClones.insert(std::make_pair(CPCloneIdx, CPIdx)).second)
26298b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov      assert(0 && "Duplicate entries!");
26398b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  }
26498b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov
26598b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  unsigned getOriginalCPIdx(unsigned CloneIdx) const {
26698b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    DenseMap<unsigned, unsigned>::const_iterator I = CPEClones.find(CloneIdx);
26798b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    if (I != CPEClones.end())
26898b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov      return I->second;
26998b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    else
27098b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov      return -1U;
27198b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  }
272a8e2989ece6dc46df59b0768184028257f913843Evan Cheng};
273a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} // End llvm namespace
274a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
275a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#endif // ARMMACHINEFUNCTIONINFO_H
276