Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp @@ -244,11 +244,13 @@ 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 = Index: llvm/trunk/test/CodeGen/WebAssembly/main-no-args.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/main-no-args.ll +++ llvm/trunk/test/CodeGen/WebAssembly/main-no-args.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -asm-verbose=false -wasm-temporary-workarounds=false | FileCheck %s + +; Test main functions with alternate signatures. + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +define void @main() { + ret void +} + +; CHECK-LABEL: .L__original_main: +; CHECK-NEXT: end_function + +; CHECK-LABEL: main: +; CHECK-NEXT: .param i32, i32 +; CHECK-NEXT: .result i32 +; CHECK: call .L__original_main@FUNCTION Index: llvm/trunk/test/CodeGen/WebAssembly/main-with-args.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/main-with-args.ll +++ llvm/trunk/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: Index: llvm/trunk/test/CodeGen/WebAssembly/main.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/main.ll +++ llvm/trunk/test/CodeGen/WebAssembly/main.ll @@ -1,18 +0,0 @@ -; RUN: llc < %s -asm-verbose=false -wasm-temporary-workarounds=false | FileCheck %s - -; Test main functions with alternate signatures. - -target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" -target triple = "wasm32-unknown-unknown" - -define void @main() { - ret void -} - -; CHECK-LABEL: .L__original_main: -; CHECK-NEXT: end_function - -; CHECK-LABEL: main: -; CHECK-NEXT: .param i32, i32 -; CHECK-NEXT: .result i32 -; CHECK: call .L__original_main@FUNCTION