1*349cc55cSDimitry Andric //===-- CSKYFrameLowering.cpp - CSKY Frame Information ------------------===// 2*349cc55cSDimitry Andric // 3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*349cc55cSDimitry Andric // 7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8*349cc55cSDimitry Andric // 9*349cc55cSDimitry Andric // This file contains the CSKY implementation of TargetFrameLowering class. 10*349cc55cSDimitry Andric // 11*349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 12*349cc55cSDimitry Andric 13*349cc55cSDimitry Andric #include "CSKYFrameLowering.h" 14*349cc55cSDimitry Andric #include "CSKYSubtarget.h" 15*349cc55cSDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h" 16*349cc55cSDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 17*349cc55cSDimitry Andric #include "llvm/CodeGen/MachineInstrBuilder.h" 18*349cc55cSDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h" 19*349cc55cSDimitry Andric #include "llvm/CodeGen/RegisterScavenging.h" 20*349cc55cSDimitry Andric #include "llvm/IR/DiagnosticInfo.h" 21*349cc55cSDimitry Andric #include "llvm/MC/MCDwarf.h" 22*349cc55cSDimitry Andric 23*349cc55cSDimitry Andric using namespace llvm; 24*349cc55cSDimitry Andric 25*349cc55cSDimitry Andric #define DEBUG_TYPE "csky-frame-lowering" 26*349cc55cSDimitry Andric 27*349cc55cSDimitry Andric // Returns the register used to hold the frame pointer. 28*349cc55cSDimitry Andric static Register getFPReg(const CSKYSubtarget &STI) { return CSKY::R8; } 29*349cc55cSDimitry Andric 30*349cc55cSDimitry Andric // To avoid the BP value clobbered by a function call, we need to choose a 31*349cc55cSDimitry Andric // callee saved register to save the value. 32*349cc55cSDimitry Andric static Register getBPReg(const CSKYSubtarget &STI) { return CSKY::R7; } 33*349cc55cSDimitry Andric 34*349cc55cSDimitry Andric bool CSKYFrameLowering::hasFP(const MachineFunction &MF) const { 35*349cc55cSDimitry Andric const TargetRegisterInfo *RegInfo = MF.getSubtarget().getRegisterInfo(); 36*349cc55cSDimitry Andric 37*349cc55cSDimitry Andric const MachineFrameInfo &MFI = MF.getFrameInfo(); 38*349cc55cSDimitry Andric return MF.getTarget().Options.DisableFramePointerElim(MF) || 39*349cc55cSDimitry Andric RegInfo->hasStackRealignment(MF) || MFI.hasVarSizedObjects() || 40*349cc55cSDimitry Andric MFI.isFrameAddressTaken(); 41*349cc55cSDimitry Andric } 42*349cc55cSDimitry Andric 43*349cc55cSDimitry Andric bool CSKYFrameLowering::hasBP(const MachineFunction &MF) const { 44*349cc55cSDimitry Andric const MachineFrameInfo &MFI = MF.getFrameInfo(); 45*349cc55cSDimitry Andric 46*349cc55cSDimitry Andric return MFI.hasVarSizedObjects(); 47*349cc55cSDimitry Andric } 48*349cc55cSDimitry Andric 49*349cc55cSDimitry Andric void CSKYFrameLowering::emitPrologue(MachineFunction &MF, 50*349cc55cSDimitry Andric MachineBasicBlock &MBB) const { 51*349cc55cSDimitry Andric // FIXME: Implement this when we have function calls 52*349cc55cSDimitry Andric } 53*349cc55cSDimitry Andric 54*349cc55cSDimitry Andric void CSKYFrameLowering::emitEpilogue(MachineFunction &MF, 55*349cc55cSDimitry Andric MachineBasicBlock &MBB) const { 56*349cc55cSDimitry Andric // FIXME: Implement this when we have function calls 57*349cc55cSDimitry Andric }