1 //===-- XCoreMachineFunctionInfo.cpp - XCore machine function info --------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "XCoreMachineFunctionInfo.h"
10 #include "XCoreInstrInfo.h"
11 #include "llvm/CodeGen/TargetSubtargetInfo.h"
12 #include "llvm/IR/Function.h"
16 void XCoreFunctionInfo::anchor() { }
18 MachineFunctionInfo
*XCoreFunctionInfo::clone(
19 BumpPtrAllocator
&Allocator
, MachineFunction
&DestMF
,
20 const DenseMap
<MachineBasicBlock
*, MachineBasicBlock
*> &Src2DstMBB
)
22 return DestMF
.cloneInfo
<XCoreFunctionInfo
>(*this);
25 bool XCoreFunctionInfo::isLargeFrame(const MachineFunction
&MF
) const {
26 if (CachedEStackSize
== -1) {
27 CachedEStackSize
= MF
.getFrameInfo().estimateStackSize(MF
);
29 // isLargeFrame() is used when deciding if spill slots should be added to
30 // allow eliminateFrameIndex() to scavenge registers.
31 // This is only required when there is no FP and offsets are greater than
32 // ~256KB (~64Kwords). Thus only for code run on the emulator!
34 // The arbitrary value of 0xf000 allows frames of up to ~240KB before spill
35 // slots are added for the use of eliminateFrameIndex() register scavenging.
36 // For frames less than 240KB, it is assumed that there will be less than
37 // 16KB of function arguments.
38 return CachedEStackSize
> 0xf000;
41 int XCoreFunctionInfo::createLRSpillSlot(MachineFunction
&MF
) {
45 const TargetRegisterClass
&RC
= XCore::GRRegsRegClass
;
46 const TargetRegisterInfo
&TRI
= *MF
.getSubtarget().getRegisterInfo();
47 MachineFrameInfo
&MFI
= MF
.getFrameInfo();
48 if (! MF
.getFunction().isVarArg()) {
49 // A fixed offset of 0 allows us to save / restore LR using entsp / retsp.
50 LRSpillSlot
= MFI
.CreateFixedObject(TRI
.getSpillSize(RC
), 0, true);
52 LRSpillSlot
= MFI
.CreateStackObject(TRI
.getSpillSize(RC
),
53 TRI
.getSpillAlign(RC
), true);
55 LRSpillSlotSet
= true;
59 int XCoreFunctionInfo::createFPSpillSlot(MachineFunction
&MF
) {
63 const TargetRegisterClass
&RC
= XCore::GRRegsRegClass
;
64 const TargetRegisterInfo
&TRI
= *MF
.getSubtarget().getRegisterInfo();
65 MachineFrameInfo
&MFI
= MF
.getFrameInfo();
67 MFI
.CreateStackObject(TRI
.getSpillSize(RC
), TRI
.getSpillAlign(RC
), true);
68 FPSpillSlotSet
= true;
72 const int* XCoreFunctionInfo::createEHSpillSlot(MachineFunction
&MF
) {
76 const TargetRegisterClass
&RC
= XCore::GRRegsRegClass
;
77 const TargetRegisterInfo
&TRI
= *MF
.getSubtarget().getRegisterInfo();
78 MachineFrameInfo
&MFI
= MF
.getFrameInfo();
79 unsigned Size
= TRI
.getSpillSize(RC
);
80 Align Alignment
= TRI
.getSpillAlign(RC
);
81 EHSpillSlot
[0] = MFI
.CreateStackObject(Size
, Alignment
, true);
82 EHSpillSlot
[1] = MFI
.CreateStackObject(Size
, Alignment
, true);
83 EHSpillSlotSet
= true;