diff options
author | Alon Zakai <alonzakai@gmail.com> | 2019-01-29 12:39:02 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-29 12:39:02 -0800 |
commit | 5f1afa58d22dce1088c63eff690283d8c615feee (patch) | |
tree | 6c59a39af79f789f1c65d00c72a960f222b9f845 /src/tools | |
parent | 5bfb98b97c18342d851d2e0841a3091ae671f88c (diff) | |
download | binaryen-5f1afa58d22dce1088c63eff690283d8c615feee.tar.gz binaryen-5f1afa58d22dce1088c63eff690283d8c615feee.tar.bz2 binaryen-5f1afa58d22dce1088c63eff690283d8c615feee.zip |
wasm-emscripten-finalize: Emit illegal dynCalls, and legalize them (#1890)
Before this, we just did not emit illegal dynCalls. This was wrong as we do need them (e.g. if a function with a setjmp call calls a function with an i64 param - we'll have an invoke with that signature there). We just need to legalize them. This fixes that by first emitting them, and second by running legalization late, after dynCalls have been generated, so it legalizes them too.
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 5c2e37ac3..d0b664c0c 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -173,17 +173,6 @@ int main(int argc, const char *argv[]) { EmscriptenGlueGenerator generator(wasm); generator.fixInvokeFunctionNames(); - { - PassRunner passRunner(&wasm); - passRunner.setDebug(options.debug); - passRunner.setDebugInfo(debugInfo); - passRunner.add(ABI::getLegalizationPass( - legalizeJavaScriptFFI ? ABI::LegalizationLevel::Full - : ABI::LegalizationLevel::Minimal - )); - passRunner.run(); - } - std::vector<Name> initializerFunctions; // The names of standard imports/exports used by lld doesn't quite match that @@ -215,12 +204,26 @@ int main(int argc, const char *argv[]) { generator.generateDynCallThunks(); generator.generateJSCallThunks(numReservedFunctionPointers); - std::string metadata = generator.generateEmscriptenMetadata(dataSize, initializerFunctions, numReservedFunctionPointers); if (!dataSegmentFile.empty()) { Output memInitFile(dataSegmentFile, Flags::Binary, Flags::Release); generator.separateDataSegments(&memInitFile); } + // Finally, legalize the wasm. + { + PassRunner passRunner(&wasm); + passRunner.setDebug(options.debug); + passRunner.setDebugInfo(debugInfo); + passRunner.add(ABI::getLegalizationPass( + legalizeJavaScriptFFI ? ABI::LegalizationLevel::Full + : ABI::LegalizationLevel::Minimal + )); + passRunner.run(); + } + + // All changes to the wasm are done, create the metadata. + std::string metadata = generator.generateEmscriptenMetadata(dataSize, initializerFunctions, numReservedFunctionPointers); + if (options.debug) { std::cerr << "Module after:\n"; WasmPrinter::printModule(&wasm, std::cerr); |