75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- WebAssemblyFrameLowering.cpp - WebAssembly Frame Lowering ----------==//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| ///
 | |
| /// \file
 | |
| /// \brief This file contains the WebAssembly implementation of
 | |
| /// TargetFrameLowering class.
 | |
| ///
 | |
| /// On WebAssembly, there aren't a lot of things to do here. There are no
 | |
| /// callee-saved registers to save, and no spill slots.
 | |
| ///
 | |
| /// The stack grows downward.
 | |
| ///
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "WebAssemblyFrameLowering.h"
 | |
| #include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
 | |
| #include "WebAssemblyInstrInfo.h"
 | |
| #include "WebAssemblyMachineFunctionInfo.h"
 | |
| #include "WebAssemblySubtarget.h"
 | |
| #include "WebAssemblyTargetMachine.h"
 | |
| #include "llvm/CodeGen/MachineFrameInfo.h"
 | |
| #include "llvm/CodeGen/MachineFunction.h"
 | |
| #include "llvm/CodeGen/MachineInstrBuilder.h"
 | |
| #include "llvm/CodeGen/MachineModuleInfo.h"
 | |
| #include "llvm/CodeGen/MachineRegisterInfo.h"
 | |
| #include "llvm/Support/Debug.h"
 | |
| using namespace llvm;
 | |
| 
 | |
| #define DEBUG_TYPE "wasm-frame-info"
 | |
| 
 | |
| // TODO: Implement a red zone?
 | |
| 
 | |
| /// Return true if the specified function should have a dedicated frame pointer
 | |
| /// register.
 | |
| bool WebAssemblyFrameLowering::hasFP(const MachineFunction &MF) const {
 | |
|   const MachineFrameInfo *MFI = MF.getFrameInfo();
 | |
|   const auto *RegInfo =
 | |
|       MF.getSubtarget<WebAssemblySubtarget>().getRegisterInfo();
 | |
|   return MFI->hasCalls() || MFI->hasVarSizedObjects() ||
 | |
|          MFI->isFrameAddressTaken() || MFI->hasStackMap() ||
 | |
|          MFI->hasPatchPoint() || RegInfo->needsStackRealignment(MF);
 | |
| }
 | |
| 
 | |
| /// Under normal circumstances, when a frame pointer is not required, we reserve
 | |
| /// argument space for call sites in the function immediately on entry to the
 | |
| /// current function. This eliminates the need for add/sub sp brackets around
 | |
| /// call sites. Returns true if the call frame is included as part of the stack
 | |
| /// frame.
 | |
| bool WebAssemblyFrameLowering::hasReservedCallFrame(
 | |
|     const MachineFunction &MF) const {
 | |
|   return !MF.getFrameInfo()->hasVarSizedObjects();
 | |
| }
 | |
| 
 | |
| void WebAssemblyFrameLowering::eliminateCallFramePseudoInstr(
 | |
|     MachineFunction &MF, MachineBasicBlock &MBB,
 | |
|     MachineBasicBlock::iterator I) const {
 | |
|   llvm_unreachable("TODO: implement eliminateCallFramePseudoInstr");
 | |
| }
 | |
| 
 | |
| void WebAssemblyFrameLowering::emitPrologue(MachineFunction &MF,
 | |
|                                             MachineBasicBlock &MBB) const {
 | |
|   // FIXME: Implement WebAssemblyFrameLowering::emitPrologue.
 | |
| }
 | |
| 
 | |
| void WebAssemblyFrameLowering::emitEpilogue(MachineFunction &MF,
 | |
|                                             MachineBasicBlock &MBB) const {
 | |
|   llvm_unreachable("TODO: implement emitEpilogue");
 | |
| }
 |