diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 44 | ||||
-rw-r--r-- | src/binaryen-c.h | 19 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 17 | ||||
-rw-r--r-- | src/wasm-features.h | 1 |
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; }; |