[PATCH] D62561: [WebAssembly] Fix signatures of undefined function in LTO object which are not called directly.
Phabricator via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 29 08:34:28 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361975: [WebAssembly] Fix signatures of undefined function in LTO object which are not… (authored by sbc, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D62561?vs=201797&id=201930#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62561/new/
https://reviews.llvm.org/D62561
Files:
lld/trunk/test/wasm/lto/undef.ll
lld/trunk/wasm/SymbolTable.cpp
Index: lld/trunk/test/wasm/lto/undef.ll
===================================================================
--- lld/trunk/test/wasm/lto/undef.ll
+++ lld/trunk/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
Index: lld/trunk/wasm/SymbolTable.cpp
===================================================================
--- lld/trunk/wasm/SymbolTable.cpp
+++ lld/trunk/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();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62561.201930.patch
Type: text/x-patch
Size: 2870 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190529/77635685/attachment.bin>
More information about the llvm-commits
mailing list