[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / lib / Target / ARM / ARMMachineFunctionInfo.h
blob85165528406051fe47e8ccf022bfb98655577392
1 //===-- ARMMachineFunctionInfo.h - ARM machine function info ----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file declares ARM-specific per-machine-function information.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_ARM_ARMMACHINEFUNCTIONINFO_H
14 #define LLVM_LIB_TARGET_ARM_ARMMACHINEFUNCTIONINFO_H
16 #include "llvm/ADT/DenseMap.h"
17 #include "llvm/ADT/SmallPtrSet.h"
18 #include "llvm/CodeGen/MachineFunction.h"
19 #include "llvm/IR/GlobalVariable.h"
20 #include "llvm/Support/ErrorHandling.h"
21 #include <utility>
23 namespace llvm {
25 /// ARMFunctionInfo - This class is derived from MachineFunctionInfo and
26 /// contains private ARM-specific information for each MachineFunction.
27 class ARMFunctionInfo : public MachineFunctionInfo {
28 virtual void anchor();
30 /// isThumb - True if this function is compiled under Thumb mode.
31 /// Used to initialized Align, so must precede it.
32 bool isThumb = false;
34 /// hasThumb2 - True if the target architecture supports Thumb2. Do not use
35 /// to determine if function is compiled under Thumb mode, for that use
36 /// 'isThumb'.
37 bool hasThumb2 = false;
39 /// StByValParamsPadding - For parameter that is split between
40 /// GPRs and memory; while recovering GPRs part, when
41 /// StackAlignment > 4, and GPRs-part-size mod StackAlignment != 0,
42 /// we need to insert gap before parameter start address. It allows to
43 /// "attach" GPR-part to the part that was passed via stack.
44 unsigned StByValParamsPadding = 0;
46 /// ArgsRegSaveSize - Size of the register save area for vararg functions or
47 /// those making guaranteed tail calls that need more stack argument space
48 /// than is provided by this functions incoming parameters.
49 ///
50 unsigned ArgRegsSaveSize = 0;
52 /// ReturnRegsCount - Number of registers used up in the return.
53 unsigned ReturnRegsCount = 0;
55 /// HasStackFrame - True if this function has a stack frame. Set by
56 /// determineCalleeSaves().
57 bool HasStackFrame = false;
59 /// RestoreSPFromFP - True if epilogue should restore SP from FP. Set by
60 /// emitPrologue.
61 bool RestoreSPFromFP = false;
63 /// LRSpilled - True if the LR register has been for spilled for
64 /// any reason, so it's legal to emit an ARM::tBfar (i.e. "bl").
65 bool LRSpilled = false;
67 /// FramePtrSpillOffset - If HasStackFrame, this records the frame pointer
68 /// spill stack offset.
69 unsigned FramePtrSpillOffset = 0;
71 /// GPRCS1Offset, GPRCS2Offset, DPRCSOffset - Starting offset of callee saved
72 /// register spills areas. For Mac OS X:
73 ///
74 /// GPR callee-saved (1) : r4, r5, r6, r7, lr
75 /// --------------------------------------------
76 /// GPR callee-saved (2) : r8, r10, r11
77 /// --------------------------------------------
78 /// DPR callee-saved : d8 - d15
79 ///
80 /// Also see AlignedDPRCSRegs below. Not all D-regs need to go in area 3.
81 /// Some may be spilled after the stack has been realigned.
82 unsigned GPRCS1Offset = 0;
83 unsigned GPRCS2Offset = 0;
84 unsigned DPRCSOffset = 0;
86 /// GPRCS1Size, GPRCS2Size, DPRCSSize - Sizes of callee saved register spills
87 /// areas.
88 unsigned FPCXTSaveSize = 0;
89 unsigned GPRCS1Size = 0;
90 unsigned GPRCS2Size = 0;
91 unsigned DPRCSAlignGapSize = 0;
92 unsigned DPRCSSize = 0;
94 /// NumAlignedDPRCS2Regs - The number of callee-saved DPRs that are saved in
95 /// the aligned portion of the stack frame. This is always a contiguous
96 /// sequence of D-registers starting from d8.
97 ///
98 /// We do not keep track of the frame indices used for these registers - they
99 /// behave like any other frame index in the aligned stack frame. These
100 /// registers also aren't included in DPRCSSize above.
101 unsigned NumAlignedDPRCS2Regs = 0;
103 unsigned PICLabelUId = 0;
105 /// VarArgsFrameIndex - FrameIndex for start of varargs area.
106 int VarArgsFrameIndex = 0;
108 /// HasITBlocks - True if IT blocks have been inserted.
109 bool HasITBlocks = false;
111 // Security Extensions
112 bool IsCmseNSEntry;
113 bool IsCmseNSCall;
115 /// CPEClones - Track constant pool entries clones created by Constant Island
116 /// pass.
117 DenseMap<unsigned, unsigned> CPEClones;
119 /// ArgumentStackSize - amount of bytes on stack consumed by the arguments
120 /// being passed on the stack
121 unsigned ArgumentStackSize = 0;
123 /// ArgumentStackToRestore - amount of bytes on stack consumed that we must
124 /// restore on return.
125 unsigned ArgumentStackToRestore = 0;
127 /// CoalescedWeights - mapping of basic blocks to the rolling counter of
128 /// coalesced weights.
129 DenseMap<const MachineBasicBlock*, unsigned> CoalescedWeights;
131 /// True if this function has a subset of CSRs that is handled explicitly via
132 /// copies.
133 bool IsSplitCSR = false;
135 /// Globals that have had their storage promoted into the constant pool.
136 SmallPtrSet<const GlobalVariable*,2> PromotedGlobals;
138 /// The amount the literal pool has been increasedby due to promoted globals.
139 int PromotedGlobalsIncrease = 0;
141 /// True if r0 will be preserved by a call to this function (e.g. C++
142 /// con/destructors).
143 bool PreservesR0 = false;
145 public:
146 ARMFunctionInfo() = default;
148 explicit ARMFunctionInfo(MachineFunction &MF);
150 bool isThumbFunction() const { return isThumb; }
151 bool isThumb1OnlyFunction() const { return isThumb && !hasThumb2; }
152 bool isThumb2Function() const { return isThumb && hasThumb2; }
154 bool isCmseNSEntryFunction() const { return IsCmseNSEntry; }
155 bool isCmseNSCallFunction() const { return IsCmseNSCall; }
157 unsigned getStoredByValParamsPadding() const { return StByValParamsPadding; }
158 void setStoredByValParamsPadding(unsigned p) { StByValParamsPadding = p; }
160 unsigned getArgRegsSaveSize() const { return ArgRegsSaveSize; }
161 void setArgRegsSaveSize(unsigned s) { ArgRegsSaveSize = s; }
163 unsigned getReturnRegsCount() const { return ReturnRegsCount; }
164 void setReturnRegsCount(unsigned s) { ReturnRegsCount = s; }
166 bool hasStackFrame() const { return HasStackFrame; }
167 void setHasStackFrame(bool s) { HasStackFrame = s; }
169 bool shouldRestoreSPFromFP() const { return RestoreSPFromFP; }
170 void setShouldRestoreSPFromFP(bool s) { RestoreSPFromFP = s; }
172 bool isLRSpilled() const { return LRSpilled; }
173 void setLRIsSpilled(bool s) { LRSpilled = s; }
175 unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; }
176 void setFramePtrSpillOffset(unsigned o) { FramePtrSpillOffset = o; }
178 unsigned getNumAlignedDPRCS2Regs() const { return NumAlignedDPRCS2Regs; }
179 void setNumAlignedDPRCS2Regs(unsigned n) { NumAlignedDPRCS2Regs = n; }
181 unsigned getGPRCalleeSavedArea1Offset() const { return GPRCS1Offset; }
182 unsigned getGPRCalleeSavedArea2Offset() const { return GPRCS2Offset; }
183 unsigned getDPRCalleeSavedAreaOffset() const { return DPRCSOffset; }
185 void setGPRCalleeSavedArea1Offset(unsigned o) { GPRCS1Offset = o; }
186 void setGPRCalleeSavedArea2Offset(unsigned o) { GPRCS2Offset = o; }
187 void setDPRCalleeSavedAreaOffset(unsigned o) { DPRCSOffset = o; }
189 unsigned getFPCXTSaveAreaSize() const { return FPCXTSaveSize; }
190 unsigned getGPRCalleeSavedArea1Size() const { return GPRCS1Size; }
191 unsigned getGPRCalleeSavedArea2Size() const { return GPRCS2Size; }
192 unsigned getDPRCalleeSavedGapSize() const { return DPRCSAlignGapSize; }
193 unsigned getDPRCalleeSavedAreaSize() const { return DPRCSSize; }
195 void setFPCXTSaveAreaSize(unsigned s) { FPCXTSaveSize = s; }
196 void setGPRCalleeSavedArea1Size(unsigned s) { GPRCS1Size = s; }
197 void setGPRCalleeSavedArea2Size(unsigned s) { GPRCS2Size = s; }
198 void setDPRCalleeSavedGapSize(unsigned s) { DPRCSAlignGapSize = s; }
199 void setDPRCalleeSavedAreaSize(unsigned s) { DPRCSSize = s; }
201 unsigned getArgumentStackSize() const { return ArgumentStackSize; }
202 void setArgumentStackSize(unsigned size) { ArgumentStackSize = size; }
204 unsigned getArgumentStackToRestore() const { return ArgumentStackToRestore; }
205 void setArgumentStackToRestore(unsigned v) { ArgumentStackToRestore = v; }
207 void initPICLabelUId(unsigned UId) {
208 PICLabelUId = UId;
211 unsigned getNumPICLabels() const {
212 return PICLabelUId;
215 unsigned createPICLabelUId() {
216 return PICLabelUId++;
219 int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
220 void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
222 bool hasITBlocks() const { return HasITBlocks; }
223 void setHasITBlocks(bool h) { HasITBlocks = h; }
225 bool isSplitCSR() const { return IsSplitCSR; }
226 void setIsSplitCSR(bool s) { IsSplitCSR = s; }
228 void recordCPEClone(unsigned CPIdx, unsigned CPCloneIdx) {
229 if (!CPEClones.insert(std::make_pair(CPCloneIdx, CPIdx)).second)
230 llvm_unreachable("Duplicate entries!");
233 unsigned getOriginalCPIdx(unsigned CloneIdx) const {
234 DenseMap<unsigned, unsigned>::const_iterator I = CPEClones.find(CloneIdx);
235 if (I != CPEClones.end())
236 return I->second;
237 else
238 return -1U;
241 DenseMap<const MachineBasicBlock*, unsigned>::iterator getCoalescedWeight(
242 MachineBasicBlock* MBB) {
243 auto It = CoalescedWeights.find(MBB);
244 if (It == CoalescedWeights.end()) {
245 It = CoalescedWeights.insert(std::make_pair(MBB, 0)).first;
247 return It;
250 /// Indicate to the backend that \c GV has had its storage changed to inside
251 /// a constant pool. This means it no longer needs to be emitted as a
252 /// global variable.
253 void markGlobalAsPromotedToConstantPool(const GlobalVariable *GV) {
254 PromotedGlobals.insert(GV);
256 SmallPtrSet<const GlobalVariable*, 2>& getGlobalsPromotedToConstantPool() {
257 return PromotedGlobals;
259 int getPromotedConstpoolIncrease() const {
260 return PromotedGlobalsIncrease;
262 void setPromotedConstpoolIncrease(int Sz) {
263 PromotedGlobalsIncrease = Sz;
266 DenseMap<unsigned, unsigned> EHPrologueRemappedRegs;
267 DenseMap<unsigned, unsigned> EHPrologueOffsetInRegs;
269 void setPreservesR0() { PreservesR0 = true; }
270 bool getPreservesR0() const { return PreservesR0; }
273 } // end namespace llvm
275 #endif // LLVM_LIB_TARGET_ARM_ARMMACHINEFUNCTIONINFO_H