aboutsummaryrefslogtreecommitdiff
path: root/backend/include/rcc/CodeGen/TargetFrameLowering.h
diff options
context:
space:
mode:
Diffstat (limited to 'backend/include/rcc/CodeGen/TargetFrameLowering.h')
-rw-r--r--backend/include/rcc/CodeGen/TargetFrameLowering.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/backend/include/rcc/CodeGen/TargetFrameLowering.h b/backend/include/rcc/CodeGen/TargetFrameLowering.h
new file mode 100644
index 0000000..1712616
--- /dev/null
+++ b/backend/include/rcc/CodeGen/TargetFrameLowering.h
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef RCC_CODEGEN_TARGETFRAMELOWERING_H
+#define RCC_CODEGEN_TARGETFRAMELOWERING_H
+
+#include "rcc/CodeGen/MachineIRTypes.h"
+#include "rcc/CodeGen/Register.h"
+#include "rcc/Support/Error.h"
+
+#include <cstddef>
+#include <cstdint>
+
+namespace rcc {
+
+class MachineBasicBlock;
+class MachineFunction;
+class MachineInstr;
+class RegisterScavenger;
+class TargetDescription;
+
+struct FrameIndexReference final {
+ PhysicalRegister BaseRegister;
+ std::int64_t Offset = 0;
+};
+
+class TargetFrameLowering {
+public:
+ virtual ~TargetFrameLowering() = default;
+
+ [[nodiscard]] virtual Expected<void> prepareFrame(MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<void>
+ insertCalleeSavedSpillsAndRestores(MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<void>
+ processFunctionBeforeFrameFinalized(MachineFunction &, const TargetDescription &) const {
+ return {};
+ }
+ [[nodiscard]] virtual Expected<void> finalizeFrame(MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+
+ [[nodiscard]] virtual bool isCallFramePseudo(const MachineInstr &Instruction) const noexcept = 0;
+ [[nodiscard]] virtual Expected<void>
+ eliminateCallFramePseudo(MachineInstr &Instruction, MachineFunction &Function,
+ const TargetDescription &Target, RegisterScavenger &Scavenger) const = 0;
+
+ [[nodiscard]] virtual Expected<void> emitPrologue(MachineFunction &Function,
+ const TargetDescription &Target,
+ RegisterScavenger &Scavenger) const = 0;
+ [[nodiscard]] virtual bool
+ isEpilogueTerminator(const MachineInstr &Instruction,
+ const TargetDescription &Target) const noexcept = 0;
+ [[nodiscard]] virtual Expected<void>
+ emitEpilogue(MachineBasicBlock &Block, MachineInstr &Terminator, MachineFunction &Function,
+ const TargetDescription &Target, RegisterScavenger &Scavenger) const = 0;
+ [[nodiscard]] virtual Expected<void>
+ processFunctionBeforeFrameIndexElimination(MachineFunction &, const TargetDescription &) const {
+ return {};
+ }
+
+ [[nodiscard]] virtual Expected<FrameIndexReference>
+ getFrameIndexReference(const MachineFunction &Function, const MachineInstr &Instruction,
+ FrameIndex Index, std::int64_t OperandOffset) const = 0;
+ [[nodiscard]] virtual Expected<void> eliminateFrameIndex(MachineInstr &Instruction,
+ std::size_t OperandIndex,
+ MachineFunction &Function,
+ const TargetDescription &Target,
+ RegisterScavenger &Scavenger) const = 0;
+};
+
+} // namespace rcc
+
+#endif // RCC_CODEGEN_TARGETFRAMELOWERING_H