LLVM  8.0.1
WebAssemblyFrameLowering.h
Go to the documentation of this file.
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 /// 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 
20 
21 namespace llvm {
22 class MachineFrameInfo;
23 
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 __stack_pointer
28  /// global).
29  // TODO: (ABI) Revisit and decide how large it should be.
30  static const size_t RedZoneSize = 128;
31 
33  : TargetFrameLowering(StackGrowsDown, /*StackAlignment=*/16,
34  /*LocalAreaOffset=*/0,
35  /*TransientStackAlignment=*/16,
36  /*StackRealignable=*/true) {}
37 
40  MachineBasicBlock::iterator I) const override;
41 
42  /// These methods insert prolog and epilog code into the function.
43  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
44  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
45 
46  bool hasFP(const MachineFunction &MF) const override;
47  bool hasReservedCallFrame(const MachineFunction &MF) const override;
48 
49  bool needsPrologForEH(const MachineFunction &MF) const;
50 
51  /// Write SP back to __stack_pointer global.
52  void writeSPToGlobal(unsigned SrcReg, MachineFunction &MF,
53  MachineBasicBlock &MBB,
54  MachineBasicBlock::iterator &InsertStore,
55  const DebugLoc &DL) const;
56 
57 private:
58  bool hasBP(const MachineFunction &MF) const;
59  bool needsSPForLocalFrame(const MachineFunction &MF) const;
60  bool needsSP(const MachineFunction &MF) const;
61  bool needsSPWriteback(const MachineFunction &MF) const;
62 };
63 
64 } // end namespace llvm
65 
66 #endif
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override
These methods insert prolog and epilog code into the function.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
A debug info location.
Definition: DebugLoc.h:34
bool hasFP(const MachineFunction &MF) const override
Return true if the specified function should have a dedicated frame pointer register.
block Block Frequency true
MachineBasicBlock::iterator eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const override
This method is called during prolog/epilog code insertion to eliminate call frame setup and destroy p...
bool needsPrologForEH(const MachineFunction &MF) const
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
void writeSPToGlobal(unsigned SrcReg, MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator &InsertStore, const DebugLoc &DL) const
Write SP back to __stack_pointer global.
Information about stack frame layout on the target.
static const size_t RedZoneSize
Size of the red zone for the user stack (leaf functions can use this much space below the stack point...
#define I(x, y, z)
Definition: MD5.cpp:58
bool hasReservedCallFrame(const MachineFunction &MF) const override
Under normal circumstances, when a frame pointer is not required, we reserve argument space for call ...