87 lines · cpp
1//===-- XCoreMachineFunctionInfo.cpp - XCore machine function info --------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "XCoreMachineFunctionInfo.h"10#include "XCoreInstrInfo.h"11#include "llvm/CodeGen/TargetSubtargetInfo.h"12#include "llvm/IR/Function.h"13 14using namespace llvm;15 16void XCoreFunctionInfo::anchor() { }17 18MachineFunctionInfo *XCoreFunctionInfo::clone(19 BumpPtrAllocator &Allocator, MachineFunction &DestMF,20 const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)21 const {22 return DestMF.cloneInfo<XCoreFunctionInfo>(*this);23}24 25bool XCoreFunctionInfo::isLargeFrame(const MachineFunction &MF) const {26 if (CachedEStackSize == -1) {27 CachedEStackSize = MF.getFrameInfo().estimateStackSize(MF);28 }29 // isLargeFrame() is used when deciding if spill slots should be added to30 // allow eliminateFrameIndex() to scavenge registers.31 // This is only required when there is no FP and offsets are greater than32 // ~256KB (~64Kwords). Thus only for code run on the emulator!33 //34 // The arbitrary value of 0xf000 allows frames of up to ~240KB before spill35 // slots are added for the use of eliminateFrameIndex() register scavenging.36 // For frames less than 240KB, it is assumed that there will be less than37 // 16KB of function arguments.38 return CachedEStackSize > 0xf000;39}40 41int XCoreFunctionInfo::createLRSpillSlot(MachineFunction &MF) {42 if (LRSpillSlotSet) {43 return LRSpillSlot;44 }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);51 } else {52 LRSpillSlot = MFI.CreateStackObject(TRI.getSpillSize(RC),53 TRI.getSpillAlign(RC), true);54 }55 LRSpillSlotSet = true;56 return LRSpillSlot;57}58 59int XCoreFunctionInfo::createFPSpillSlot(MachineFunction &MF) {60 if (FPSpillSlotSet) {61 return FPSpillSlot;62 }63 const TargetRegisterClass &RC = XCore::GRRegsRegClass;64 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();65 MachineFrameInfo &MFI = MF.getFrameInfo();66 FPSpillSlot =67 MFI.CreateStackObject(TRI.getSpillSize(RC), TRI.getSpillAlign(RC), true);68 FPSpillSlotSet = true;69 return FPSpillSlot;70}71 72const int* XCoreFunctionInfo::createEHSpillSlot(MachineFunction &MF) {73 if (EHSpillSlotSet) {74 return EHSpillSlot;75 }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;84 return EHSpillSlot;85}86 87