blob: 6ce4d532ff0ec790651997b01007b22554cc561b [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"
20
21namespace llvm {
22
23/// ARMFunctionInfo - This class is derived from MachineFunction private
24/// ARM target-specific information for each MachineFunction.
25class ARMFunctionInfo : public MachineFunctionInfo {
26
27 /// isThumb - True if this function is compiled under Thumb mode.
28 ///
29 bool isThumb;
30
31 /// VarArgsRegSaveSize - Size of the register save area for vararg functions.
32 ///
33 unsigned VarArgsRegSaveSize;
34
Evan Cheng75e18c42007-01-20 02:09:25 +000035 /// HasStackFrame - True if this function has a stack frame. Set by
Evan Chenga8e29892007-01-19 07:51:42 +000036 /// processFunctionBeforeCalleeSavedScan().
Evan Cheng75e18c42007-01-20 02:09:25 +000037 bool HasStackFrame;
Evan Chenga8e29892007-01-19 07:51:42 +000038
Evan Cheng78268b92007-01-29 22:22:24 +000039 /// LRSpilled - True if the LR register has been spilled.
40 ///
41 bool LRSpilled;
42
Evan Cheng75e18c42007-01-20 02:09:25 +000043 /// FramePtrSpillOffset - If HasStackFrame, this records the frame pointer
Evan Chenga8e29892007-01-19 07:51:42 +000044 /// spill stack offset.
45 unsigned FramePtrSpillOffset;
46
47 /// GPRCS1Offset, GPRCS2Offset, DPRCSOffset - Starting offset of callee saved
48 /// register spills areas. For Mac OS X:
49 ///
50 /// GPR callee-saved (1) : r4, r5, r6, r7, lr
51 /// --------------------------------------------
52 /// GPR callee-saved (2) : r8, r10, r11
53 /// --------------------------------------------
54 /// DPR callee-saved : d8 - d15
55 unsigned GPRCS1Offset;
56 unsigned GPRCS2Offset;
57 unsigned DPRCSOffset;
58
59 /// GPRCS1Size, GPRCS2Size, DPRCSSize - Sizes of callee saved register spills
60 /// areas.
61 unsigned GPRCS1Size;
62 unsigned GPRCS2Size;
63 unsigned DPRCSSize;
64
65 /// GPRCS1Frames, GPRCS2Frames, DPRCSFrames - Keeps track of frame indices
66 /// which belong to these spill areas.
Evan Cheng6318ffd2007-01-25 03:07:27 +000067 std::vector<bool> GPRCS1Frames;
68 std::vector<bool> GPRCS2Frames;
69 std::vector<bool> DPRCSFrames;
Evan Chenga8e29892007-01-19 07:51:42 +000070
71 /// JumpTableUId - Unique id for jumptables.
72 ///
73 unsigned JumpTableUId;
74
75public:
76 ARMFunctionInfo() :
77 isThumb(false),
Evan Cheng78268b92007-01-29 22:22:24 +000078 VarArgsRegSaveSize(0), HasStackFrame(false), LRSpilled(false),
79 FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
Evan Chenga8e29892007-01-19 07:51:42 +000080 GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0), JumpTableUId(0) {}
81
82 ARMFunctionInfo(MachineFunction &MF) :
83 isThumb(MF.getTarget().getSubtarget<ARMSubtarget>().isThumb()),
Evan Cheng78268b92007-01-29 22:22:24 +000084 VarArgsRegSaveSize(0), HasStackFrame(false), LRSpilled(false),
85 FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
Evan Chenga8e29892007-01-19 07:51:42 +000086 GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0), JumpTableUId(0) {}
87
88 bool isThumbFunction() const { return isThumb; }
89
90 unsigned getVarArgsRegSaveSize() const { return VarArgsRegSaveSize; }
91 void setVarArgsRegSaveSize(unsigned s) { VarArgsRegSaveSize = s; }
92
Evan Cheng75e18c42007-01-20 02:09:25 +000093 bool hasStackFrame() const { return HasStackFrame; }
94 void setHasStackFrame(bool s) { HasStackFrame = s; }
Evan Cheng78268b92007-01-29 22:22:24 +000095
96 bool isLRSpilled() const { return LRSpilled; }
97 void setLRIsSpilled(bool s) { LRSpilled = s; }
98
Evan Chenga8e29892007-01-19 07:51:42 +000099 unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; }
100 void setFramePtrSpillOffset(unsigned o) { FramePtrSpillOffset = o; }
101
102 unsigned getGPRCalleeSavedArea1Offset() const { return GPRCS1Offset; }
103 unsigned getGPRCalleeSavedArea2Offset() const { return GPRCS2Offset; }
104 unsigned getDPRCalleeSavedAreaOffset() const { return DPRCSOffset; }
105
106 void setGPRCalleeSavedArea1Offset(unsigned o) { GPRCS1Offset = o; }
107 void setGPRCalleeSavedArea2Offset(unsigned o) { GPRCS2Offset = o; }
108 void setDPRCalleeSavedAreaOffset(unsigned o) { DPRCSOffset = o; }
109
110 unsigned getGPRCalleeSavedArea1Size() const { return GPRCS1Size; }
111 unsigned getGPRCalleeSavedArea2Size() const { return GPRCS2Size; }
112 unsigned getDPRCalleeSavedAreaSize() const { return DPRCSSize; }
113
114 void setGPRCalleeSavedArea1Size(unsigned s) { GPRCS1Size = s; }
115 void setGPRCalleeSavedArea2Size(unsigned s) { GPRCS2Size = s; }
116 void setDPRCalleeSavedAreaSize(unsigned s) { DPRCSSize = s; }
117
Evan Cheng6318ffd2007-01-25 03:07:27 +0000118 bool isGPRCalleeSavedArea1Frame(int fi) const {
119 if (fi < 0 || fi >= (int)GPRCS1Frames.size())
120 return false;
121 return GPRCS1Frames[fi];
Evan Chenga8e29892007-01-19 07:51:42 +0000122 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000123 bool isGPRCalleeSavedArea2Frame(int fi) const {
124 if (fi < 0 || fi >= (int)GPRCS2Frames.size())
125 return false;
126 return GPRCS2Frames[fi];
Evan Chenga8e29892007-01-19 07:51:42 +0000127 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000128 bool isDPRCalleeSavedAreaFrame(int fi) const {
129 if (fi < 0 || fi >= (int)DPRCSFrames.size())
130 return false;
131 return DPRCSFrames[fi];
Evan Chenga8e29892007-01-19 07:51:42 +0000132 }
133
Evan Cheng6318ffd2007-01-25 03:07:27 +0000134 void addGPRCalleeSavedArea1Frame(int fi) {
135 if (fi >= 0) {
136 if (fi >= (int)GPRCS1Frames.size())
137 GPRCS1Frames.resize(fi+1);
138 GPRCS1Frames[fi] = true;
139 }
Evan Chenga8e29892007-01-19 07:51:42 +0000140 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000141 void addGPRCalleeSavedArea2Frame(int fi) {
142 if (fi >= 0) {
143 if (fi >= (int)GPRCS2Frames.size())
144 GPRCS2Frames.resize(fi+1);
145 GPRCS2Frames[fi] = true;
146 }
Evan Chenga8e29892007-01-19 07:51:42 +0000147 }
Evan Cheng6318ffd2007-01-25 03:07:27 +0000148 void addDPRCalleeSavedAreaFrame(int fi) {
149 if (fi >= 0) {
150 if (fi >= (int)DPRCSFrames.size())
151 DPRCSFrames.resize(fi+1);
152 DPRCSFrames[fi] = true;
153 }
Evan Chenga8e29892007-01-19 07:51:42 +0000154 }
155
156 unsigned createJumpTableUId() {
157 return JumpTableUId++;
158 }
159};
160} // End llvm namespace
161
162#endif // ARMMACHINEFUNCTIONINFO_H