summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/wasm-split.cpp24
-rw-r--r--test/lit/wasm-split/invalid-options.wast6
-rw-r--r--test/lit/wasm-split/symbolmap.wast24
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)
+ )
+)