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: 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 MachineBasicBlock::iterator 58 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 59 MachineBasicBlock::iterator I) const override; 60 61 bool assignCalleeSavedSpillSlots( 62 llvm::MachineFunction &, const llvm::TargetRegisterInfo *, 63 std::vector<llvm::CalleeSavedInfo> &) const override; 64 65 protected: 66 bool hasFPImpl(const MachineFunction &MF) const override; 67 68 private: 69 void adjustStackToMatchRecords(MachineBasicBlock &MBB, 70 MachineBasicBlock::iterator MI, 71 bool allocate) const; 72 73 const ARCSubtarget &ST; 74 }; 75 76 } // end namespace llvm 77 78 #endif // LLVM_LIB_TARGET_ARC_ARCFRAMELOWERING_H 79