blob: 87eda4b7e8d821a289144278399198b1c22756b5 [file] [log] [blame]
Evan Chenga8e29892007-01-19 07:51:42 +00001//====- ARMMachineFuctionInfo.h - ARM machine function info -----*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Evan Cheng and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares ARM-specific per-machine-function information.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef ARMMACHINEFUNCTIONINFO_H
15#define ARMMACHINEFUNCTIONINFO_H
16
17#include "ARMSubtarget.h"
18#include "llvm/CodeGen/MachineFunction.h"
19#include "llvm/Target/TargetMachine.h"
Evan Chengcda067b2007-03-01 07:52:44 +000020#include "llvm/ADT/BitVector.h"
Evan Chenga8e29892007-01-19 07:51:42 +000021
22namespace llvm {
23
24/// ARMFunctionInfo - This class is derived from MachineFunction private
25/// ARM target-specific information for each MachineFunction.
26class ARMFunctionInfo : public MachineFunctionInfo {
27
28 /// isThumb - True if this function is compiled under Thumb mode.
29 ///
30 bool isThumb;
31
32 /// VarArgsRegSaveSize - Size of the register save area for vararg functions.
33 ///
34 unsigned VarArgsRegSaveSize;
35
Evan Cheng75e18c42007-01-20 02:09:25 +000036 /// HasStackFrame - True if this function has a stack frame. Set by
Evan Chenga8e29892007-01-19 07:51:42 +000037 /// processFunctionBeforeCalleeSavedScan().
Evan Cheng75e18c42007-01-20 02:09:25 +000038 bool HasStackFrame;
Evan Chenga8e29892007-01-19 07:51:42 +000039
Evan Chengd1b2c1e2007-01-30 01:18:38 +000040 /// LRSForceSpilled - True if the LR register has been for spilled to enable
41 /// far jump.
42 bool LRForceSpilled;
Evan Cheng78268b92007-01-29 22:22:24 +000043
Evan Cheng8bed6c92007-02-07 09:17:36 +000044 /// R3IsLiveIn - True if R3 is live in to this function.
Evan Chengcda067b2007-03-01 07:52:44 +000045 /// FIXME: Remove when register scavenger for Thumb is done.
Evan Cheng8bed6c92007-02-07 09:17:36 +000046 bool R3IsLiveIn;
47
Evan Cheng75e18c42007-01-20 02:09:25 +000048 /// FramePtrSpillOffset - If HasStackFrame, this records the frame pointer
Evan Chenga8e29892007-01-19 07:51:42 +000049 /// spill stack offset.
50 unsigned FramePtrSpillOffset;
51
52 /// GPRCS1Offset, GPRCS2Offset, DPRCSOffset - Starting offset of callee saved
53 /// register spills areas. For Mac OS X:
54 ///
55 /// GPR callee-saved (1) : r4, r5, r6, r7, lr
56 /// --------------------------------------------
57 /// GPR callee-saved (2) : r8, r10, r11
58 /// --------------------------------------------
59 /// DPR callee-saved : d8 - d15
60 unsigned GPRCS1Offset;
61 unsigned GPRCS2Offset;
62 unsigned DPRCSOffset;
63
64 /// GPRCS1Size, GPRCS2Size, DPRCSSize - Sizes of callee saved register spills
65 /// areas.
66 unsigned GPRCS1Size;
67 unsigned GPRCS2Size;
68 unsigned DPRCSSize;
69
70 /// GPRCS1Frames, GPRCS2Frames, DPRCSFrames - Keeps track of frame indices
71 /// which belong to these spill areas.
Evan Chengcda067b2007-03-01 07:52:44 +000072 BitVector GPRCS1Frames;
73 BitVector GPRCS2Frames;
74 BitVector DPRCSFrames;
Evan Chenga8e29892007-01-19 07:51:42 +000075
76 /// JumpTableUId - Unique id for jumptables.
77 ///
78 unsigned JumpTableUId;
79
80public:
81 ARMFunctionInfo() :
82 isThumb(false),
Evan Cheng8bed6c92007-02-07 09:17:36 +000083 VarArgsRegSaveSize(0), HasStackFrame(false),
84 LRForceSpilled(false), R3IsLiveIn(false),
Evan Cheng78268b92007-01-29 22:22:24 +000085 FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
Evan Chengcda067b2007-03-01 07:52:44 +000086 GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
87 GPRCS1Frames(32), GPRCS2Frames(32), DPRCSFrames(32),
88 JumpTableUId(0) {}
Evan Chenga8e29892007-01-19 07:51:42 +000089
90 ARMFunctionInfo(MachineFunction &MF) :
91 isThumb(MF.getTarget().getSubtarget<ARMSubtarget>().isThumb()),
Evan Cheng8bed6c92007-02-07 09:17:36 +000092 VarArgsRegSaveSize(0), HasStackFrame(false),
93 LRForceSpilled(false), R3IsLiveIn(false),
Evan Cheng78268b92007-01-29 22:22:24 +000094 FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
Evan Chengcda067b2007-03-01 07:52:44 +000095 GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
96 GPRCS1Frames(32), GPRCS2Frames(32), DPRCSFrames(32),
97 JumpTableUId(0) {}
Evan Chenga8e29892007-01-19 07:51:42 +000098
99 bool isThumbFunction() const { return isThumb; }
100
101 unsigned getVarArgsRegSaveSize() const { return VarArgsRegSaveSize; }
102 void setVarArgsRegSaveSize(unsigned s) { VarArgsRegSaveSize = s; }
103
Evan Cheng75e18c42007-01-20 02:09:25 +0000104 bool hasStackFrame() const { return HasStackFrame; }
105 void setHasStackFrame(bool s) { HasStackFrame = s; }
Evan Cheng78268b92007-01-29 22:22:24 +0000106
Evan Chengd1b2c1e2007-01-30 01:18:38 +0000107 bool isLRForceSpilled() const { return LRForceSpilled; }
108 void setLRIsForceSpilled(bool s) { LRForceSpilled = s; }
Evan Cheng78268b92007-01-29 22:22:24 +0000109
Evan Cheng8bed6c92007-02-07 09:17:36 +0000110 bool isR3IsLiveIn() const { return R3IsLiveIn; }
111 void setR3IsLiveIn(bool l) { R3IsLiveIn = l; }
112
Evan Chenga8e29892007-01-19 07:51:42 +0000113 unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; }
114 void setFramePtrSpillOffset(unsigned o) { FramePtrSpillOffset = o; }
115
116 unsigned getGPRCalleeSavedArea1Offset() const { return GPRCS1Offset; }
117 unsigned getGPRCalleeSavedArea2Offset() const { return GPRCS2Offset; }
118 unsigned getDPRCalleeSavedAreaOffset() const { return DPRCSOffset; }
119
120 void setGPRCalleeSavedArea1Offset(unsigned o) { GPRCS1Offset = o; }
121 void setGPRCalleeSavedArea2Offset(unsigned o) { GPRCS2Offset = o; }
122 void setDPRCalleeSavedAreaOffset(unsigned o) { DPRCSOffset = o; }
123
124 unsigned getGPRCalleeSavedArea1Size() const { return GPRCS1Size; }
125 unsigned getGPRCalleeSavedArea2Size() const { return GPRCS2Size; }
126 unsigned getDPRCalleeSavedAreaSize() const { return DPRCSSize; }
127
128 void setGPRCalleeSavedArea1Size(unsigned s) { GPRCS1Size = s; }
129 void setGPRCalleeSavedArea2Size(unsigned s) { GPRCS2Size = s; }
130 void setDPRCalleeSavedAreaSize(unsigned s) { DPRCSSize = s; }
131
Evan Cheng6318ffd2007-01-25 03:07:27 +0000132 bool isGPRCalleeSavedArea1Frame(int fi) const {
133 if (fi < 0 || fi >= (int)GPRCS1Frames.size())
134 return false;
135 return GPRCS1Frames[fi];
Evan Chenga8e29892007-01-19 07:51:42 +0000136 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000137 bool isGPRCalleeSavedArea2Frame(int fi) const {
138 if (fi < 0 || fi >= (int)GPRCS2Frames.size())
139 return false;
140 return GPRCS2Frames[fi];
Evan Chenga8e29892007-01-19 07:51:42 +0000141 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000142 bool isDPRCalleeSavedAreaFrame(int fi) const {
143 if (fi < 0 || fi >= (int)DPRCSFrames.size())
144 return false;
145 return DPRCSFrames[fi];
Evan Chenga8e29892007-01-19 07:51:42 +0000146 }
147
Evan Cheng6318ffd2007-01-25 03:07:27 +0000148 void addGPRCalleeSavedArea1Frame(int fi) {
149 if (fi >= 0) {
Evan Chengcda067b2007-03-01 07:52:44 +0000150 int Size = GPRCS1Frames.size();
151 if (fi >= Size) {
152 Size *= 2;
153 if (fi >= Size)
154 Size = fi+1;
155 GPRCS1Frames.resize(Size);
156 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000157 GPRCS1Frames[fi] = true;
158 }
Evan Chenga8e29892007-01-19 07:51:42 +0000159 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000160 void addGPRCalleeSavedArea2Frame(int fi) {
161 if (fi >= 0) {
Evan Chengcda067b2007-03-01 07:52:44 +0000162 int Size = GPRCS2Frames.size();
163 if (fi >= Size) {
164 Size *= 2;
165 if (fi >= Size)
166 Size = fi+1;
167 GPRCS2Frames.resize(Size);
168 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000169 GPRCS2Frames[fi] = true;
170 }
Evan Chenga8e29892007-01-19 07:51:42 +0000171 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000172 void addDPRCalleeSavedAreaFrame(int fi) {
173 if (fi >= 0) {
Evan Chengcda067b2007-03-01 07:52:44 +0000174 int Size = DPRCSFrames.size();
175 if (fi >= Size) {
176 Size *= 2;
177 if (fi >= Size)
178 Size = fi+1;
179 DPRCSFrames.resize(Size);
180 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000181 DPRCSFrames[fi] = true;
182 }
Evan Chenga8e29892007-01-19 07:51:42 +0000183 }
184
185 unsigned createJumpTableUId() {
186 return JumpTableUId++;
187 }
188};
189} // End llvm namespace
190
191#endif // ARMMACHINEFUNCTIONINFO_H