blob: e20fc5df74432be885a49b68d2b978f48577bb9e [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
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
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
48 private:
49 bool needsSP(const MachineFunction &MF, const MachineFrameInfo &MFI) const;
50 bool needsSPWriteback(const MachineFunction &MF,
51 const MachineFrameInfo &MFI) const;
Dan Gohman10e730a2015-06-29 23:51:55 +000052};
53
Derek Schuff3f063292016-02-11 20:57:09 +000054} // end namespace llvm
Dan Gohman10e730a2015-06-29 23:51:55 +000055
56#endif