diff options
-rw-r--r-- | src/tools/tool-options.h | 29 | ||||
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 18 | ||||
-rw-r--r-- | src/wasm-emscripten.h | 3 | ||||
-rw-r--r-- | src/wasm-features.h | 25 | ||||
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 12 | ||||
-rw-r--r-- | test/lld/duplicate_imports.wast.out | 9 | ||||
-rw-r--r-- | test/lld/em_asm.wast.mem.out | 9 | ||||
-rw-r--r-- | test/lld/em_asm.wast.out | 9 | ||||
-rw-r--r-- | test/lld/em_asm_O0.wast.out | 9 | ||||
-rw-r--r-- | test/lld/em_asm_table.wast.out | 9 | ||||
-rw-r--r-- | test/lld/em_js_O0.wast.out | 9 | ||||
-rw-r--r-- | test/lld/hello_world.wast.mem.out | 9 | ||||
-rw-r--r-- | test/lld/hello_world.wast.out | 9 | ||||
-rw-r--r-- | test/lld/init.wast.out | 9 | ||||
-rw-r--r-- | test/lld/recursive.wast.out | 9 | ||||
-rw-r--r-- | test/lld/reserved_func_ptr.wast.out | 9 | ||||
-rw-r--r-- | test/lld/shared.wast.out | 9 |
17 files changed, 170 insertions, 25 deletions
diff --git a/src/tools/tool-options.h b/src/tools/tool-options.h index 5b09b8d23..6c2613407 100644 --- a/src/tools/tool-options.h +++ b/src/tools/tool-options.h @@ -60,19 +60,12 @@ struct ToolOptions : public Options { disabledFeatures.makeMVP(); }); (*this) - .addFeature("sign-ext", "sign extension operations", - FeatureSet::SignExt) - .addFeature("threads", "atomic operations", - FeatureSet::Atomics) - .addFeature("mutable-globals", "mutable globals", - FeatureSet::MutableGlobals) - .addFeature("nontrapping-float-to-int", - "nontrapping float-to-int operations", - FeatureSet::TruncSat) - .addFeature("simd", "SIMD operations and types", - FeatureSet::SIMD) - .addFeature("bulk-memory", "bulk memory operations", - FeatureSet::BulkMemory) + .addFeature(FeatureSet::SignExt, "sign extension operations") + .addFeature(FeatureSet::Atomics, "atomic operations") + .addFeature(FeatureSet::MutableGlobals, "mutable globals") + .addFeature(FeatureSet::TruncSat, "nontrapping float-to-int operations") + .addFeature(FeatureSet::SIMD, "SIMD operations and types") + .addFeature(FeatureSet::BulkMemory, "bulk memory operations") .add("--no-validation", "-n", "Disables validation, assumes inputs are correct", Options::Arguments::Zero, @@ -81,11 +74,11 @@ struct ToolOptions : public Options { }); } - ToolOptions& addFeature(const std::string& name, - const std::string& description, - FeatureSet::Feature feature) { + ToolOptions& addFeature(FeatureSet::Feature feature, + const std::string& description) { + (*this) - .add(std::string("--enable-") + name, "", + .add(std::string("--enable-") + FeatureSet::toString(feature), "", std::string("Enable ") + description, Arguments::Zero, [=](Options*, const std::string&) { hasFeatureOptions = true; @@ -94,7 +87,7 @@ struct ToolOptions : public Options { disabledFeatures.set(feature, false); }) - .add(std::string("--disable-") + name, "", + .add(std::string("--disable-") + FeatureSet::toString(feature), "", std::string("Disable ") + description, Arguments::Zero, [=](Options*, const std::string&) { hasFeatureOptions = true; diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 0ed0e0857..e39d9e2d6 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -23,8 +23,8 @@ #include "ir/trapping.h" #include "support/colors.h" -#include "support/command-line.h" #include "support/file.h" +#include "tool-options.h" #include "wasm-binary.h" #include "wasm-emscripten.h" #include "wasm-io.h" @@ -50,8 +50,8 @@ int main(int argc, const char *argv[]) { bool legalizeJavaScriptFFI = true; uint64_t globalBase = INVALID_BASE; uint64_t initialStackPointer = INVALID_BASE; - Options options("wasm-emscripten-finalize", - "Performs Emscripten-specific transforms on .wasm files"); + ToolOptions options("wasm-emscripten-finalize", + "Performs Emscripten-specific transforms on .wasm files"); options .add("--output", "-o", "Output file", Options::Arguments::One, @@ -130,6 +130,8 @@ int main(int argc, const char *argv[]) { Fatal() << "error in parsing wasm source map"; } + options.calculateFeatures(wasm); + if (options.debug) { std::cerr << "Module before:\n"; WasmPrinter::printModule(&wasm, std::cerr); @@ -204,12 +206,11 @@ int main(int argc, const char *argv[]) { legalizeJavaScriptFFI ? ABI::LegalizationLevel::Full : ABI::LegalizationLevel::Minimal )); - passRunner.add("strip-target-features"); passRunner.run(); } // Substantial changes to the wasm are done, enough to create the metadata. - std::string metadata = generator.generateEmscriptenMetadata(dataSize, initializerFunctions); + std::string metadata = generator.generateEmscriptenMetadata(dataSize, initializerFunctions, options.passOptions.features); // Finally, separate out data segments if relevant (they may have been needed // for metadata). @@ -226,6 +227,13 @@ int main(int argc, const char *argv[]) { WasmPrinter::printModule(&wasm, std::cerr); } + // Strip target features section (its information is in the metadata) + { + PassRunner passRunner(&wasm); + passRunner.add("strip-target-features"); + passRunner.run(); + } + auto outputBinaryFlag = emitBinary ? Flags::Binary : Flags::Text; Output output(outfile, outputBinaryFlag, Flags::Release); ModuleWriter writer; diff --git a/src/wasm-emscripten.h b/src/wasm-emscripten.h index 67ba408f5..36c730be8 100644 --- a/src/wasm-emscripten.h +++ b/src/wasm-emscripten.h @@ -49,7 +49,8 @@ public: void replaceStackPointerGlobal(); std::string generateEmscriptenMetadata( - Address staticBump, std::vector<Name> const& initializerFunctions); + Address staticBump, std::vector<Name> const& initializerFunctions, + FeatureSet features); void fixInvokeFunctionNames(); diff --git a/src/wasm-features.h b/src/wasm-features.h index 49f49db09..6c58f1642 100644 --- a/src/wasm-features.h +++ b/src/wasm-features.h @@ -18,6 +18,9 @@ #define wasm_features_h #include <stdint.h> +#include <string> + +#include "compiler-support.h" struct FeatureSet { enum Feature : uint32_t { @@ -31,6 +34,18 @@ struct FeatureSet { All = Atomics | MutableGlobals | TruncSat | SIMD | BulkMemory | SignExt }; + static std::string toString(Feature f) { + switch (f) { + case Atomics: return "threads"; + case MutableGlobals: return "mutable-globals"; + case TruncSat: return "nontrapping-float-to-int"; + case SIMD: return "simd"; + case BulkMemory: return "bulk-memory"; + case SignExt: return "sign-ext"; + default: WASM_UNREACHABLE(); + } + } + FeatureSet() : features(MVP) {} FeatureSet(uint32_t features) : features(features) {} @@ -59,6 +74,16 @@ struct FeatureSet { features = features & ~other.features & All; } + template<typename F> + void iterFeatures(F f) { + if (hasAtomics()) f(Atomics); + if (hasMutableGlobals()) f(MutableGlobals); + if (hasTruncSat()) f(TruncSat); + if (hasSIMD()) f(SIMD); + if (hasBulkMemory()) f(BulkMemory); + if (hasSignExt()) f(SignExt); + } + bool operator<=(const FeatureSet& other) { return !(features & ~other.features); } diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index 0c02c758e..3f521caf9 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -789,7 +789,8 @@ void printSet(std::ostream& o, C& c) { } std::string EmscriptenGlueGenerator::generateEmscriptenMetadata( - Address staticBump, std::vector<Name> const& initializerFunctions) { + Address staticBump, std::vector<Name> const& initializerFunctions, + FeatureSet features) { bool commaFirst; auto nextElement = [&commaFirst]() { if (commaFirst) { @@ -926,6 +927,15 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata( } }); meta << "\n ]\n"; + + meta << " \"features\": ["; + commaFirst = true; + meta << nextElement() << "\"--mvp-features\""; + features.iterFeatures([&](FeatureSet::Feature f) { + meta << nextElement() << "\"--enable-" << FeatureSet::toString(f) << '"'; + }); + meta << "\n ]\n"; + meta << "}\n"; return meta.str(); diff --git a/test/lld/duplicate_imports.wast.out b/test/lld/duplicate_imports.wast.out index e7d36127f..9fdab56a9 100644 --- a/test/lld/duplicate_imports.wast.out +++ b/test/lld/duplicate_imports.wast.out @@ -137,6 +137,15 @@ "invokeFuncs": [ "invoke_ffd" ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/em_asm.wast.mem.out b/test/lld/em_asm.wast.mem.out index 647342134..f10c49c89 100644 --- a/test/lld/em_asm.wast.mem.out +++ b/test/lld/em_asm.wast.mem.out @@ -261,6 +261,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/em_asm.wast.out b/test/lld/em_asm.wast.out index 5e293f541..46b86987d 100644 --- a/test/lld/em_asm.wast.out +++ b/test/lld/em_asm.wast.out @@ -262,6 +262,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/em_asm_O0.wast.out b/test/lld/em_asm_O0.wast.out index 099da3746..10ce9e0df 100644 --- a/test/lld/em_asm_O0.wast.out +++ b/test/lld/em_asm_O0.wast.out @@ -122,6 +122,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/em_asm_table.wast.out b/test/lld/em_asm_table.wast.out index 06cfc9fc6..bc2fb60f9 100644 --- a/test/lld/em_asm_table.wast.out +++ b/test/lld/em_asm_table.wast.out @@ -92,6 +92,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/em_js_O0.wast.out b/test/lld/em_js_O0.wast.out index 385daf8d5..85411c495 100644 --- a/test/lld/em_js_O0.wast.out +++ b/test/lld/em_js_O0.wast.out @@ -72,6 +72,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/hello_world.wast.mem.out b/test/lld/hello_world.wast.mem.out index ce0c93510..c3826ecb9 100644 --- a/test/lld/hello_world.wast.mem.out +++ b/test/lld/hello_world.wast.mem.out @@ -97,6 +97,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/hello_world.wast.out b/test/lld/hello_world.wast.out index 20539c0d5..18a21e2eb 100644 --- a/test/lld/hello_world.wast.out +++ b/test/lld/hello_world.wast.out @@ -98,6 +98,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/init.wast.out b/test/lld/init.wast.out index e9ca29152..9244da718 100644 --- a/test/lld/init.wast.out +++ b/test/lld/init.wast.out @@ -109,6 +109,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/recursive.wast.out b/test/lld/recursive.wast.out index be0a0f007..bce622b93 100644 --- a/test/lld/recursive.wast.out +++ b/test/lld/recursive.wast.out @@ -155,6 +155,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/reserved_func_ptr.wast.out b/test/lld/reserved_func_ptr.wast.out index 86d61bc82..e777b2af5 100644 --- a/test/lld/reserved_func_ptr.wast.out +++ b/test/lld/reserved_func_ptr.wast.out @@ -192,6 +192,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) diff --git a/test/lld/shared.wast.out b/test/lld/shared.wast.out index 67f4739dd..2825913a3 100644 --- a/test/lld/shared.wast.out +++ b/test/lld/shared.wast.out @@ -72,6 +72,15 @@ }, "invokeFuncs": [ ] + "features": [ + "--mvp-features", + "--enable-threads", + "--enable-mutable-globals", + "--enable-nontrapping-float-to-int", + "--enable-simd", + "--enable-bulk-memory", + "--enable-sign-ext" + ] } -- END METADATA -- ;) |