83 lines · c
1// WebAssemblyFrameLowering.h - TargetFrameLowering for WebAssembly -*- 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-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This class implements WebAssembly-specific bits of11/// TargetFrameLowering class.12///13//===----------------------------------------------------------------------===//14 15#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H16#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H17 18#include "llvm/CodeGen/TargetFrameLowering.h"19 20namespace llvm {21 22class WebAssemblyFrameLowering final : public TargetFrameLowering {23public:24 /// Size of the red zone for the user stack (leaf functions can use this much25 /// space below the stack pointer without writing it back to __stack_pointer26 /// global).27 // TODO: (ABI) Revisit and decide how large it should be.28 static const size_t RedZoneSize = 128;29 30 WebAssemblyFrameLowering()31 : TargetFrameLowering(StackGrowsDown, /*StackAlignment=*/Align(16),32 /*LocalAreaOffset=*/0,33 /*TransientStackAlignment=*/Align(16),34 /*StackRealignable=*/true) {}35 36 MachineBasicBlock::iterator37 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,38 MachineBasicBlock::iterator I) const override;39 40 /// These methods insert prolog and epilog code into the function.41 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;42 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;43 44 bool hasReservedCallFrame(const MachineFunction &MF) const override;45 bool isSupportedStackID(TargetStackID::Value ID) const override;46 DwarfFrameBase getDwarfFrameBase(const MachineFunction &MF) const override;47 48 bool needsPrologForEH(const MachineFunction &MF) const;49 50 /// Write SP back to __stack_pointer global.51 void writeSPToGlobal(unsigned SrcReg, MachineFunction &MF,52 MachineBasicBlock &MBB,53 MachineBasicBlock::iterator &InsertStore,54 const DebugLoc &DL) const;55 56 // Returns the index of the WebAssembly local to which the stack object57 // FrameIndex in MF should be allocated, or std::nullopt.58 static std::optional<unsigned> getLocalForStackObject(MachineFunction &MF,59 int FrameIndex);60 61 static unsigned getSPReg(const MachineFunction &MF);62 static unsigned getFPReg(const MachineFunction &MF);63 static unsigned getOpcConst(const MachineFunction &MF);64 static unsigned getOpcAdd(const MachineFunction &MF);65 static unsigned getOpcSub(const MachineFunction &MF);66 static unsigned getOpcAnd(const MachineFunction &MF);67 static unsigned getOpcGlobGet(const MachineFunction &MF);68 static unsigned getOpcGlobSet(const MachineFunction &MF);69 70protected:71 bool hasFPImpl(const MachineFunction &MF) const override;72 73private:74 bool hasBP(const MachineFunction &MF) const;75 bool needsSPForLocalFrame(const MachineFunction &MF) const;76 bool needsSP(const MachineFunction &MF) const;77 bool needsSPWriteback(const MachineFunction &MF) const;78};79 80} // end namespace llvm81 82#endif83