diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ir/module-splitting.cpp | 9 | ||||
-rw-r--r-- | src/ir/module-splitting.h | 7 | ||||
-rw-r--r-- | src/tools/wasm-split.cpp | 26 |
3 files changed, 37 insertions, 5 deletions
diff --git a/src/ir/module-splitting.cpp b/src/ir/module-splitting.cpp index d6dca8994..9c5c66641 100644 --- a/src/ir/module-splitting.cpp +++ b/src/ir/module-splitting.cpp @@ -272,6 +272,9 @@ struct ModuleSplitter { // names. std::map<Name, Name> exportedPrimaryFuncs; + // Map placeholder indices to the names of the functions they replace. + std::map<size_t, Name> placeholderMap; + // Initialization helpers static std::unique_ptr<Module> initSecondary(const Module& primary); static std::pair<std::set<Name>, std::set<Name>> @@ -483,6 +486,7 @@ void ModuleSplitter::setupTablePatching() { // `importNamespace`.`index`. forEachElement(primary, [&](Name, Name, Index index, Name& elem) { if (secondaryFuncs.count(elem)) { + placeholderMap[index] = elem; auto* secondaryFunc = secondary.getFunction(elem); replacedElems[index] = secondaryFunc; auto placeholder = std::make_unique<Function>(); @@ -655,8 +659,9 @@ void ModuleSplitter::shareImportableItems() { } // anonymous namespace -std::unique_ptr<Module> splitFunctions(Module& primary, const Config& config) { - return std::move(ModuleSplitter(primary, config).secondaryPtr); +Results splitFunctions(Module& primary, const Config& config) { + ModuleSplitter split(primary, config); + return {std::move(split.secondaryPtr), std::move(split.placeholderMap)}; } } // namespace ModuleSplitting diff --git a/src/ir/module-splitting.h b/src/ir/module-splitting.h index 479fba148..cfbd45b14 100644 --- a/src/ir/module-splitting.h +++ b/src/ir/module-splitting.h @@ -68,8 +68,13 @@ struct Config { bool minimizeNewExportNames = false; }; +struct Results { + std::unique_ptr<Module> secondary; + std::map<size_t, Name> placeholderMap; +}; + // Returns the new secondary module and modifies the `primary` module in place. -std::unique_ptr<Module> splitFunctions(Module& primary, const Config& config); +Results splitFunctions(Module& primary, const Config& config); } // namespace ModuleSplitting diff --git a/src/tools/wasm-split.cpp b/src/tools/wasm-split.cpp index 4ac295d0e..261c62a68 100644 --- a/src/tools/wasm-split.cpp +++ b/src/tools/wasm-split.cpp @@ -61,6 +61,7 @@ struct WasmSplitOptions : ToolOptions { bool verbose = false; bool emitBinary = true; bool symbolMap = false; + bool placeholderMap = false; // TODO: Remove this. See the comment in wasm-binary.h. bool emitModuleNames = false; @@ -180,6 +181,13 @@ WasmSplitOptions::WasmSplitOptions() {Mode::Split}, Options::Arguments::Zero, [&](Options* o, const std::string& argument) { symbolMap = true; }) + .add( + "--placeholdermap", + "", + "Write a file mapping placeholder indices to the function names.", + {Mode::Split}, + Options::Arguments::Zero, + [&](Options* o, const std::string& argument) { placeholderMap = true; }) .add("--import-namespace", "", "The namespace from which to import objects from the primary " @@ -690,6 +698,15 @@ void writeSymbolMap(Module& wasm, std::string filename) { runner.run(); } +void writePlaceholderMap(const std::map<size_t, Name> placeholderMap, + std::string filename) { + Output output(filename, Flags::Text); + auto& o = output.getStream(); + for (auto pair : placeholderMap) { + o << pair.first << ':' << pair.second << '\n'; + } +} + void splitModule(const WasmSplitOptions& options) { Module wasm; parseInput(wasm, options); @@ -795,8 +812,8 @@ void splitModule(const WasmSplitOptions& options) { config.newExportPrefix = options.exportPrefix; } config.minimizeNewExportNames = !options.passOptions.debugInfo; - std::unique_ptr<Module> secondary = - ModuleSplitting::splitFunctions(wasm, config); + auto splitResults = ModuleSplitting::splitFunctions(wasm, config); + auto& secondary = splitResults.secondary; adjustTableSize(wasm, options.initialTableSize); adjustTableSize(*secondary, options.initialTableSize); @@ -806,6 +823,11 @@ void splitModule(const WasmSplitOptions& options) { writeSymbolMap(*secondary, options.secondaryOutput + ".symbols"); } + if (options.placeholderMap) { + writePlaceholderMap(splitResults.placeholderMap, + options.primaryOutput + ".placeholders"); + } + // Set the names of the split modules. This can help differentiate them in // stack traces. if (options.emitModuleNames) { |