mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 10:55:58 +08:00
[lld][WebAssembly] Fix for --relocatable and signature mismatches
This is a followup to https://reviews.llvm.org/D78779. When signatures mismatch we create set of variant symbols. Some of the fields in these symbols were not be initialized correct. Specifically we were seeing isUsedInRegularObj not being set correctly, leading to the symbol not getting included in the symbol table and a crash writing relections in --reloctable mode. There is larger refactor due here, but this is a minimal change the fixes the bug at hand. Differential Revision: https://reviews.llvm.org/D79756
This commit is contained in:
12
lld/test/wasm/Inputs/sig_mismatch.s
Normal file
12
lld/test/wasm/Inputs/sig_mismatch.s
Normal file
@@ -0,0 +1,12 @@
|
||||
.globl foo
|
||||
foo:
|
||||
.functype foo (f32) -> (i32)
|
||||
i32.const 0
|
||||
end_function
|
||||
|
||||
|
||||
.globl call_foo
|
||||
call_foo:
|
||||
.functype call_foo () -> (i32)
|
||||
call foo
|
||||
end_function
|
||||
57
lld/test/wasm/signature-mismatch-relocatable.s
Normal file
57
lld/test/wasm/signature-mismatch-relocatable.s
Normal file
@@ -0,0 +1,57 @@
|
||||
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
|
||||
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t2.o %S/Inputs/sig_mismatch.s
|
||||
# RUN: wasm-ld --relocatable %t.o %t2.o -o %t.wasm
|
||||
# RUN: obj2yaml %t.wasm | FileCheck %s
|
||||
|
||||
# Regression test for handling of signature mismatches (variant function
|
||||
# symbols) and relocatable output. This issue only occurred when the undefined
|
||||
# function was seen first and the defined function was referenced within the
|
||||
# the defining file (see %S/Inputs/sig_mismatch.s).
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
.functype _start () -> ()
|
||||
i32.const 1
|
||||
i64.const 2
|
||||
i32.const 3
|
||||
call foo
|
||||
end_function
|
||||
|
||||
.functype foo (i32, i64, i32) -> (i32)
|
||||
|
||||
# CHECK: - Type: CUSTOM
|
||||
# CHECK-NEXT: Name: linking
|
||||
# CHECK-NEXT: Version: 2
|
||||
# CHECK-NEXT: SymbolTable:
|
||||
# CHECK-NEXT: - Index: 0
|
||||
# CHECK-NEXT: Kind: FUNCTION
|
||||
# CHECK-NEXT: Name: _start
|
||||
# CHECK-NEXT: Flags: [ ]
|
||||
# CHECK-NEXT: Function: 1
|
||||
# CHECK-NEXT: - Index: 1
|
||||
# CHECK-NEXT: Kind: FUNCTION
|
||||
# CHECK-NEXT: Name: foo
|
||||
# CHECK-NEXT: Flags: [ ]
|
||||
# CHECK-NEXT: Function: 2
|
||||
# CHECK-NEXT: - Index: 2
|
||||
# CHECK-NEXT: Kind: FUNCTION
|
||||
# CHECK-NEXT: Name: call_foo
|
||||
# CHECK-NEXT: Flags: [ ]
|
||||
# CHECK-NEXT: Function: 3
|
||||
# CHECK-NEXT: - Index: 3
|
||||
# CHECK-NEXT: Kind: FUNCTION
|
||||
# CHECK-NEXT: Name: 'signature_mismatch:foo'
|
||||
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
|
||||
# CHECK-NEXT: Function: 0
|
||||
# CHECK-NEXT: - Type: CUSTOM
|
||||
# CHECK-NEXT: Name: name
|
||||
# CHECK-NEXT: FunctionNames:
|
||||
# CHECK-NEXT: - Index: 0
|
||||
# CHECK-NEXT: Name: 'signature_mismatch:foo'
|
||||
# CHECK-NEXT: - Index: 1
|
||||
# CHECK-NEXT: Name: _start
|
||||
# CHECK-NEXT: - Index: 2
|
||||
# CHECK-NEXT: Name: foo
|
||||
# CHECK-NEXT: - Index: 3
|
||||
# CHECK-NEXT: Name: call_foo
|
||||
# CHECK-NEXT:...
|
||||
@@ -113,6 +113,7 @@ std::pair<Symbol *, bool> SymbolTable::insertName(StringRef name) {
|
||||
sym->isUsedInRegularObj = false;
|
||||
sym->canInline = true;
|
||||
sym->traced = trace;
|
||||
sym->forceExport = false;
|
||||
symVector.emplace_back(sym);
|
||||
return {sym, true};
|
||||
}
|
||||
@@ -598,6 +599,11 @@ bool SymbolTable::getFunctionVariant(Symbol* sym, const WasmSignature *sig,
|
||||
// Create a new variant;
|
||||
LLVM_DEBUG(dbgs() << "added new variant\n");
|
||||
variant = reinterpret_cast<Symbol *>(make<SymbolUnion>());
|
||||
variant->isUsedInRegularObj =
|
||||
!file || file->kind() == InputFile::ObjectKind;
|
||||
variant->canInline = true;
|
||||
variant->traced = false;
|
||||
variant->forceExport = false;
|
||||
variants.push_back(variant);
|
||||
} else {
|
||||
LLVM_DEBUG(dbgs() << "variant already exists: " << toString(*variant) << "\n");
|
||||
|
||||
Reference in New Issue
Block a user