diff options
author | Yury Delendik <ydelendik@mozilla.com> | 2017-06-01 14:53:42 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2017-06-01 12:53:42 -0700 |
commit | 0dc07eaa7db35cf65edbbccebe5c89b995613745 (patch) | |
tree | 0718148a976b882c826c09189a3e779be311c69e /src/tools | |
parent | fcbe14a64d082117d7aab9bbf479e941964cd0de (diff) | |
download | binaryen-0dc07eaa7db35cf65edbbccebe5c89b995613745.tar.gz binaryen-0dc07eaa7db35cf65edbbccebe5c89b995613745.tar.bz2 binaryen-0dc07eaa7db35cf65edbbccebe5c89b995613745.zip |
Exporting/importing debug location information from .wast/.asm.js/.s formats (#1017)
* Extends wasm-as, wasm-dis and s2wasm to consume debug locations.
* Exports source map from asm2wasm
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/asm2wasm.cpp | 19 | ||||
-rw-r--r-- | src/tools/wasm-as.cpp | 20 | ||||
-rw-r--r-- | src/tools/wasm-dis.cpp | 16 |
3 files changed, 51 insertions, 4 deletions
diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp index cf0715198..3fa97d981 100644 --- a/src/tools/asm2wasm.cpp +++ b/src/tools/asm2wasm.cpp @@ -36,6 +36,8 @@ int main(int argc, const char *argv[]) { bool legalizeJavaScriptFFI = true; Asm2WasmBuilder::TrapMode trapMode = Asm2WasmBuilder::TrapMode::JS; bool wasmOnly = false; + std::string sourceMapFilename; + std::string sourceMapUrl; std::string symbolMap; bool emitBinary = true; @@ -99,9 +101,15 @@ int main(int argc, const char *argv[]) { [&legalizeJavaScriptFFI](Options *o, const std::string &) { legalizeJavaScriptFFI = false; }) - .add("--debuginfo", "-g", "Emit names section and debug info (for debug info you must emit text, -S, for this to work)", + .add("--debuginfo", "-g", "Emit names section in wasm binary (or full debuginfo in wast)", Options::Arguments::Zero, [&](Options *o, const std::string &arguments) { options.passOptions.debugInfo = true; }) + .add("--source-map", "-sm", "Emit source map (if using binary output) to the specified file", + Options::Arguments::One, + [&sourceMapFilename](Options *o, const std::string &argument) { sourceMapFilename = argument; }) + .add("--source-map-url", "-su", "Use specified string as source map URL", + Options::Arguments::One, + [&sourceMapUrl](Options *o, const std::string &argument) { sourceMapUrl = argument; }) .add("--symbolmap", "-s", "Emit a symbol map (indexes => names)", Options::Arguments::One, [&](Options *o, const std::string &argument) { symbolMap = argument; }) @@ -136,8 +144,9 @@ int main(int argc, const char *argv[]) { } Asm2WasmPreProcessor pre; - // wasm binaries can contain a names section, but not full debug info - pre.debugInfo = options.passOptions.debugInfo && !emitBinary; + // wasm binaries can contain a names section, but not full debug info -- + // debug info is disabled if a map file is not specified with wasm binary + pre.debugInfo = options.passOptions.debugInfo && (!emitBinary || sourceMapFilename.size()); auto input( read_file<std::vector<char>>(options.extra["infile"], Flags::Text, options.debug ? Flags::Debug : Flags::Release)); char *start = pre.process(input.data()); @@ -204,6 +213,10 @@ int main(int argc, const char *argv[]) { writer.setDebugInfo(options.passOptions.debugInfo); writer.setSymbolMap(symbolMap); writer.setBinary(emitBinary); + if (emitBinary) { + writer.setSourceMapFilename(sourceMapFilename); + writer.setSourceMapUrl(sourceMapUrl); + } writer.write(wasm, options.extra["output"]); if (options.debug) std::cerr << "done." << std::endl; diff --git a/src/tools/wasm-as.cpp b/src/tools/wasm-as.cpp index 067c0f28d..e8003a5ca 100644 --- a/src/tools/wasm-as.cpp +++ b/src/tools/wasm-as.cpp @@ -30,6 +30,8 @@ using namespace wasm; int main(int argc, const char *argv[]) { bool debugInfo = false; std::string symbolMap; + std::string sourceMapFilename; + std::string sourceMapUrl; Options options("wasm-as", "Assemble a .wast (WebAssembly text format) into a .wasm (WebAssembly binary format)"); options.extra["validate"] = "wasm"; options @@ -51,6 +53,12 @@ int main(int argc, const char *argv[]) { .add("--debuginfo", "-g", "Emit names section and debug info", Options::Arguments::Zero, [&](Options *o, const std::string &arguments) { debugInfo = true; }) + .add("--source-map", "-sm", "Emit source map to the specified file", + Options::Arguments::One, + [&sourceMapFilename](Options *o, const std::string &argument) { sourceMapFilename = argument; }) + .add("--source-map-url", "-su", "Use specified string as source map URL", + Options::Arguments::One, + [&sourceMapUrl](Options *o, const std::string &argument) { sourceMapUrl = argument; }) .add("--symbolmap", "-s", "Emit a symbol map (indexes => names)", Options::Arguments::One, [&](Options *o, const std::string &argument) { symbolMap = argument; }) @@ -86,13 +94,23 @@ int main(int argc, const char *argv[]) { if (options.debug) std::cerr << "binarification..." << std::endl; BufferWithRandomAccess buffer(options.debug); WasmBinaryWriter writer(&wasm, buffer, options.debug); - writer.setDebugInfo(debugInfo); + // if debug info is used, then we want to emit the names section + writer.setNamesSection(debugInfo); + std::unique_ptr<std::ofstream> sourceMapStream = nullptr; + if (sourceMapFilename.size()) { + sourceMapStream = make_unique<std::ofstream>(); + sourceMapStream->open(sourceMapFilename); + writer.setSourceMap(sourceMapStream.get(), sourceMapUrl); + } if (symbolMap.size() > 0) writer.setSymbolMap(symbolMap); writer.write(); if (options.debug) std::cerr << "writing to output..." << std::endl; Output output(options.extra["output"], Flags::Binary, options.debug ? Flags::Debug : Flags::Release); buffer.writeTo(output); + if (sourceMapStream) { + sourceMapStream->close(); + } if (options.debug) std::cerr << "Done." << std::endl; } diff --git a/src/tools/wasm-dis.cpp b/src/tools/wasm-dis.cpp index 93c286913..e6fd7badd 100644 --- a/src/tools/wasm-dis.cpp +++ b/src/tools/wasm-dis.cpp @@ -28,6 +28,7 @@ using namespace cashew; using namespace wasm; int main(int argc, const char *argv[]) { + std::string sourceMapFilename; Options options("wasm-dis", "Un-assemble a .wasm (WebAssembly binary format) into a .wast (WebAssembly text format)"); options.add("--output", "-o", "Output file (stdout if not specified)", Options::Arguments::One, @@ -35,6 +36,9 @@ int main(int argc, const char *argv[]) { o->extra["output"] = argument; Colors::disable(); }) + .add("--source-map", "-sm", "Consume source map from the specified file to add location information", + Options::Arguments::One, + [&sourceMapFilename](Options *o, const std::string &argument) { sourceMapFilename = argument; }) .add_positional("INFILE", Options::Arguments::One, [](Options *o, const std::string &argument) { o->extra["infile"] = argument; @@ -46,11 +50,23 @@ int main(int argc, const char *argv[]) { if (options.debug) std::cerr << "parsing binary..." << std::endl; Module wasm; try { + std::unique_ptr<std::ifstream> sourceMapStream; WasmBinaryBuilder parser(wasm, input, options.debug); + if (sourceMapFilename.size()) { + sourceMapStream = make_unique<std::ifstream>(); + sourceMapStream->open(sourceMapFilename); + parser.setDebugLocations(sourceMapStream.get()); + } parser.read(); + if (sourceMapStream) { + sourceMapStream->close(); + } } catch (ParseException& p) { p.dump(std::cerr); Fatal() << "error in parsing wasm binary"; + } catch (MapParseException& p) { + p.dump(std::cerr); + Fatal() << "error in parsing wasm source mapping"; } if (options.debug) std::cerr << "Printing..." << std::endl; |