diff options
Diffstat (limited to 'src')
-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 |
8 files changed, 22 insertions, 27 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 |