diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-08-07 10:38:34 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-09-07 09:54:51 -0700 |
commit | 9d27d6818f83308c4853e3d8870d5b88a374453f (patch) | |
tree | 50c25e5177efb7a8e910e586398aab3cfd1522c7 /src/binaryen-c.cpp | |
parent | 0783d60d9490666ab4b365e738b0132b378c6018 (diff) | |
download | binaryen-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.cpp | 43 |
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"; |