WebAssemblyFrameLowering.h revision 360784
118334Speter// WebAssemblyFrameLowering.h - TargetFrameLowering for WebAssembly -*- C++ -*-/ 218334Speter// 318334Speter// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 418334Speter// See https://llvm.org/LICENSE.txt for license information. 518334Speter// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 618334Speter// 718334Speter//===----------------------------------------------------------------------===// 818334Speter/// 918334Speter/// \file 1018334Speter/// This class implements WebAssembly-specific bits of 1118334Speter/// TargetFrameLowering class. 1218334Speter/// 1318334Speter//===----------------------------------------------------------------------===// 1418334Speter 1518334Speter#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H 1618334Speter#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H 1718334Speter 1818334Speter#include "llvm/CodeGen/TargetFrameLowering.h" 1918334Speter 2018334Speternamespace llvm { 2118334Speterclass MachineFrameInfo; 2218334Speter 2318334Speterclass WebAssemblyFrameLowering final : public TargetFrameLowering { 2418334Speterpublic: 2518334Speter /// Size of the red zone for the user stack (leaf functions can use this much 2618334Speter /// space below the stack pointer without writing it back to __stack_pointer 2718334Speter /// global). 2818334Speter // TODO: (ABI) Revisit and decide how large it should be. 2918334Speter static const size_t RedZoneSize = 128; 3018334Speter 3118334Speter WebAssemblyFrameLowering() 3218334Speter : TargetFrameLowering(StackGrowsDown, /*StackAlignment=*/Align(16), 3318334Speter /*LocalAreaOffset=*/0, 3418334Speter /*TransientStackAlignment=*/Align(16), 3518334Speter /*StackRealignable=*/true) {} 3618334Speter 3718334Speter MachineBasicBlock::iterator 3818334Speter eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 3918334Speter MachineBasicBlock::iterator I) const override; 4018334Speter 4118334Speter /// These methods insert prolog and epilog code into the function. 4218334Speter void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 4318334Speter void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 4418334Speter 4518334Speter bool hasFP(const MachineFunction &MF) const override; 4618334Speter bool hasReservedCallFrame(const MachineFunction &MF) const override; 4718334Speter 4818334Speter bool needsPrologForEH(const MachineFunction &MF) const; 4918334Speter 5018334Speter /// Write SP back to __stack_pointer global. 5118334Speter void writeSPToGlobal(unsigned SrcReg, MachineFunction &MF, 5218334Speter MachineBasicBlock &MBB, 5318334Speter MachineBasicBlock::iterator &InsertStore, 5418334Speter const DebugLoc &DL) const; 5518334Speter 5618334Speterprivate: 5718334Speter bool hasBP(const MachineFunction &MF) const; 5818334Speter bool needsSPForLocalFrame(const MachineFunction &MF) const; 5918334Speter bool needsSP(const MachineFunction &MF) const; 6018334Speter bool needsSPWriteback(const MachineFunction &MF) const; 6118334Speter}; 6218334Speter 6318334Speter} // end namespace llvm 6418334Speter 6518334Speter#endif 6618334Speter