diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/asm2wasm.h | 8 | ||||
-rw-r--r-- | src/tools/asm2wasm.cpp | 7 | ||||
-rw-r--r-- | src/wasm-js.cpp | 2 |
3 files changed, 13 insertions, 4 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h index f78b9df55..00481c9bd 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -380,6 +380,7 @@ public: TrapMode trapMode; PassOptions passOptions; + bool legalizeJavaScriptFFI; bool runOptimizationPasses; bool wasmOnly; @@ -483,7 +484,7 @@ private: } public: - Asm2WasmBuilder(Module& wasm, Asm2WasmPreProcessor& preprocessor, bool debug, TrapMode trapMode, PassOptions passOptions, bool runOptimizationPasses, bool wasmOnly) + Asm2WasmBuilder(Module& wasm, Asm2WasmPreProcessor& preprocessor, bool debug, TrapMode trapMode, PassOptions passOptions, bool legalizeJavaScriptFFI, bool runOptimizationPasses, bool wasmOnly) : wasm(wasm), allocator(wasm.allocator), builder(wasm), @@ -491,6 +492,7 @@ public: debug(debug), trapMode(trapMode), passOptions(passOptions), + legalizeJavaScriptFFI(legalizeJavaScriptFFI), runOptimizationPasses(runOptimizationPasses), wasmOnly(wasmOnly) {} @@ -1395,7 +1397,9 @@ void Asm2WasmBuilder::processAsm(Ref ast) { passRunner.add<FinalizeCalls>(this); passRunner.add<ReFinalize>(); // FinalizeCalls changes call types, need to percolate passRunner.add<AutoDrop>(); // FinalizeCalls may cause us to require additional drops - passRunner.add("legalize-js-interface"); + if (legalizeJavaScriptFFI) { + passRunner.add("legalize-js-interface"); + } if (runOptimizationPasses) { // autodrop can add some garbage passRunner.add("vacuum"); diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp index 4ad5a5814..dd2b6a791 100644 --- a/src/tools/asm2wasm.cpp +++ b/src/tools/asm2wasm.cpp @@ -32,6 +32,7 @@ using namespace wasm; int main(int argc, const char *argv[]) { PassOptions passOptions; + bool legalizeJavaScriptFFI = true; bool runOptimizationPasses = false; Asm2WasmBuilder::TrapMode trapMode = Asm2WasmBuilder::TrapMode::JS; bool wasmOnly = false; @@ -95,6 +96,10 @@ int main(int argc, const char *argv[]) { [&wasmOnly](Options *o, const std::string &) { wasmOnly = true; }) + .add("--no-legalize-javascript-ffi", "-nj", "Do not legalize (i64->i32, f32->f64) the imports and exports for interfacing with JS", Options::Arguments::Zero, + [&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)", Options::Arguments::Zero, [&](Options *o, const std::string &arguments) { passOptions.debugInfo = true; }) @@ -139,7 +144,7 @@ int main(int argc, const char *argv[]) { if (options.debug) std::cerr << "wasming..." << std::endl; Module wasm; wasm.memory.initial = wasm.memory.max = totalMemory / Memory::kPageSize; - Asm2WasmBuilder asm2wasm(wasm, pre, options.debug, trapMode, passOptions, runOptimizationPasses, wasmOnly); + Asm2WasmBuilder asm2wasm(wasm, pre, options.debug, trapMode, passOptions, legalizeJavaScriptFFI, runOptimizationPasses, wasmOnly); asm2wasm.processAsm(asmjs); // import mem init file, if provided diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp index 94404aeb9..dba194ee2 100644 --- a/src/wasm-js.cpp +++ b/src/wasm-js.cpp @@ -80,7 +80,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm2wasm(char *input) { module->memory.max = pre.memoryGrowth ? Address(Memory::kMaxSize) : module->memory.initial; if (wasmJSDebug) std::cerr << "wasming...\n"; - asm2wasm = new Asm2WasmBuilder(*module, pre, debug, Asm2WasmBuilder::TrapMode::JS, PassOptions(), false /* TODO: support optimizing? */, false /* TODO: support asm2wasm-i64? */); + asm2wasm = new Asm2WasmBuilder(*module, pre, debug, Asm2WasmBuilder::TrapMode::JS, PassOptions(), true /* runJSFFIPass */, false /* TODO: support optimizing? */, false /* TODO: support asm2wasm-i64? */); asm2wasm->processAsm(asmjs); } |