Index: lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp +++ lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp @@ -244,12 +244,14 @@ Main = &F; LLVMContext &C = M.getContext(); Type *MainArgTys[] = { - PointerType::get(Type::getInt8PtrTy(C), 0), - Type::getInt32Ty(C) + 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]) Index: test/CodeGen/WebAssembly/main_no_args.ll =================================================================== --- /dev/null +++ test/CodeGen/WebAssembly/main_no_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: