blob: ccf7e247b556a7a931a03dd8b52413c466f4607b [file] [log] [blame]
Alex Bradbury89718422017-10-19 21:37:38 +00001//===-- RISCVFrameLowering.h - Define frame lowering for RISCV -*- C++ -*--===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This class implements RISCV-specific bits of TargetFrameLowering class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_RISCV_RISCVFRAMELOWERING_H
15#define LLVM_LIB_TARGET_RISCV_RISCVFRAMELOWERING_H
16
David Blaikie1be62f02017-11-03 22:32:11 +000017#include "llvm/CodeGen/TargetFrameLowering.h"
Alex Bradbury89718422017-10-19 21:37:38 +000018
19namespace llvm {
20class RISCVSubtarget;
21
22class RISCVFrameLowering : public TargetFrameLowering {
23public:
24 explicit RISCVFrameLowering(const RISCVSubtarget &STI)
25 : TargetFrameLowering(StackGrowsDown,
26 /*StackAlignment=*/16,
Alex Bradburyb014e3d2017-12-11 12:34:11 +000027 /*LocalAreaOffset=*/0),
28 STI(STI) {}
Alex Bradbury89718422017-10-19 21:37:38 +000029
30 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
31 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
32
Alex Bradbury660bcce2017-12-11 11:53:54 +000033 int getFrameIndexReference(const MachineFunction &MF, int FI,
34 unsigned &FrameReg) const override;
35
Alex Bradburyb014e3d2017-12-11 12:34:11 +000036 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
37 RegScavenger *RS) const override;
38
Alex Bradbury0715d352018-01-11 11:17:19 +000039 void processFunctionBeforeFrameFinalized(MachineFunction &MF,
40 RegScavenger *RS) const override;
41
Alex Bradbury89718422017-10-19 21:37:38 +000042 bool hasFP(const MachineFunction &MF) const override;
Alex Bradburya3376752017-11-08 13:41:21 +000043
44 MachineBasicBlock::iterator
45 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
46 MachineBasicBlock::iterator MI) const override {
47 return MBB.erase(MI);
48 }
Alex Bradburyb014e3d2017-12-11 12:34:11 +000049
50protected:
51 const RISCVSubtarget &STI;
52
53private:
54 void determineFrameLayout(MachineFunction &MF) const;
55 void adjustReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
56 const DebugLoc &DL, unsigned DestReg, unsigned SrcReg,
57 int64_t Val, MachineInstr::MIFlag Flag) const;
Alex Bradbury89718422017-10-19 21:37:38 +000058};
59}
60#endif