diff options
-rw-r--r-- | src/tools/wasm-split.cpp | 24 | ||||
-rw-r--r-- | test/lit/wasm-split/invalid-options.wast | 6 | ||||
-rw-r--r-- | test/lit/wasm-split/symbolmap.wast | 24 |
3 files changed, 54 insertions, 0 deletions
diff --git a/src/tools/wasm-split.cpp b/src/tools/wasm-split.cpp index 171774d82..272582e65 100644 --- a/src/tools/wasm-split.cpp +++ b/src/tools/wasm-split.cpp @@ -20,6 +20,7 @@ #include "ir/module-splitting.h" #include "ir/module-utils.h" #include "ir/names.h" +#include "pass.h" #include "support/file.h" #include "support/name.h" #include "support/utilities.h" @@ -48,6 +49,7 @@ std::set<Name> parseNameList(const std::string& list) { struct WasmSplitOptions : ToolOptions { bool verbose = false; bool emitBinary = true; + bool symbolMap = false; bool instrument = false; @@ -140,6 +142,12 @@ WasmSplitOptions::WasmSplitOptions() [&](Options* o, const std::string& argument) { secondaryOutput = argument; }) + .add("--symbolmap", + "", + "Write a symbol map file for each of the output modules. Not usable " + "with --instrument.", + Options::Arguments::Zero, + [&](Options* o, const std::string& argument) { symbolMap = true; }) .add("--import-namespace", "", "The namespace from which to import objects from the primary " @@ -228,6 +236,9 @@ bool WasmSplitOptions::validate() { if (splitFuncs.size()) { fail("--split-funcs cannot be used with --instrument"); } + if (symbolMap) { + fail("--symbolmap cannot be used with --instrument"); + } } else { if (output.size()) { fail( @@ -552,6 +563,14 @@ std::set<Name> readProfile(Module& wasm, const WasmSplitOptions& options) { return keptFuncs; } +void writeSymbolMap(Module& wasm, std::string filename) { + PassOptions options; + options.arguments["symbolmap"] = filename; + PassRunner runner(&wasm, options); + runner.add("symbolmap"); + runner.run(); +} + void splitModule(Module& wasm, const WasmSplitOptions& options) { std::set<Name> keepFuncs; @@ -641,6 +660,11 @@ void splitModule(Module& wasm, const WasmSplitOptions& options) { adjustTableSize(wasm, options.initialTableSize); adjustTableSize(*secondary, options.initialTableSize); + if (options.symbolMap) { + writeSymbolMap(wasm, options.primaryOutput + ".symbols"); + writeSymbolMap(*secondary, options.secondaryOutput + ".symbols"); + } + // Write the output modules ModuleWriter writer; writer.setBinary(options.emitBinary); diff --git a/test/lit/wasm-split/invalid-options.wast b/test/lit/wasm-split/invalid-options.wast index 20e74196d..32899b87b 100644 --- a/test/lit/wasm-split/invalid-options.wast +++ b/test/lit/wasm-split/invalid-options.wast @@ -13,6 +13,10 @@ ;; RUN: not wasm-split %s --instrument -o2 %t 2>&1 \ ;; RUN: | filecheck %s --check-prefix INSTRUMENT-OUT2 +;; --instrument cannot be used with --symbolmap +;; RUN: not wasm-split %s --instrument --symbolmap 2>&1 \ +;; RUN: | filecheck %s --check-prefix INSTRUMENT-SYMBOLMAP + ;; --instrument cannot be used with --import-namespace ;; RUN: not wasm-split %s --instrument --import-namespace=foo 2>&1 \ ;; RUN: | filecheck %s --check-prefix INSTRUMENT-IMPORT-NS @@ -47,6 +51,8 @@ ;; INSTRUMENT-OUT2: error: secondary output cannot be used with --instrument +;; INSTRUMENT-SYMBOLMAP: error: --symbolmap cannot be used with --instrument + ;; INSTRUMENT-IMPORT-NS: error: --import-namespace cannot be used with --instrument ;; INSTRUMENT-PLACEHOLDER-NS: error: --placeholder-namespace cannot be used with --instrument diff --git a/test/lit/wasm-split/symbolmap.wast b/test/lit/wasm-split/symbolmap.wast new file mode 100644 index 000000000..4fe0f5291 --- /dev/null +++ b/test/lit/wasm-split/symbolmap.wast @@ -0,0 +1,24 @@ +;; RUN: wasm-split %s --keep-funcs=bar -o1 %t.1.wasm -o2 %t.2.wasm --symbolmap +;; RUN: filecheck %s --check-prefix PRIMARY-MAP < %t.1.wasm.symbols +;; RUN: filecheck %s --check-prefix SECONDARY-MAP < %t.2.wasm.symbols +;; RUN: wasm-dis %t.1.wasm | filecheck %s --check-prefix PRIMARY + +;; PRIMARY-MAP: 0:bar + +;; SECONDARY-MAP: 0:baz +;; SECONDARY-MAP: 1:foo + +;; Check that the names have been stripped. +;; PRIMARY: (func $0 + +(module + (func $foo + (nop) + ) + (func $bar + (nop) + ) + (func $baz + (nop) + ) +) |