[lld] 198815e - [lld][WebAssembly] Avoid importing/exporting hidden symbols in shared libraries
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Thu May 26 13:43:37 PDT 2022
Author: Sam Clegg
Date: 2022-05-26T13:43:25-07:00
New Revision: 198815e18dad31a9ff0f6c1b30f356db2fefe300
URL: https://github.com/llvm/llvm-project/commit/198815e18dad31a9ff0f6c1b30f356db2fefe300
DIFF: https://github.com/llvm/llvm-project/commit/198815e18dad31a9ff0f6c1b30f356db2fefe300.diff
LOG: [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
Added:
Modified:
lld/test/wasm/shared-weak-symbols.s
lld/wasm/Symbols.cpp
lld/wasm/Writer.cpp
Removed:
################################################################################
diff --git a/lld/test/wasm/shared-weak-symbols.s b/lld/test/wasm/shared-weak-symbols.s
index 00b5d3a9212b..f22aaa543153 100644
--- a/lld/test/wasm/shared-weak-symbols.s
+++ b/lld/test/wasm/shared-weak-symbols.s
@@ -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
diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp
index 2ad21c8947f3..e0670cea6425 100644
--- a/lld/wasm/Symbols.cpp
+++ b/lld/wasm/Symbols.cpp
@@ -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;
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 9e3e32c183f1..4e254717e3b9 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -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;
More information about the llvm-commits
mailing list