[lld][WebAssembly] Avoid importing/exporting hidden symbols in shared libraries

We have some special handling for weakly defined symbols where we both
import and export them, but this is not needed for hidden symbols which
should never be imported or exported.

See https://github.com/emscripten-core/emscripten/pull/16972

This should also help with:
https://github.com/emscripten-core/emscripten/issues/15487

Differential Revision: https://reviews.llvm.org/D126491
This commit is contained in:
Sam Clegg 2022-05-26 10:32:04 -07:00
parent 5221875a95
commit 198815e18d
3 changed files with 38 additions and 9 deletions

View File

@ -3,10 +3,9 @@
# RUN: obj2yaml %t.wasm | FileCheck %s
# RUN: llvm-objdump -d %t.wasm | FileCheck %s -check-prefix=ASM
# Verify the weakly defined fuctions (weak_func) are both
# imported and exported, and that internal usage (direct call)
# always uses the imported version.
# Verify the weakly defined fuctions (weak_func) are both imported and exported,
# and that internal usage (direct call) always uses the imported version.
# Hidden functions, even if weak, should not be imported or exported.
.globl weak_func
.weak weak_func
@ -15,12 +14,23 @@ weak_func:
i32.const 0
end_function
.globl hidden_weak_func
.hidden hidden_weak_func
.weak hidden_weak_func
hidden_weak_func:
.functype hidden_weak_func () -> (i32)
i32.const 42
end_function
.globl call_weak
call_weak:
# ASM: <call_weak>:
.functype call_weak () -> (i32)
call weak_func
# ASM: 10 80 80 80 80 00 call 0
drop
call hidden_weak_func
# ASM: 10 84 80 80 80 00 call 4
end_function
# ASM-NEXT: 0b end
@ -45,6 +55,20 @@ call_weak:
# CHECK-NEXT: Field: weak_func
# CHECK-NEXT: Kind: FUNCTION
# CHECK-NEXT: SigIndex: 0
# CHECK-NEXT: - Type: FUNCTION
# CHECK: - Type: EXPORT
# CHECK-NEXT: Exports:
# CHECK-NEXT: - Name: __wasm_call_ctors
# CHECK-NEXT: Kind: FUNCTION
# CHECK-NEXT: Index: 1
# CHECK-NEXT: - Name: weak_func
# CHECK-NEXT: Kind: FUNCTION
# CHECK-NEXT: Index: 3
# CHECK-NEXT: - Name: call_weak
# CHECK-NEXT: Kind: FUNCTION
# CHECK-NEXT: Index: 5
# CHECK-NEXT: - Type: START
# CHECK: - Type: CUSTOM
# CHECK-NEXT: Name: name
@ -57,3 +81,7 @@ call_weak:
# CHECK-NEXT: Name: __wasm_apply_data_relocs
# CHECK-NEXT: - Index: 3
# CHECK-NEXT: Name: weak_func
# CHECK-NEXT: - Index: 4
# CHECK-NEXT: Name: hidden_weak_func
# CHECK-NEXT: - Index: 5
# CHECK-NEXT: Name: call_weak

View File

@ -217,15 +217,15 @@ void Symbol::setHidden(bool isHidden) {
}
bool Symbol::isExported() const {
if (!isDefined() || isLocal())
return false;
// Shared libraries must export all weakly defined symbols
// in case they contain the version that will be chosen by
// the dynamic linker.
if (config->shared && isLive() && isDefined() && isWeak())
if (config->shared && isLive() && isWeak() && !isHidden())
return true;
if (!isDefined() || isLocal())
return false;
if (config->exportAll || (config->exportDynamic && !isHidden()))
return true;

View File

@ -592,7 +592,8 @@ static bool shouldImport(Symbol *sym) {
// When a symbol is weakly defined in a shared library we need to allow
// it to be overridden by another module so need to both import
// and export the symbol.
if (config->shared && sym->isDefined() && sym->isWeak())
if (config->shared && sym->isWeak() && !sym->isUndefined() &&
!sym->isHidden())
return true;
if (!sym->isUndefined())
return false;