diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2020-02-27 09:55:33 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-27 09:55:33 -0800 |
commit | 2105214971e722525c328a23a5d215789fafb24c (patch) | |
tree | cfc35dcc8bc4e1268c88793c7028df33cf09ea73 | |
parent | f79faeb14e4da75f131c00c26796ae25ee96a7b7 (diff) | |
download | binaryen-2105214971e722525c328a23a5d215789fafb24c.tar.gz binaryen-2105214971e722525c328a23a5d215789fafb24c.tar.bz2 binaryen-2105214971e722525c328a23a5d215789fafb24c.zip |
Add multivalue feature (#2668)
-rw-r--r-- | src/binaryen-c.cpp | 3 | ||||
-rw-r--r-- | src/binaryen-c.h | 1 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 1 | ||||
-rw-r--r-- | src/tools/tool-options.h | 1 | ||||
-rw-r--r-- | src/wasm-binary.h | 1 | ||||
-rw-r--r-- | src/wasm-features.h | 37 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 4 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 1 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js | 1 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js.txt | 5 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 1 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 5 | ||||
-rw-r--r-- | test/unit/test_features.py | 11 |
13 files changed, 36 insertions, 36 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index b9ac3abf9..79202eeaa 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -482,6 +482,9 @@ BinaryenFeatures BinaryenFeatureTailCall(void) { BinaryenFeatures BinaryenFeatureReferenceTypes(void) { return static_cast<BinaryenFeatures>(FeatureSet::ReferenceTypes); } +BinaryenFeatures BinaryenFeatureMultivalue(void) { + return static_cast<BinaryenFeatures>(FeatureSet::Multivalue); +} BinaryenFeatures BinaryenFeatureAll(void) { return static_cast<BinaryenFeatures>(FeatureSet::All); } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index fa6398fea..443df5623 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -195,6 +195,7 @@ BINARYEN_API BinaryenFeatures BinaryenFeatureSIMD128(void); BINARYEN_API BinaryenFeatures BinaryenFeatureExceptionHandling(void); BINARYEN_API BinaryenFeatures BinaryenFeatureTailCall(void); BINARYEN_API BinaryenFeatures BinaryenFeatureReferenceTypes(void); +BINARYEN_API BinaryenFeatures BinaryenFeatureMultivalue(void); BINARYEN_API BinaryenFeatures BinaryenFeatureAll(void); // Modules diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 33f94939e..39e23633b 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -124,6 +124,7 @@ function initializeConstants() { 'ExceptionHandling', 'TailCall', 'ReferenceTypes', + 'Multivalue', 'All' ].forEach(function(name) { Module['Features'][name] = Module['_BinaryenFeature' + name](); diff --git a/src/tools/tool-options.h b/src/tools/tool-options.h index 46720d203..6f0592a45 100644 --- a/src/tools/tool-options.h +++ b/src/tools/tool-options.h @@ -79,6 +79,7 @@ struct ToolOptions : public Options { "exception handling operations") .addFeature(FeatureSet::TailCall, "tail call operations") .addFeature(FeatureSet::ReferenceTypes, "reference types") + .addFeature(FeatureSet::Multivalue, "multivalue functions") .add("--no-validation", "-n", "Disables validation, assumes inputs are correct", diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 0dd8be61a..a2a92c752 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -375,6 +375,7 @@ extern const char* SIMD128Feature; extern const char* ExceptionHandlingFeature; extern const char* TailCallFeature; extern const char* ReferenceTypesFeature; +extern const char* MultivalueFeature; enum Subsection { NameFunction = 1, diff --git a/src/wasm-features.h b/src/wasm-features.h index e52c999c1..c77d0a1e6 100644 --- a/src/wasm-features.h +++ b/src/wasm-features.h @@ -35,7 +35,8 @@ struct FeatureSet { ExceptionHandling = 1 << 6, TailCall = 1 << 7, ReferenceTypes = 1 << 8, - All = (1 << 9) - 1 + Multivalue = 1 << 9, + All = (1 << 10) - 1 }; static std::string toString(Feature f) { @@ -58,6 +59,8 @@ struct FeatureSet { return "tail-call"; case ReferenceTypes: return "reference-types"; + case Multivalue: + return "multivalue"; default: WASM_UNREACHABLE("unexpected feature"); } @@ -80,6 +83,7 @@ struct FeatureSet { } bool hasTailCall() const { return (features & TailCall) != 0; } bool hasReferenceTypes() const { return (features & ReferenceTypes) != 0; } + bool hasMultivalue() const { return (features & Multivalue) != 0; } bool hasAll() const { return (features & All) != 0; } void makeMVP() { features = MVP; } @@ -95,6 +99,7 @@ struct FeatureSet { void setExceptionHandling(bool v = true) { set(ExceptionHandling, v); } void setTailCall(bool v = true) { set(TailCall, v); } void setReferenceTypes(bool v = true) { set(ReferenceTypes, v); } + void setMultivalue(bool v = true) { set(Multivalue, v); } void setAll(bool v = true) { features = v ? All : MVP; } void enable(const FeatureSet& other) { features |= other.features; } @@ -103,32 +108,10 @@ struct FeatureSet { } template<typename F> void iterFeatures(F f) { - if (hasAtomics()) { - f(Atomics); - } - if (hasBulkMemory()) { - f(BulkMemory); - } - if (hasExceptionHandling()) { - f(ExceptionHandling); - } - if (hasMutableGlobals()) { - f(MutableGlobals); - } - if (hasTruncSat()) { - f(TruncSat); - } - if (hasSignExt()) { - f(SignExt); - } - if (hasSIMD()) { - f(SIMD); - } - if (hasTailCall()) { - f(TailCall); - } - if (hasReferenceTypes()) { - f(ReferenceTypes); + for (uint32_t feature = MVP + 1; feature < All; feature <<= 1) { + if (has(feature)) { + f(static_cast<Feature>(feature)); + } } } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 7dc904cd9..42b48516c 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -686,6 +686,8 @@ void WasmBinaryWriter::writeFeaturesSection() { return BinaryConsts::UserSections::TailCallFeature; case FeatureSet::ReferenceTypes: return BinaryConsts::UserSections::ReferenceTypesFeature; + case FeatureSet::Multivalue: + return BinaryConsts::UserSections::MultivalueFeature; default: WASM_UNREACHABLE("unexpected feature flag"); } @@ -2105,6 +2107,8 @@ void WasmBinaryBuilder::readFeatures(size_t payloadLen) { wasm.features.setTailCall(); } else if (name == BinaryConsts::UserSections::ReferenceTypesFeature) { wasm.features.setReferenceTypes(); + } else if (name == BinaryConsts::UserSections::MultivalueFeature) { + wasm.features.setMultivalue(); } } } diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index a3dc80896..f8874da01 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -42,6 +42,7 @@ const char* SignExtFeature = "sign-ext"; const char* SIMD128Feature = "simd128"; const char* TailCallFeature = "tail-call"; const char* ReferenceTypesFeature = "reference-types"; +const char* MultivalueFeature = "multivalue"; } // namespace UserSections } // namespace BinaryConsts diff --git a/test/binaryen.js/kitchen-sink.js b/test/binaryen.js/kitchen-sink.js index 95865566a..860361084 100644 --- a/test/binaryen.js/kitchen-sink.js +++ b/test/binaryen.js/kitchen-sink.js @@ -97,6 +97,7 @@ function test_features() { console.log("Features.ExceptionHandling: " + binaryen.Features.ExceptionHandling); console.log("Features.TailCall: " + binaryen.Features.TailCall); console.log("Features.ReferenceTypes: " + binaryen.Features.ReferenceTypes); + console.log("Features.Multivalue: " + binaryen.Features.Multivalue); console.log("Features.All: " + binaryen.Features.All); } diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt index 00e5710a9..66a4d5185 100644 --- a/test/binaryen.js/kitchen-sink.js.txt +++ b/test/binaryen.js/kitchen-sink.js.txt @@ -1836,7 +1836,7 @@ getExpressionInfo(f64.const)={"id":14,"type":5,"value":9.5} } BinaryenSetStart(the_module, functions[1]); BinaryenModuleAutoDrop(the_module); - BinaryenModuleSetFeatures(the_module, 511); + BinaryenModuleSetFeatures(the_module, 1023); BinaryenModuleGetFeatures(the_module); BinaryenModulePrint(the_module); (module @@ -6282,7 +6282,8 @@ Features.SIMD128: 8 Features.ExceptionHandling: 64 Features.TailCall: 128 Features.ReferenceTypes: 256 -Features.All: 511 +Features.Multivalue: 512 +Features.All: 1023 InvalidId: 0 BlockId: 1 IfId: 2 diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index 67f7e0642..f054b5710 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -246,6 +246,7 @@ void test_features() { printf("BinaryenFeatureExceptionHandling: %d\n", BinaryenFeatureExceptionHandling()); printf("BinaryenFeatureTailCall: %d\n", BinaryenFeatureTailCall()); printf("BinaryenFeatureReferenceTypes: %d\n", BinaryenFeatureReferenceTypes()); + printf("BinaryenFeatureMultivalue: %d\n", BinaryenFeatureMultivalue()); printf("BinaryenFeatureAll: %d\n", BinaryenFeatureAll()); } diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index 1d3ee1dc2..7dd24c1eb 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -1789,7 +1789,7 @@ int main() { } BinaryenSetStart(the_module, functions[1]); BinaryenModuleAutoDrop(the_module); - BinaryenModuleSetFeatures(the_module, 511); + BinaryenModuleSetFeatures(the_module, 1023); BinaryenModuleGetFeatures(the_module); BinaryenModuleValidate(the_module); BinaryenModulePrint(the_module); @@ -4490,7 +4490,8 @@ BinaryenFeatureSIMD128: 8 BinaryenFeatureExceptionHandling: 64 BinaryenFeatureTailCall: 128 BinaryenFeatureReferenceTypes: 256 -BinaryenFeatureAll: 511 +BinaryenFeatureMultivalue: 512 +BinaryenFeatureAll: 1023 (f32.neg (f32.const -33.61199951171875) ) diff --git a/test/unit/test_features.py b/test/unit/test_features.py index e77468366..db17c7f9d 100644 --- a/test/unit/test_features.py +++ b/test/unit/test_features.py @@ -275,7 +275,7 @@ class TargetFeaturesSectionTest(utils.BinaryenTestCase): self.assertIn('all used features should be allowed', p.stderr) def test_explicit_detect_features(self): - self.check_features('signext_target_feature.wasm', ['sign-ext', 'simd'], + self.check_features('signext_target_feature.wasm', ['simd', 'sign-ext'], opts=['-mvp', '--detect-features', '--enable-simd']) def test_emit_all_features(self): @@ -291,12 +291,13 @@ class TargetFeaturesSectionTest(utils.BinaryenTestCase): self.assertEqual(p2.returncode, 0) self.assertEqual([ '--enable-threads', - '--enable-bulk-memory', - '--enable-exception-handling', '--enable-mutable-globals', '--enable-nontrapping-float-to-int', - '--enable-sign-ext', '--enable-simd', + '--enable-bulk-memory', + '--enable-sign-ext', + '--enable-exception-handling', '--enable-tail-call', - '--enable-reference-types' + '--enable-reference-types', + '--enable-multivalue' ], p2.stdout.split()) |