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
21namespace llvm {
22
23class MachineFunction;
24class ARCSubtarget;
25class ARCInstrInfo;
26
27class ARCFrameLowering : public TargetFrameLowering {
28public:
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
67private:
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

source code of llvm/lib/Target/ARC/ARCFrameLowering.h