1 //===- ARCFrameLowering.h - Define frame lowering for ARC -------*- 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 class implements the ARC specific frame lowering. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_ARC_ARCFRAMELOWERING_H 14 #define LLVM_LIB_TARGET_ARC_ARCFRAMELOWERING_H 15 16 #include "ARC.h" 17 #include "llvm/CodeGen/MachineBasicBlock.h" 18 #include "llvm/CodeGen/MachineFrameInfo.h" 19 #include "llvm/CodeGen/TargetFrameLowering.h" 20 21 namespace llvm { 22 23 class MachineFunction; 24 class ARCSubtarget; 25 class ARCInstrInfo; 26 27 class ARCFrameLowering : public TargetFrameLowering { 28 public: ARCFrameLowering(const ARCSubtarget & st)29 ARCFrameLowering(const ARCSubtarget &st) 30 : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align(4), 0), 31 ST(st) {} 32 33 /// Insert Prologue into the function. 34 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 35 36 /// Insert Epilogue into the function. 37 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 38 39 /// Add explicit callee save registers. 40 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, 41 RegScavenger *RS) const override; 42 43 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 44 MachineBasicBlock::iterator MI, 45 ArrayRef<CalleeSavedInfo> CSI, 46 const TargetRegisterInfo *TRI) const override; 47 48 bool 49 restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 50 MachineBasicBlock::iterator MI, 51 MutableArrayRef<CalleeSavedInfo> CSI, 52 const TargetRegisterInfo *TRI) const override; 53 54 void processFunctionBeforeFrameFinalized(MachineFunction &MF, 55 RegScavenger *RS) const override; 56 57 bool hasFP(const MachineFunction &MF) const override; 58 59 MachineBasicBlock::iterator 60 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 61 MachineBasicBlock::iterator I) const override; 62 63 bool assignCalleeSavedSpillSlots( 64 llvm::MachineFunction &, const llvm::TargetRegisterInfo *, 65 std::vector<llvm::CalleeSavedInfo> &) const override; 66 67 private: 68 void adjustStackToMatchRecords(MachineBasicBlock &MBB, 69 MachineBasicBlock::iterator MI, 70 bool allocate) const; 71 72 const ARCSubtarget &ST; 73 }; 74 75 } // end namespace llvm 76 77 #endif // LLVM_LIB_TARGET_ARC_ARCFRAMELOWERING_H 78