From 30d7ede265acbae04029375354e6ccb225c99097 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Wed, 16 Dec 2015 20:43:06 +0000 Subject: [PATCH] [WebAssembly] Print an extra local decl when the user stack pointer is used Differential Revision: http://reviews.llvm.org/D15546 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255815 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 6 ++++++ test/CodeGen/WebAssembly/userstack.ll | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 079c864c7bc..e853b76d0dd 100644 --- a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -26,6 +26,7 @@ #include "llvm/CodeGen/Analysis.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/IR/DataLayout.h" #include "llvm/MC/MCContext.h" @@ -181,6 +182,11 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { Local.addOperand(MCOperand::createImm(getRegType(VReg).SimpleTy)); AnyWARegs = true; } + if (MF->getFrameInfo()->getStackSize() > 0) { + // TODO: wasm64 + Local.addOperand(MCOperand::createImm(MVT::i32)); + AnyWARegs = true; + } if (AnyWARegs) EmitToStreamer(*OutStreamer, Local); diff --git a/test/CodeGen/WebAssembly/userstack.ll b/test/CodeGen/WebAssembly/userstack.ll index 27ff1e192e6..855eaa00a4a 100644 --- a/test/CodeGen/WebAssembly/userstack.ll +++ b/test/CodeGen/WebAssembly/userstack.ll @@ -6,6 +6,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" ; CHECK-LABEL: alloca32: +; Check that there is an extra local for the stack pointer. +; CHECK: .local i32, i32, i32, i32{{$}} define void @alloca32() { ; CHECK: i32.const [[L1:.+]]=, __stack_pointer ; CHECK-NEXT: i32.load [[L1]]=, 0([[L1]]) @@ -23,6 +25,7 @@ define void @alloca32() { } ; CHECK-LABEL: alloca3264: +; CHECK: .local i32, i32, i32, i32{{$}} define void @alloca3264() { ; CHECK: i32.const [[L1:.+]]=, __stack_pointer ; CHECK-NEXT: i32.load [[L1]]=, 0([[L1]]) @@ -43,6 +46,8 @@ define void @alloca3264() { ret void } +; CHECK-LABEL: allocarray: +; CHECK: .local i32, i32, i32, i32, i32, i32{{$}} define void @allocarray() { ; CHECK: i32.const [[L1:.+]]=, __stack_pointer ; CHECK-NEXT: i32.load [[L1]]=, 0([[L1]]) -- 2.34.1