[llvm] r354523 - [WebAssembly] Don't error on conflicting uses of prototype-less functions
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 20 14:40:57 PST 2019
Author: sbc
Date: Wed Feb 20 14:40:57 2019
New Revision: 354523
URL: http://llvm.org/viewvc/llvm-project?rev=354523&view=rev
Log:
[WebAssembly] Don't error on conflicting uses of prototype-less functions
When we can't determine with certainty the signature of a function
import we pick the fist signature we find rather than error'ing out.
The resulting program might not do what is expected since we might pick
the wrong signature. However since undefined behavior in C to use the
same function with different signatures this seems better than refusing
to compile such programs.
Fixes PR40472
Differential Revision: https://reviews.llvm.org/D58304
Added:
llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll
Modified:
llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp?rev=354523&r1=354522&r2=354523&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp Wed Feb 20 14:40:57 2019
@@ -89,22 +89,24 @@ bool WebAssemblyAddMissingPrototypes::ru
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<BitCastOperator>(U.getUser())) {
if (auto *DestType = dyn_cast<FunctionType>(
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");
}
}
}
Added: llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll?rev=354523&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll (added)
+++ llvm/trunk/test/CodeGen/WebAssembly/add-prototypes-conflit.ll Wed Feb 20 14:40:57 2019
@@ -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" }
More information about the llvm-commits
mailing list