summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2020-02-27 09:55:33 -0800
committerGitHub <noreply@github.com>2020-02-27 09:55:33 -0800
commit2105214971e722525c328a23a5d215789fafb24c (patch)
treecfc35dcc8bc4e1268c88793c7028df33cf09ea73
parentf79faeb14e4da75f131c00c26796ae25ee96a7b7 (diff)
downloadbinaryen-2105214971e722525c328a23a5d215789fafb24c.tar.gz
binaryen-2105214971e722525c328a23a5d215789fafb24c.tar.bz2
binaryen-2105214971e722525c328a23a5d215789fafb24c.zip
Add multivalue feature (#2668)
-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
-rw-r--r--test/binaryen.js/kitchen-sink.js1
-rw-r--r--test/binaryen.js/kitchen-sink.js.txt5
-rw-r--r--test/example/c-api-kitchen-sink.c1
-rw-r--r--test/example/c-api-kitchen-sink.txt5
-rw-r--r--test/unit/test_features.py11
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())