[PATCH] D67015: [lld][WebAssembly] Fix spurious signature mismatch warnings
Sam Clegg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 30 11:34:15 PDT 2019
sbc100 created this revision.
Herald added subscribers: llvm-commits, sunfish, aheejin, jgravelle-google, dschuff.
Herald added a project: LLVM.
sbc100 added a reviewer: dschuff.
This a follow up on: https://reviews.llvm.org/D62153
Handle the case where there are multiple object files that contain
undefined references to the same function. We only generate a function
variant if the existing symbol is directly called.
See: https://github.com/emscripten-core/emscripten/issues/8995
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D67015
Files:
lld/test/wasm/signature-mismatch-unknown.ll
lld/wasm/SymbolTable.cpp
Index: lld/wasm/SymbolTable.cpp
===================================================================
--- lld/wasm/SymbolTable.cpp
+++ lld/wasm/SymbolTable.cpp
@@ -425,9 +425,16 @@
}
if (!existingFunction->signature && sig)
existingFunction->signature = sig;
- if (isCalledDirectly && !signatureMatches(existingFunction, sig))
- if (getFunctionVariant(s, sig, file, &s))
+ if (isCalledDirectly && !signatureMatches(existingFunction, sig)) {
+ auto* existingUndefined = dyn_cast<UndefinedFunction>(existingFunction);
+ // If the existing undefined functions is not called direcltly then let
+ // this one take precedence. Otherwise the existing function is either
+ // direclty called or defined, in which case we need a function variant.
+ if (existingUndefined && !existingUndefined->isCalledDirectly)
replaceSym();
+ else if (getFunctionVariant(s, sig, file, &s))
+ replaceSym();
+ }
}
return s;
Index: lld/test/wasm/signature-mismatch-unknown.ll
===================================================================
--- lld/test/wasm/signature-mismatch-unknown.ll
+++ lld/test/wasm/signature-mismatch-unknown.ll
@@ -3,6 +3,14 @@
; RUN: wasm-ld --fatal-warnings -o %t.wasm %t.ret32.o %t.main.o
; RUN: wasm-ld --fatal-warnings -o %t.wasm %t.main.o %t.ret32.o
+; Also test the case where there are two different object files that contains
+; referneces ret32:
+; %t.main.o: Does not call ret32 directly; used the wrong signature.
+; %t.call-ret32.o: Calls ret32 directly; uses the correct signature.
+; RUN: llc -filetype=obj %p/Inputs/call-ret32.ll -o %t.call-ret32.o
+; RUN: wasm-ld --export=call_ret32 --fatal-warnings -o %t.wasm %t.main.o %t.call-ret32.o %t.ret32.o
+; RUN: wasm-ld --export=call_ret32 --fatal-warnings -o %t.wasm %t.call-ret32.o %t.main.o %t.ret32.o
+
target triple = "wasm32-unknown-unknown"
; Function declartion with incorrect signature.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67015.218139.patch
Type: text/x-patch
Size: 1952 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190830/ffbce2a7/attachment.bin>
More information about the llvm-commits
mailing list