Home | History | Annotate | Download | only in WebAssembly
      1 // WebAssemblyFrameLowering.h - TargetFrameLowering for WebAssembly -*- 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 /// \file
     11 /// \brief This class implements WebAssembly-specific bits of
     12 /// TargetFrameLowering class.
     13 ///
     14 //===----------------------------------------------------------------------===//
     15 
     16 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H
     17 #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H
     18 
     19 #include "llvm/Target/TargetFrameLowering.h"
     20 
     21 namespace llvm {
     22 class MachineFrameInfo;
     23 
     24 class WebAssemblyFrameLowering final : public TargetFrameLowering {
     25  public:
     26   /// Size of the red zone for the user stack (leaf functions can use this much
     27   /// space below the stack pointer without writing it back to memory).
     28   // TODO: (ABI) Revisit and decide how large it should be.
     29   static const size_t RedZoneSize = 128;
     30 
     31   WebAssemblyFrameLowering()
     32       : TargetFrameLowering(StackGrowsDown, /*StackAlignment=*/16,
     33                             /*LocalAreaOffset=*/0,
     34                             /*TransientStackAlignment=*/16,
     35                             /*StackRealignable=*/true) {}
     36 
     37   MachineBasicBlock::iterator eliminateCallFramePseudoInstr(
     38       MachineFunction &MF, MachineBasicBlock &MBB,
     39       MachineBasicBlock::iterator I) const override;
     40 
     41   /// These methods insert prolog and epilog code into the function.
     42   void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
     43   void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
     44 
     45   bool hasFP(const MachineFunction &MF) const override;
     46   bool hasReservedCallFrame(const MachineFunction &MF) const override;
     47 
     48  private:
     49   bool needsSP(const MachineFunction &MF, const MachineFrameInfo &MFI) const;
     50   bool needsSPWriteback(const MachineFunction &MF,
     51                         const MachineFrameInfo &MFI) const;
     52 };
     53 
     54 }  // end namespace llvm
     55 
     56 #endif
     57