--- /dev/null
+# 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
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) {
LLVM_DEBUG(dbgs() << "Export: " << name << "\n");
out.exportSec->exports.push_back(export_);
+ out.exportSec->exportedSymbols.push_back(sym);
}
}
createSyntheticSections();
log("-- populateProducers");
populateProducers();
- log("-- populateTargetFeatures");
- populateTargetFeatures();
log("-- calculateImports");
calculateImports();
log("-- layoutMemory");
calculateCustomSections();
log("-- populateSymtab");
populateSymtab();
+ log("-- populateTargetFeatures");
+ populateTargetFeatures();
log("-- addSections");
addSections();