diff options
author | Sam Clegg <sbc@chromium.org> | 2018-09-13 17:13:10 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2018-09-13 17:13:10 +0000 |
commit | 79c054f6b8b0f7989366f56c84ee30f92e3e6b1f (patch) | |
tree | 91aebc9b1f3eb4803b70f01e926738b48d78d571 /llvm | |
parent | dbdd46da186df61af6f9ea614d89979e0715cc52 (diff) | |
download | bcm5719-llvm-79c054f6b8b0f7989366f56c84ee30f92e3e6b1f.tar.gz bcm5719-llvm-79c054f6b8b0f7989366f56c84ee30f92e3e6b1f.zip |
[WebAssembly] Fix signature of `main` in FixFunctionBitcasts
Also, add a check to ensure that when main has the expected signature
we do not create a wrapper.
Differential Revision: https://reviews.llvm.org/D51562
llvm-svn: 342157
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp | 6 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/main-no-args.ll (renamed from llvm/test/CodeGen/WebAssembly/main.ll) | 0 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/main-with-args.ll | 16 |
3 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp index 179dcc50540..0644f1232f6 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp @@ -244,11 +244,13 @@ bool FixFunctionBitcasts::runOnModule(Module &M) { if (!TemporaryWorkarounds && !F.isDeclaration() && F.getName() == "main") { Main = &F; LLVMContext &C = M.getContext(); - Type *MainArgTys[] = {PointerType::get(Type::getInt8PtrTy(C), 0), - Type::getInt32Ty(C)}; + Type *MainArgTys[] = {Type::getInt32Ty(C), + PointerType::get(Type::getInt8PtrTy(C), 0)}; FunctionType *MainTy = FunctionType::get(Type::getInt32Ty(C), MainArgTys, /*isVarArg=*/false); if (F.getFunctionType() != MainTy) { + LLVM_DEBUG(dbgs() << "Found `main` function with incorrect type: " + << *F.getFunctionType() << "\n"); Value *Args[] = {UndefValue::get(MainArgTys[0]), UndefValue::get(MainArgTys[1])}; Value *Casted = diff --git a/llvm/test/CodeGen/WebAssembly/main.ll b/llvm/test/CodeGen/WebAssembly/main-no-args.ll index 09a4feaed14..09a4feaed14 100644 --- a/llvm/test/CodeGen/WebAssembly/main.ll +++ b/llvm/test/CodeGen/WebAssembly/main-no-args.ll diff --git a/llvm/test/CodeGen/WebAssembly/main-with-args.ll b/llvm/test/CodeGen/WebAssembly/main-with-args.ll new file mode 100644 index 00000000000..aa085409756 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/main-with-args.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -asm-verbose=false -wasm-temporary-workarounds=false | FileCheck %s + +; Test that main function with expected signature is not wrapped + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +define i32 @main(i32 %a, i8** %b) { + ret i32 0 +} + +; CHECK-LABEL: main: +; CHECK-NEXT: .param i32, i32 +; CHECK-NEXT: .result i32 + +; CHECK-NOT: __original_main: |