[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