Skip to content

Commit

Permalink
[lld][WebAssembly] Avoid importing/exporting hidden symbols in shared…
Browse files Browse the repository at this point in the history
… 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 emscripten-core/emscripten#16972

This should also help with:
emscripten-core/emscripten#15487

Differential Revision: https://reviews.llvm.org/D126491
  • Loading branch information
sbc100 committed May 26, 2022
1 parent 5221875 commit 198815e
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
36 changes: 32 additions & 4 deletions lld/test/wasm/shared-weak-symbols.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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
8 changes: 4 additions & 4 deletions lld/wasm/Symbols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion lld/wasm/Writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 198815e

Please sign in to comment.