summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2019-05-29 15:36:42 +0000
committerSam Clegg <sbc@chromium.org>2019-05-29 15:36:42 +0000
commitd506b0a4843f04ea5e7d36dbb595e31025b60b9a (patch)
tree58c204300613ff6ac390b33d81d506354de0d87b
parent2fa31880752a0b0af08ec144e5392b7ef5939f6b (diff)
downloadbcm5719-llvm-d506b0a4843f04ea5e7d36dbb595e31025b60b9a.tar.gz
bcm5719-llvm-d506b0a4843f04ea5e7d36dbb595e31025b60b9a.zip
[WebAssembly] Fix signatures of undefined function in LTO object which are not called directly.
We recently added special handling for function that are not called directly but failed to add testing for the LTO case. See https://reviews.llvm.org/D62153 Differential Revision: https://reviews.llvm.org/D62561 llvm-svn: 361975
-rw-r--r--lld/test/wasm/lto/undef.ll20
-rw-r--r--lld/wasm/SymbolTable.cpp18
2 files changed, 28 insertions, 10 deletions
diff --git a/lld/test/wasm/lto/undef.ll b/lld/test/wasm/lto/undef.ll
index 729007b50c0..65e8e4642d5 100644
--- a/lld/test/wasm/lto/undef.ll
+++ b/lld/test/wasm/lto/undef.ll
@@ -5,10 +5,22 @@
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-unknown"
-declare void @bar()
+declare i32 @bar()
+
+; Symbols such as foo which are only called indirectly are handled slightly
+; differently with resepect to signature checking.
+declare i32 @foo()
+
+@ptr = global i8* bitcast (i32 ()* @foo to i8*), align 8
+; Ensure access to ptr is not inlined below, even under LTO
+@llvm.used = appending global [1 x i8**] [i8** @ptr], section "llvm.metadata"
define void @_start() {
- call void @bar()
+ call i32 @bar()
+
+ %addr = load i32 ()*, i32 ()** bitcast (i8** @ptr to i32 ()**), align 8
+ call i32 %addr()
+
ret void
}
@@ -18,3 +30,7 @@ define void @_start() {
; CHECK-NEXT: Field: bar
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: SigIndex: 0
+; CHECK-NEXT: - Module: env
+; CHECK-NEXT: Field: foo
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: SigIndex: 0
diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp
index ae424749ffc..dec59cb98c7 100644
--- a/lld/wasm/SymbolTable.cpp
+++ b/lld/wasm/SymbolTable.cpp
@@ -136,14 +136,13 @@ static void reportTypeError(const Symbol *Existing, const InputFile *File,
// mismatch.
static bool signatureMatches(FunctionSymbol *Existing,
const WasmSignature *NewSig) {
- if (!NewSig)
- return true;
-
const WasmSignature *OldSig = Existing->Signature;
- if (!OldSig) {
- Existing->Signature = NewSig;
+
+ // If either function is missing a signature (this happend for bitcode
+ // symbols) then assume they match. Any mismatch will be reported later
+ // when the LTO objects are added.
+ if (!NewSig || !OldSig)
return true;
- }
return *NewSig == *OldSig;
}
@@ -390,8 +389,9 @@ Symbol *SymbolTable::addUndefinedFunction(StringRef Name, StringRef ImportName,
uint32_t Flags, InputFile *File,
const WasmSignature *Sig,
bool IsCalledDirectly) {
- LLVM_DEBUG(dbgs() << "addUndefinedFunction: " << Name <<
- " [" << (Sig ? toString(*Sig) : "none") << "]\n");
+ LLVM_DEBUG(dbgs() << "addUndefinedFunction: " << Name << " ["
+ << (Sig ? toString(*Sig) : "none")
+ << "] IsCalledDirectly:" << IsCalledDirectly << "\n");
Symbol *S;
bool WasInserted;
@@ -414,6 +414,8 @@ Symbol *SymbolTable::addUndefinedFunction(StringRef Name, StringRef ImportName,
reportTypeError(S, File, WASM_SYMBOL_TYPE_FUNCTION);
return S;
}
+ if (!ExistingFunction->Signature && Sig)
+ ExistingFunction->Signature = Sig;
if (IsCalledDirectly && !signatureMatches(ExistingFunction, Sig))
if (getFunctionVariant(S, Sig, File, &S))
Replace();
OpenPOWER on IntegriCloud