brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 710d517 Raw
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