diff options
Diffstat (limited to 'src')
-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 |
5 files changed, 62 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(); |