summaryrefslogtreecommitdiff
path: root/src/binaryen-c.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-08-07 10:38:34 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-09-07 09:54:51 -0700
commit9d27d6818f83308c4853e3d8870d5b88a374453f (patch)
tree50c25e5177efb7a8e910e586398aab3cfd1522c7 /src/binaryen-c.cpp
parent0783d60d9490666ab4b365e738b0132b378c6018 (diff)
downloadbinaryen-9d27d6818f83308c4853e3d8870d5b88a374453f.tar.gz
binaryen-9d27d6818f83308c4853e3d8870d5b88a374453f.tar.bz2
binaryen-9d27d6818f83308c4853e3d8870d5b88a374453f.zip
add drop and tee expressions
Diffstat (limited to 'src/binaryen-c.cpp')
-rw-r--r--src/binaryen-c.cpp43
1 files changed, 41 insertions, 2 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 83c626eb1..71c6cad80 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -488,6 +488,21 @@ BinaryenExpressionRef BinaryenSetLocal(BinaryenModuleRef module, BinaryenIndex i
ret->index = index;
ret->value = (Expression*)value;
+ ret->setTee(false);
+ ret->finalize();
+ return static_cast<Expression*>(ret);
+}
+BinaryenExpressionRef BinaryenTeeLocal(BinaryenModuleRef module, BinaryenIndex index, BinaryenExpressionRef value) {
+ auto* ret = ((Module*)module)->allocator.alloc<SetLocal>();
+
+ if (tracing) {
+ auto id = noteExpression(ret);
+ std::cout << " expressions[" << id << "] = BinaryenTeeLocal(the_module, " << index << ", expressions[" << expressions[value] << "]);\n";
+ }
+
+ ret->index = index;
+ ret->value = (Expression*)value;
+ ret->setTee(true);
ret->finalize();
return static_cast<Expression*>(ret);
}
@@ -508,12 +523,12 @@ BinaryenExpressionRef BinaryenLoad(BinaryenModuleRef module, uint32_t bytes, int
ret->finalize();
return static_cast<Expression*>(ret);
}
-BinaryenExpressionRef BinaryenStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, uint32_t align, BinaryenExpressionRef ptr, BinaryenExpressionRef value) {
+BinaryenExpressionRef BinaryenStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, uint32_t align, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) {
auto* ret = ((Module*)module)->allocator.alloc<Store>();
if (tracing) {
auto id = noteExpression(ret);
- std::cout << " expressions[" << id << "] = BinaryenStore(the_module, " << bytes << ", " << offset << ", " << align << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[value] << "]);\n";
+ std::cout << " expressions[" << id << "] = BinaryenStore(the_module, " << bytes << ", " << offset << ", " << align << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[value] << "], " << type << ");\n";
}
ret->bytes = bytes;
@@ -521,6 +536,7 @@ BinaryenExpressionRef BinaryenStore(BinaryenModuleRef module, uint32_t bytes, ui
ret->align = align ? align : bytes;
ret->ptr = (Expression*)ptr;
ret->value = (Expression*)value;
+ ret->valueType = WasmType(type);
ret->finalize();
return static_cast<Expression*>(ret);
}
@@ -584,6 +600,18 @@ BinaryenExpressionRef BinaryenSelect(BinaryenModuleRef module, BinaryenExpressio
ret->finalize();
return static_cast<Expression*>(ret);
}
+BinaryenExpressionRef BinaryenDrop(BinaryenModuleRef module, BinaryenExpressionRef value) {
+ auto* ret = ((Module*)module)->allocator.alloc<Drop>();
+
+ if (tracing) {
+ auto id = noteExpression(ret);
+ std::cout << " expressions[" << id << "] = BinaryenDrop(the_module, expressions[" << expressions[value] << "]);\n";
+ }
+
+ ret->value = (Expression*)value;
+ ret->finalize();
+ return static_cast<Expression*>(ret);
+}
BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module, BinaryenExpressionRef value) {
auto* ret = Builder(*((Module*)module)).makeReturn((Expression*)value);
@@ -829,6 +857,17 @@ void BinaryenModuleOptimize(BinaryenModuleRef module) {
passRunner.run();
}
+void BinaryenModuleAutoDrop(BinaryenModuleRef module) {
+ if (tracing) {
+ std::cout << " BinaryenModuleAutoDrop(the_module);\n";
+ }
+
+ Module* wasm = (Module*)module;
+ PassRunner passRunner(wasm);
+ passRunner.add<AutoDrop>();
+ passRunner.run();
+}
+
size_t BinaryenModuleWrite(BinaryenModuleRef module, char* output, size_t outputSize) {
if (tracing) {
std::cout << " // BinaryenModuleWrite\n";