summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2019-04-05 16:08:51 -0700
committerGitHub <noreply@github.com>2019-04-05 16:08:51 -0700
commitfc13d0f3585318ada789b9f27421e667056e9a84 (patch)
tree7d1056029e89823a8c2b291413f68bd4b5e6ed70
parent2129cef6acbbe4acd5fd675fbb00c329e2220a40 (diff)
downloadbinaryen-fc13d0f3585318ada789b9f27421e667056e9a84.tar.gz
binaryen-fc13d0f3585318ada789b9f27421e667056e9a84.tar.bz2
binaryen-fc13d0f3585318ada789b9f27421e667056e9a84.zip
Add feature options to emscripten metadata (#1982)
Emscripten runs wasm-emscripten-finalize before running wasm-opt, so the target features section is stripped out before optimizations are run. One option would have been to add another wasm-opt invocation at the very end to strip the target features section, but dumping the features as metadata avoids the extra tool invocation. In the long run, it would be nice to have only as single binaryen invocation to do all the work that needs doing.
-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
-rw-r--r--test/lld/duplicate_imports.wast.out9
-rw-r--r--test/lld/em_asm.wast.mem.out9
-rw-r--r--test/lld/em_asm.wast.out9
-rw-r--r--test/lld/em_asm_O0.wast.out9
-rw-r--r--test/lld/em_asm_table.wast.out9
-rw-r--r--test/lld/em_js_O0.wast.out9
-rw-r--r--test/lld/hello_world.wast.mem.out9
-rw-r--r--test/lld/hello_world.wast.out9
-rw-r--r--test/lld/init.wast.out9
-rw-r--r--test/lld/recursive.wast.out9
-rw-r--r--test/lld/reserved_func_ptr.wast.out9
-rw-r--r--test/lld/shared.wast.out9
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 --
;)