diff options
author | Sam Clegg <sbc@chromium.org> | 2019-08-30 19:50:59 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2019-08-30 19:50:59 +0000 |
commit | fecfc5920aeb163822ca0213206a34473109a86d (patch) | |
tree | 025eadb3109994f9d8b8d5824848e829986bdc8f | |
parent | 6ccd67320631e7ab26d6746bdc77eabfa03730e0 (diff) | |
download | bcm5719-llvm-fecfc5920aeb163822ca0213206a34473109a86d.tar.gz bcm5719-llvm-fecfc5920aeb163822ca0213206a34473109a86d.zip |
[lld][WebAssembly] Fix spurious signature mismatch warnings
Summary:
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
Subscribers: dschuff, jgravelle-google, aheejin, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D67015
llvm-svn: 370509
-rw-r--r-- | lld/test/wasm/signature-mismatch-unknown.ll | 8 | ||||
-rw-r--r-- | lld/wasm/SymbolTable.cpp | 11 |
2 files changed, 17 insertions, 2 deletions
diff --git a/lld/test/wasm/signature-mismatch-unknown.ll b/lld/test/wasm/signature-mismatch-unknown.ll index 65bb31511d1..9bd97db50f1 100644 --- a/lld/test/wasm/signature-mismatch-unknown.ll +++ b/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. diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp index c46eec41146..44417b076c7 100644 --- a/lld/wasm/SymbolTable.cpp +++ b/lld/wasm/SymbolTable.cpp @@ -425,9 +425,16 @@ Symbol *SymbolTable::addUndefinedFunction(StringRef name, StringRef importName, } 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; |