summaryrefslogtreecommitdiff
path: root/src/binaryen-c.cpp
diff options
context:
space:
mode:
authorDaniel Wirtz <dcode@dcode.io>2017-11-21 00:19:12 +0100
committerAlon Zakai <alonzakai@gmail.com>2017-11-20 15:19:12 -0800
commit07c54750eb626ea7434341e439f6cee75efbf4b5 (patch)
treeedfd9c82133ece95fdf702f222cf561afafb1f25 /src/binaryen-c.cpp
parenta6c4f10233c0caeb0503960d90aa36a2dd76ed64 (diff)
downloadbinaryen-07c54750eb626ea7434341e439f6cee75efbf4b5.tar.gz
binaryen-07c54750eb626ea7434341e439f6cee75efbf4b5.tar.bz2
binaryen-07c54750eb626ea7434341e439f6cee75efbf4b5.zip
Add atomic load/store to binaryen-c/.js (#1298)
Diffstat (limited to 'src/binaryen-c.cpp')
-rw-r--r--src/binaryen-c.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index f4084eb82..9b46f0aba 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -732,6 +732,26 @@ BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module) {
return static_cast<Expression*>(ret);
}
+BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenType type, BinaryenExpressionRef ptr) {
+ auto* ret = Builder(*((Module*)module)).makeAtomicLoad(bytes, offset, (Expression*)ptr, WasmType(type));
+
+ if (tracing) {
+ auto id = noteExpression(ret);
+ std::cout << " expressions[" << id << "] = BinaryenAtomicLoad(the_module, " << bytes << ", " << offset << ", " << type << ", expressions[" << expressions[ptr] << "]);\n";
+ }
+
+ return static_cast<Expression*>(ret);
+}
+BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) {
+ auto* ret = Builder(*((Module*)module)).makeAtomicStore(bytes, offset, (Expression*)ptr, (Expression*)value, WasmType(type));
+
+ if (tracing) {
+ auto id = noteExpression(ret);
+ std::cout << " expressions[" << id << "] = BinaryenAtomicStore(the_module, " << bytes << ", " << offset << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[value] << "], " << type << ");\n";
+ }
+
+ return static_cast<Expression*>(ret);
+}
BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) {
auto* ret = Builder(*((Module*)module)).makeAtomicRMW(AtomicRMWOp(op), bytes, offset, (Expression*)ptr, (Expression*)value, WasmType(type));
@@ -1102,7 +1122,9 @@ int BinaryenModuleValidate(BinaryenModuleRef module) {
}
Module* wasm = (Module*)module;
- return WasmValidator().validate(*wasm) ? 1 : 0;
+ // TODO add feature selection support to C API
+ FeatureSet features = Feature::Atomics;
+ return WasmValidator().validate(*wasm, features) ? 1 : 0;
}
void BinaryenModuleOptimize(BinaryenModuleRef module) {