summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/tool-options.h29
-rw-r--r--src/tools/wasm-emscripten-finalize.cpp18
-rw-r--r--src/wasm-emscripten.h3
-rw-r--r--src/wasm-features.h25
-rw-r--r--src/wasm/wasm-emscripten.cpp12
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();