diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ir/module-splitting.cpp | 11 | ||||
-rw-r--r-- | src/tools/wasm-split/wasm-split.cpp | 11 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/ir/module-splitting.cpp b/src/ir/module-splitting.cpp index adda1f4a6..777818689 100644 --- a/src/ir/module-splitting.cpp +++ b/src/ir/module-splitting.cpp @@ -316,6 +316,7 @@ struct ModuleSplitter { void exportImportCalledPrimaryFunctions(); void setupTablePatching(); void shareImportableItems(); + void removeUnusedSecondaryElements(); ModuleSplitter(Module& primary, const Config& config) : config(config), secondaryPtr(initSecondary(primary)), primary(primary), @@ -334,6 +335,7 @@ struct ModuleSplitter { exportImportCalledPrimaryFunctions(); setupTablePatching(); shareImportableItems(); + removeUnusedSecondaryElements(); } }; @@ -872,6 +874,15 @@ void ModuleSplitter::shareImportableItems() { } } +void ModuleSplitter::removeUnusedSecondaryElements() { + // TODO: It would be better to be more selective about only exporting and + // importing those items that the secondary module needs. This would reduce + // code size in the primary module as well. + PassRunner runner(&secondary); + runner.add("remove-unused-module-elements"); + runner.run(); +} + } // anonymous namespace Results splitFunctions(Module& primary, const Config& config) { diff --git a/src/tools/wasm-split/wasm-split.cpp b/src/tools/wasm-split/wasm-split.cpp index ea1734b6b..2b66d1164 100644 --- a/src/tools/wasm-split/wasm-split.cpp +++ b/src/tools/wasm-split/wasm-split.cpp @@ -69,11 +69,15 @@ uint64_t hashFile(const std::string& filename) { return uint64_t(digest); } -void adjustTableSize(Module& wasm, int initialSize) { +void adjustTableSize(Module& wasm, int initialSize, bool secondary = false) { if (initialSize < 0) { return; } if (wasm.tables.empty()) { + if (secondary) { + // It's not a problem if the table is not used in the secondary module. + return; + } Fatal() << "--initial-table used but there is no table"; } @@ -336,7 +340,7 @@ void splitModule(const WasmSplitOptions& options) { auto& secondary = splitResults.secondary; adjustTableSize(wasm, options.initialTableSize); - adjustTableSize(*secondary, options.initialTableSize); + adjustTableSize(*secondary, options.initialTableSize, /*secondary=*/true); if (options.symbolMap) { writeSymbolMap(wasm, options.primaryOutput + ".symbols"); @@ -435,9 +439,6 @@ void multiSplitModule(const WasmSplitOptions& options) { // TODO: symbolMap, placeholderMap, emitModuleNames // TODO: Support --emit-text and use .wast in that case. auto moduleName = options.outPrefix + mod + ".wasm"; - PassRunner runner(&*splitResults.secondary); - runner.add("remove-unused-module-elements"); - runner.run(); writeModule(*splitResults.secondary, moduleName, options); } writeModule(wasm, options.output, options); |