summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binaryen-c.cpp44
-rw-r--r--src/binaryen-c.h19
-rw-r--r--src/js/binaryen.js-post.js17
-rw-r--r--src/wasm-features.h1
4 files changed, 78 insertions, 3 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index be06cce83..03c6912f0 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -367,6 +367,30 @@ BinaryenExternalKind BinaryenExternalGlobal(void) {
return static_cast<BinaryenExternalKind>(ExternalKind::Global);
}
+// Features
+
+BinaryenFeatures BinaryenFeatureAtomics(void) {
+ return static_cast<BinaryenFeatures>(FeatureSet::Feature::Atomics);
+}
+BinaryenFeatures BinaryenFeatureBulkMemory(void) {
+ return static_cast<BinaryenFeatures>(FeatureSet::Feature::BulkMemory);
+}
+BinaryenFeatures BinaryenFeatureMutableGlobals(void) {
+ return static_cast<BinaryenFeatures>(FeatureSet::Feature::MutableGlobals);
+}
+BinaryenFeatures BinaryenFeatureNontrappingFPToInt(void) {
+ return static_cast<BinaryenFeatures>(FeatureSet::Feature::TruncSat);
+}
+BinaryenFeatures BinaryenFeatureSignExt(void) {
+ return static_cast<BinaryenFeatures>(FeatureSet::Feature::SignExt);
+}
+BinaryenFeatures BinaryenFeatureSIMD128(void) {
+ return static_cast<BinaryenFeatures>(FeatureSet::Feature::SIMD);
+}
+BinaryenFeatures BinaryenFeatureExceptionHandling(void) {
+ return static_cast<BinaryenFeatures>(FeatureSet::Feature::ExceptionHandling);
+}
+
// Modules
BinaryenModuleRef BinaryenModuleCreate(void) {
@@ -3053,6 +3077,24 @@ void BinaryenSetStart(BinaryenModuleRef module, BinaryenFunctionRef start) {
wasm->addStart(((Function*)start)->name);
}
+// Features
+
+BinaryenFeatures BinaryenGetFeatures(BinaryenModuleRef module) {
+ if (tracing) {
+ std::cout << " BinaryenGetFeatures(the_module);\n";
+ }
+ auto* wasm = static_cast<Module*>(module);
+ return wasm->features.features;
+}
+
+void BinaryenSetFeatures(BinaryenModuleRef module, BinaryenFeatures features) {
+ if (tracing) {
+ std::cout << " BinaryenSetFeatures(the_module, " << features << ");\n";
+ }
+ auto* wasm = static_cast<Module*>(module);
+ wasm->features.features = features;
+}
+
//
// ========== Module Operations ==========
//
@@ -3106,8 +3148,6 @@ int BinaryenModuleValidate(BinaryenModuleRef module) {
}
Module* wasm = (Module*)module;
- // TODO(tlively): Add C API for managing features
- wasm->features = FeatureSet::All;
return WasmValidator().validate(*wasm) ? 1 : 0;
}
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index 820b23cca..19434692b 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -137,6 +137,19 @@ BinaryenExternalKind BinaryenExternalTable(void);
BinaryenExternalKind BinaryenExternalMemory(void);
BinaryenExternalKind BinaryenExternalGlobal(void);
+// Features. Call to get the value of each; you can cache them. Use bitwise
+// operators to combine and test particular features.
+
+typedef uint32_t BinaryenFeatures;
+
+BinaryenFeatures BinaryenFeatureAtomics(void);
+BinaryenFeatures BinaryenFeatureBulkMemory(void);
+BinaryenFeatures BinaryenFeatureMutableGlobals(void);
+BinaryenFeatures BinaryenFeatureNontrappingFPToInt(void);
+BinaryenFeatures BinaryenFeatureSignExt(void);
+BinaryenFeatures BinaryenFeatureSIMD128(void);
+BinaryenFeatures BinaryenFeatureExceptionHandling(void);
+
// Modules
//
// Modules contain lists of functions, imports, exports, function types. The
@@ -929,6 +942,12 @@ void BinaryenSetMemory(BinaryenModuleRef module,
void BinaryenSetStart(BinaryenModuleRef module, BinaryenFunctionRef start);
+// Features
+
+// These control what features are allowed when validation and in passes.
+BinaryenFeatures BinaryenGetFeatures(BinaryenModuleRef module);
+void BinaryenSetFeatures(BinaryenModuleRef module, BinaryenFeatures features);
+
//
// ========== Module Operations ==========
//
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 8aa28a08c..fe0594b91 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -85,6 +85,17 @@ Module['ExternalTable'] = Module['_BinaryenExternalTable']();
Module['ExternalMemory'] = Module['_BinaryenExternalMemory']();
Module['ExternalGlobal'] = Module['_BinaryenExternalGlobal']();
+// Features
+Module['Features'] = {
+ 'Atomics': Module['_BinaryenFeatureAtomics'](),
+ 'BulkMemory': Module['_BinaryenFeatureBulkMemory'](),
+ 'MutableGlobals': Module['_BinaryenFeatureMutableGlobals'](),
+ 'NontrappingFPToInt': Module['_BinaryenFeatureNontrappingFPToInt'](),
+ 'SignExt': Module['_BinaryenFeatureSignExt'](),
+ 'SIMD128': Module['_BinaryenFeatureSIMD128'](),
+ 'ExceptionHandling': Module['_BinaryenFeatureExceptionHandling'](),
+};
+
// Operations
Module['ClzInt32'] = Module['_BinaryenClzInt32']();
Module['CtzInt32'] = Module['_BinaryenCtzInt32']();
@@ -1866,6 +1877,12 @@ function wrapModule(module, self) {
self['setStart'] = function(start) {
return Module['_BinaryenSetStart'](module, start);
};
+ self['getFeatures'] = function() {
+ return Module['_BinaryenGetFeatures'](module);
+ };
+ self['setFeatures'] = function(features) {
+ Module['_BinaryenSetFeatures'](module, features);
+ };
self['emitText'] = function() {
var old = out;
var ret = '';
diff --git a/src/wasm-features.h b/src/wasm-features.h
index 340ca86ae..325f413a1 100644
--- a/src/wasm-features.h
+++ b/src/wasm-features.h
@@ -128,7 +128,6 @@ struct FeatureSet {
return *this;
}
-private:
uint32_t features;
};