summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binaryen-c.cpp3
-rw-r--r--src/binaryen-c.h1
-rw-r--r--src/js/binaryen.js-post.js1
-rw-r--r--src/tools/tool-options.h1
-rw-r--r--src/wasm-binary.h1
-rw-r--r--src/wasm-features.h37
-rw-r--r--src/wasm/wasm-binary.cpp4
-rw-r--r--src/wasm/wasm.cpp1
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