blob: e888aaf3aef0f5fa681cee0696bda24da0bf6565 [file] [log] [blame]
Dan Gohman10e730a2015-06-29 23:51:55 +00001// 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
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// This class implements WebAssembly-specific bits of
Dan Gohman10e730a2015-06-29 23:51:55 +000012/// TargetFrameLowering class.
13///
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H
17#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H
18
David Blaikie1be62f02017-11-03 22:32:11 +000019#include "llvm/CodeGen/TargetFrameLowering.h"
Dan Gohman10e730a2015-06-29 23:51:55 +000020
21namespace llvm {
Derek Schuff4b3bb212016-02-23 18:13:07 +000022class MachineFrameInfo;
Dan Gohman10e730a2015-06-29 23:51:55 +000023
24class WebAssemblyFrameLowering final : public TargetFrameLowering {
Derek Schuff3f063292016-02-11 20:57:09 +000025 public:
Derek Schuff770bdfe2016-02-23 18:17:46 +000026 /// 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.
Derek Schuff4b3bb212016-02-23 18:13:07 +000029 static const size_t RedZoneSize = 128;
30
Dan Gohman10e730a2015-06-29 23:51:55 +000031 WebAssemblyFrameLowering()
32 : TargetFrameLowering(StackGrowsDown, /*StackAlignment=*/16,
33 /*LocalAreaOffset=*/0,
34 /*TransientStackAlignment=*/16,
35 /*StackRealignable=*/true) {}
36
Hans Wennborge1a2e902016-03-31 18:33:38 +000037 MachineBasicBlock::iterator eliminateCallFramePseudoInstr(
Derek Schuff3f063292016-02-11 20:57:09 +000038 MachineFunction &MF, MachineBasicBlock &MBB,
39 MachineBasicBlock::iterator I) const override;
Dan Gohman10e730a2015-06-29 23:51:55 +000040
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;
Derek Schuff4b3bb212016-02-23 18:13:07 +000047
Heejin Ahn78d19102018-08-21 21:23:07 +000048 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
56private:
Derek Schuff0d41b7b2016-11-07 22:00:48 +000057 bool hasBP(const MachineFunction &MF) const;
Derek Schuff4b3bb212016-02-23 18:13:07 +000058 bool needsSP(const MachineFunction &MF, const MachineFrameInfo &MFI) const;
59 bool needsSPWriteback(const MachineFunction &MF,
60 const MachineFrameInfo &MFI) const;
Dan Gohman10e730a2015-06-29 23:51:55 +000061};
62
Derek Schuff3f063292016-02-11 20:57:09 +000063} // end namespace llvm
Dan Gohman10e730a2015-06-29 23:51:55 +000064
65#endif