[lld] 3f411e9 - [lld][WebAssembly] Fix --export-all when __stack_pointer is present
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 15 06:19:59 PDT 2020
Author: Sam Clegg
Date: 2020-09-15T06:17:01-07:00
New Revision: 3f411e97739ffbdca0077d1c4fdc9c1fc1819019
URL: https://github.com/llvm/llvm-project/commit/3f411e97739ffbdca0077d1c4fdc9c1fc1819019
DIFF: https://github.com/llvm/llvm-project/commit/3f411e97739ffbdca0077d1c4fdc9c1fc1819019.diff
LOG: [lld][WebAssembly] Fix --export-all when __stack_pointer is present
With https://reviews.llvm.org/D87537 we made it an error
to import or export a mutable global with the +mutable-globals
feature present. However the scan was of the entire symbol
table rather than just the imports or exports and the filter
didn't match exaclyt meaning the `__stack_pointer` (a mutable
global) was always triggering with error when the `--export-all`
flag was used.
This also revealed that we didn't have any test coverage for
the `--export-all` flag.
This change fixes the current breakage on the emscripten-releases
roller.
Differential Revision: https://reviews.llvm.org/D87663
Added:
lld/test/wasm/export-all.s
Modified:
lld/wasm/SyntheticSections.h
lld/wasm/Writer.cpp
Removed:
################################################################################
diff --git a/lld/test/wasm/export-all.s b/lld/test/wasm/export-all.s
new file mode 100644
index 000000000000..5f013813cdf1
--- /dev/null
+++ b/lld/test/wasm/export-all.s
@@ -0,0 +1,48 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: wasm-ld --export-all -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+.globl _start
+
+_start:
+ .functype _start () -> ()
+ i32.const 3
+ global.set __stack_pointer
+ end_function
+
+foo:
+ .functype foo () -> (i32)
+ i32.const 42
+ end_function
+
+.globaltype __stack_pointer, i32
+
+# CHECK: - Type: EXPORT
+# CHECK-NEXT: Exports:
+# CHECK-NEXT: - Name: memory
+# CHECK-NEXT: Kind: MEMORY
+# CHECK-NEXT: Index: 0
+# CHECK-NEXT: - Name: __wasm_call_ctors
+# CHECK-NEXT: Kind: FUNCTION
+# CHECK-NEXT: Index: 0
+# CHECK-NEXT: - Name: _start
+# CHECK-NEXT: Kind: FUNCTION
+# CHECK-NEXT: Index: 1
+# CHECK-NEXT: - Name: __dso_handle
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 1
+# CHECK-NEXT: - Name: __data_end
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 2
+# CHECK-NEXT: - Name: __global_base
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 3
+# CHECK-NEXT: - Name: __heap_base
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 4
+# CHECK-NEXT: - Name: __memory_base
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 5
+# CHECK-NEXT: - Name: __table_base
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 6
diff --git a/lld/wasm/SyntheticSections.h b/lld/wasm/SyntheticSections.h
index 3e125ca84e40..335bfe843184 100644
--- a/lld/wasm/SyntheticSections.h
+++ b/lld/wasm/SyntheticSections.h
@@ -221,6 +221,7 @@ class ExportSection : public SyntheticSection {
void writeBody() override;
std::vector<llvm::wasm::WasmExport> exports;
+ std::vector<const Symbol *> exportedSymbols;
};
class StartSection : public SyntheticSection {
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 82b1aec8d1e9..8d5b98050cb1 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -463,26 +463,22 @@ void Writer::populateTargetFeatures() {
return;
if (!config->relocatable && used.count("mutable-globals") == 0) {
- for (Symbol *sym : symtab->getSymbols()) {
+ for (const Symbol *sym : out.importSec->importedSymbols) {
if (auto *global = dyn_cast<GlobalSymbol>(sym)) {
if (global->getGlobalType()->Mutable) {
- if (!sym->isLive())
- continue;
- if (!sym->isUsedInRegularObj)
- continue;
- if (sym->isUndefined() && sym->isWeak() && !config->relocatable)
- continue;
- if (sym->isUndefined())
- error(Twine("mutable global imported but 'mutable-globals' feature "
- "not present in inputs: `") +
- toString(*sym) + "`. Use --no-check-features to suppress.");
- else if (sym->isExported())
- error(Twine("mutable global exported but 'mutable-globals' feature "
- "not present in inputs: `") +
- toString(*sym) + "`. Use --no-check-features to suppress.");
+ error(Twine("mutable global imported but 'mutable-globals' feature "
+ "not present in inputs: `") +
+ toString(*sym) + "`. Use --no-check-features to suppress.");
}
}
}
+ for (const Symbol *sym : out.exportSec->exportedSymbols) {
+ if (auto *global = dyn_cast<GlobalSymbol>(sym)) {
+ error(Twine("mutable global exported but 'mutable-globals' feature "
+ "not present in inputs: `") +
+ toString(*sym) + "`. Use --no-check-features to suppress.");
+ }
+ }
}
if (config->sharedMemory) {
@@ -603,6 +599,7 @@ void Writer::calculateExports() {
LLVM_DEBUG(dbgs() << "Export: " << name << "\n");
out.exportSec->exports.push_back(export_);
+ out.exportSec->exportedSymbols.push_back(sym);
}
}
@@ -1075,8 +1072,6 @@ void Writer::run() {
createSyntheticSections();
log("-- populateProducers");
populateProducers();
- log("-- populateTargetFeatures");
- populateTargetFeatures();
log("-- calculateImports");
calculateImports();
log("-- layoutMemory");
@@ -1119,6 +1114,8 @@ void Writer::run() {
calculateCustomSections();
log("-- populateSymtab");
populateSymtab();
+ log("-- populateTargetFeatures");
+ populateTargetFeatures();
log("-- addSections");
addSections();
More information about the llvm-commits
mailing list