[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