[PATCH] D58304: [WebAssembly] Warn but don't error on conflicting uses of prototype-less functions
Sam Clegg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 15 13:58:00 PST 2019
sbc100 created this revision.
Herald added subscribers: llvm-commits, jdoerfert, sunfish, aheejin, hiraditya, jgravelle-google, dschuff.
Herald added a project: LLVM.
sbc100 edited the summary of this revision.
sbc100 added reviewers: jgravelle-google, kripken.
sbc100 retitled this revision from "[WebAssembly] Warn, but don't error, on confliting uses of prototypeless functions" to "[WebAssembly] Warn but 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 one at random rather than error'ing out.
The resulting program might not do what is expected since we might pick
the wrong signature. However since its behaviour in C to use the same
function with different signatures this seems beter than refusing to
compile such programs.
Fixes PR40472
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D58304
Files:
llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
llvm/test/CodeGen/WebAssembly/add-prototypes-conflit.ll
Index: llvm/test/CodeGen/WebAssembly/add-prototypes-conflit.ll
===================================================================
--- /dev/null
+++ llvm/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: Prototypeless 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" }
Index: llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
===================================================================
--- llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
+++ llvm/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<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) {
+ dbgs() << "WARNING: Prototypeless function used with "
+ "conflicting signatures: "
+ << F.getName() << "\n";
+ LLVM_DEBUG(dbgs() << " " << *DestType << "\n");
+ LLVM_DEBUG(dbgs() << " "<< *NewType << "\n");
}
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58304.187080.patch
Type: text/x-patch
Size: 2854 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190215/7bfbbfa4/attachment.bin>
More information about the llvm-commits
mailing list