1*0fca6ea1SDimitry Andric //===- XtensaFrameLowering.h - Define frame lowering for Xtensa --*- C++ -*-==// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===-----------------------------------------------------------------------==// 8*0fca6ea1SDimitry Andric 9*0fca6ea1SDimitry Andric #ifndef LLVM_LIB_TARGET_XTENSA_XTENSAFRAMELOWERING_H 10*0fca6ea1SDimitry Andric #define LLVM_LIB_TARGET_XTENSA_XTENSAFRAMELOWERING_H 11*0fca6ea1SDimitry Andric 12*0fca6ea1SDimitry Andric #include "llvm/CodeGen/TargetFrameLowering.h" 13*0fca6ea1SDimitry Andric 14*0fca6ea1SDimitry Andric namespace llvm { 15*0fca6ea1SDimitry Andric class XtensaTargetMachine; 16*0fca6ea1SDimitry Andric class XtensaSubtarget; 17*0fca6ea1SDimitry Andric class XtensaInstrInfo; 18*0fca6ea1SDimitry Andric class XtensaRegisterInfo; 19*0fca6ea1SDimitry Andric 20*0fca6ea1SDimitry Andric class XtensaFrameLowering : public TargetFrameLowering { 21*0fca6ea1SDimitry Andric const XtensaInstrInfo &TII; 22*0fca6ea1SDimitry Andric const XtensaRegisterInfo *TRI; 23*0fca6ea1SDimitry Andric 24*0fca6ea1SDimitry Andric public: 25*0fca6ea1SDimitry Andric XtensaFrameLowering(const XtensaSubtarget &STI); 26*0fca6ea1SDimitry Andric 27*0fca6ea1SDimitry Andric bool hasFP(const MachineFunction &MF) const override; 28*0fca6ea1SDimitry Andric 29*0fca6ea1SDimitry Andric /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 30*0fca6ea1SDimitry Andric /// the function. 31*0fca6ea1SDimitry Andric void emitPrologue(MachineFunction &, MachineBasicBlock &) const override; 32*0fca6ea1SDimitry Andric void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 33*0fca6ea1SDimitry Andric 34*0fca6ea1SDimitry Andric MachineBasicBlock::iterator 35*0fca6ea1SDimitry Andric eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 36*0fca6ea1SDimitry Andric MachineBasicBlock::iterator I) const override; 37*0fca6ea1SDimitry Andric 38*0fca6ea1SDimitry Andric bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 39*0fca6ea1SDimitry Andric MachineBasicBlock::iterator MI, 40*0fca6ea1SDimitry Andric ArrayRef<CalleeSavedInfo> CSI, 41*0fca6ea1SDimitry Andric const TargetRegisterInfo *TRI) const override; 42*0fca6ea1SDimitry Andric bool 43*0fca6ea1SDimitry Andric restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 44*0fca6ea1SDimitry Andric MachineBasicBlock::iterator MI, 45*0fca6ea1SDimitry Andric MutableArrayRef<CalleeSavedInfo> CSI, 46*0fca6ea1SDimitry Andric const TargetRegisterInfo *TRI) const override; 47*0fca6ea1SDimitry Andric 48*0fca6ea1SDimitry Andric void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, 49*0fca6ea1SDimitry Andric RegScavenger *RS) const override; 50*0fca6ea1SDimitry Andric 51*0fca6ea1SDimitry Andric void processFunctionBeforeFrameFinalized(MachineFunction &MF, 52*0fca6ea1SDimitry Andric RegScavenger *RS) const override; 53*0fca6ea1SDimitry Andric }; 54*0fca6ea1SDimitry Andric 55*0fca6ea1SDimitry Andric } // namespace llvm 56*0fca6ea1SDimitry Andric 57*0fca6ea1SDimitry Andric #endif /* LLVM_LIB_TARGET_XTENSA_XTENSAFRAMELOWERING_H */ 58