diff options
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 40 | ||||
-rw-r--r-- | test/unit/input/empty_lld.wat | 9 | ||||
-rw-r--r-- | test/unit/test_finalize.py | 24 |
3 files changed, 53 insertions, 20 deletions
diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 7bb8ed310..ce1da4c9e 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -80,7 +80,8 @@ int main(int argc, const char* argv[]) { [&DWARF](Options*, const std::string&) { DWARF = true; }) .add("--emit-text", "-S", - "Emit text instead of binary for the output file", + "Emit text instead of binary for the output file. " + "In this mode if no output file is specified, we write to stdout.", Options::Arguments::Zero, [&emitBinary](Options*, const std::string&) { emitBinary = false; }) .add("--global-base", @@ -172,9 +173,6 @@ int main(int argc, const char* argv[]) { if (infile == "") { Fatal() << "Need to specify an infile\n"; } - if (outfile == "" && emitBinary) { - Fatal() << "Need to specify an outfile, or use text output\n"; - } Module wasm; ModuleReader reader; @@ -335,23 +333,29 @@ int main(int argc, const char* argv[]) { BYN_DEBUG_WITH_TYPE("emscripten-dump", WasmPrinter::printModule(&wasm, std::cerr)); - Output output(outfile, emitBinary ? Flags::Binary : Flags::Text); - ModuleWriter writer; - writer.setDebugInfo(debugInfo); - // writer.setSymbolMap(symbolMap); - writer.setBinary(emitBinary); - if (outputSourceMapFilename.size()) { - writer.setSourceMapFilename(outputSourceMapFilename); - writer.setSourceMapUrl(outputSourceMapUrl); + // Write the modified wasm if the user asked us to, either by specifying an + // output file, or requesting text output (which goes to stdout by default). + if (outfile.size() > 0 || !emitBinary) { + Output output(outfile, emitBinary ? Flags::Binary : Flags::Text); + ModuleWriter writer; + writer.setDebugInfo(debugInfo); + // writer.setSymbolMap(symbolMap); + writer.setBinary(emitBinary); + if (outputSourceMapFilename.size()) { + writer.setSourceMapFilename(outputSourceMapFilename); + writer.setSourceMapUrl(outputSourceMapUrl); + } + writer.write(wasm, output); + if (!emitBinary) { + output << "(;\n"; + output << "--BEGIN METADATA --\n" << metadata << "-- END METADATA --\n"; + output << ";)\n"; + } } - writer.write(wasm, output); + // If we emit text then we emitted the metadata together with that text + // earlier. Otherwise emit it to stdout. if (emitBinary) { std::cout << metadata; - } else { - output << "(;\n"; - output << "--BEGIN METADATA --\n" << metadata << "-- END METADATA --\n"; - output << ";)\n"; } - return 0; } diff --git a/test/unit/input/empty_lld.wat b/test/unit/input/empty_lld.wat new file mode 100644 index 000000000..978caab81 --- /dev/null +++ b/test/unit/input/empty_lld.wat @@ -0,0 +1,9 @@ +(module + (global $global$0 (mut i32) (i32.const 66192)) + (global $global$1 i32 (i32.const 652)) + (export "__data_end" (global $global$1)) + (export "main" (func $main)) + (func $main (param $0 i32) (param $1 i32) (result i32) + (i32.const 0) + ) +) diff --git a/test/unit/test_finalize.py b/test/unit/test_finalize.py index ff4eebd9c..b393177bd 100644 --- a/test/unit/test_finalize.py +++ b/test/unit/test_finalize.py @@ -6,10 +6,30 @@ from . import utils class EmscriptenFinalizeTest(utils.BinaryenTestCase): def test_em_asm_mangled_string(self): - input_dir = os.path.dirname(__file__) p = shared.run_process(shared.WASM_EMSCRIPTEN_FINALIZE + [ - os.path.join(input_dir, 'input', 'em_asm_mangled_string.wat'), '-o', os.devnull, '--global-base=1024' + self.input_path('em_asm_mangled_string.wat'), '-o', os.devnull, '--global-base=1024' ], check=False, capture_output=True) self.assertNotEqual(p.returncode, 0) self.assertIn('Fatal: local.get of unknown in arg0 of call to emscripten_asm_const_int (used by EM_ASM* macros) in function main.', p.stderr) self.assertIn('This might be caused by aggressive compiler transformations. Consider using EM_JS instead.', p.stderr) + + def do_output_test(self, args): + # without any output file specified, don't error, don't write the wasm, + # but do emit metadata + p = shared.run_process(shared.WASM_EMSCRIPTEN_FINALIZE + [ + self.input_path('empty_lld.wat'), '--global-base=1024' + ] + args, capture_output=True) + # metadata is always present + self.assertIn('{', p.stdout) + self.assertIn('}', p.stdout) + return p.stdout + + def test_no_output(self): + stdout = self.do_output_test([]) + # module is not present + self.assertNotIn('(module', stdout) + + def test_text_output(self): + stdout = self.do_output_test(['-S']) + # module is present + self.assertIn('(module', stdout) |