[PATCH] D62561: [WebAssembly] Fix signatures of undefined function in LTO object which are not called directly.
Sam Clegg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue May 28 17:22:27 PDT 2019
sbc100 created this revision.
Herald added subscribers: llvm-commits, dexonsmith, steven_wu, sunfish, aheejin, jgravelle-google, inglorion, mehdi_amini, dschuff.
Herald added a project: LLVM.
sbc100 updated this revision to Diff 201797.
sbc100 added a comment.
sbc100 added reviewers: ruiu, dschuff, azakai.
- revert
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
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D62561
Files:
lld/test/wasm/lto/undef.ll
lld/wasm/SymbolTable.cpp
Index: lld/wasm/SymbolTable.cpp
===================================================================
--- lld/wasm/SymbolTable.cpp
+++ lld/wasm/SymbolTable.cpp
@@ -136,14 +136,13 @@
// 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 @@
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 @@
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();
Index: lld/test/wasm/lto/undef.ll
===================================================================
--- lld/test/wasm/lto/undef.ll
+++ 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()
+
+ at ptr = global i8* bitcast (i32 ()* @foo to i8*), align 8
+; Ensure access to ptr is not inlined below, even under LTO
+ at 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 @@
; 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62561.201797.patch
Type: text/x-patch
Size: 2834 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190529/634fa449/attachment.bin>
More information about the llvm-commits
mailing list