Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp @@ -89,22 +89,24 @@ Function *NewF = nullptr; for (Use &U : F.uses()) { LLVM_DEBUG(dbgs() << "prototype-less use: " << F.getName() << "\n"); + LLVM_DEBUG(dbgs() << *U.getUser() << "\n"); if (auto *BC = dyn_cast(U.getUser())) { if (auto *DestType = dyn_cast( BC->getDestTy()->getPointerElementType())) { if (!NewType) { // Create a new function with the correct type NewType = DestType; + LLVM_DEBUG(dbgs() << "found function type: " << *NewType << "\n"); NewF = Function::Create(NewType, F.getLinkage(), F.getName() + ".fixed_sig"); NewF->setAttributes(F.getAttributes()); NewF->removeFnAttr("no-prototype"); Replacements.emplace_back(&F, NewF); - } else { - if (NewType != DestType) { - report_fatal_error("Prototypeless function used with " - "conflicting signatures: " + - F.getName()); - } + } else if (NewType != DestType) { + errs() << "warning: prototype-less function used with " + "conflicting signatures: " + << F.getName() << "\n"; + LLVM_DEBUG(dbgs() << " " << *DestType << "\n"); + LLVM_DEBUG(dbgs() << " "<< *NewType << "\n"); } } } Index: llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll +++ llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll @@ -0,0 +1,22 @@ +; RUN: opt -S -wasm-add-missing-prototypes -o %t.ll %s 2>&1 | FileCheck %s -check-prefix=WARNING +; RUN: cat %t.ll | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +; WARNING: warning: prototype-less function used with conflicting signatures: foo + +; CHECK-LABEL: @call_with_conflicting_prototypes +; CHECK: %call1 = call i64 bitcast (i64 (i32, i32)* @foo to i64 (i32)*)(i32 42) +; CHECK: %call2 = call i64 @foo(i32 42, i32 43) +define void @call_with_conflicting_prototypes() { + %call1 = call i64 bitcast (i64 (...)* @foo to i64 (i32)*)(i32 42) + %call2 = call i64 bitcast (i64 (...)* @foo to i64 (i32, i32)*)(i32 42, i32 43) + ret void +} + +; CHECK: declare extern_weak i64 @foo(i32, i32) +declare extern_weak i64 @foo(...) #1 + +; CHECK-NOT: attributes {{.*}} = { {{.*}}"no-prototype"{{.*}} } +attributes #1 = { "no-prototype" }