diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-05-05 09:20:41 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-05-05 09:20:41 -0700 |
commit | f85e310924535da09822f3d43aeee9265eb12760 (patch) | |
tree | b78e5f471fd284710032762927d719e98921e2fc /src/binaryen-c.cpp | |
parent | 2811727a118e92e6b7ef293458f9bab1cf5dacdc (diff) | |
download | binaryen-f85e310924535da09822f3d43aeee9265eb12760.tar.gz binaryen-f85e310924535da09822f3d43aeee9265eb12760.tar.bz2 binaryen-f85e310924535da09822f3d43aeee9265eb12760.zip |
Import emscripten's relooper, port it to the binaryen AST, and provide a C API (#434)
also ignore libstdc++ bug in ubsan
Diffstat (limited to 'src/binaryen-c.cpp')
-rw-r--r-- | src/binaryen-c.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 35baa8c35..b2c695ec0 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -22,6 +22,7 @@ #include "wasm.h" #include "wasm-builder.h" #include "wasm-printing.h" +#include "cfg/Relooper.h" using namespace wasm; @@ -383,4 +384,47 @@ void BinaryenModulePrint(BinaryenModuleRef module) { WasmPrinter::printModule((Module*)module); } +// +// ========== CFG / Relooper ========== +// + +RelooperRef RelooperCreate() { + return RelooperRef(new CFG::Relooper()); +} + +RelooperBlockRef RelooperAddBlock(RelooperRef relooper, BinaryenExpressionRef code) { + auto* R = (CFG::Relooper*)relooper; + auto* ret = new CFG::Block((Expression*)code); + R->AddBlock(ret); + return RelooperRef(ret); +} + +void RelooperAddBranch(RelooperBlockRef from, RelooperBlockRef to, BinaryenExpressionRef condition, BinaryenExpressionRef code) { + auto* fromBlock = (CFG::Block*)from; + auto* toBlock = (CFG::Block*)to; + fromBlock->AddBranchTo(toBlock, (Expression*)condition, (Expression*)code); +} + +RelooperBlockRef RelooperAddBlockWithSwitch(RelooperRef relooper, BinaryenExpressionRef code, BinaryenExpressionRef condition) { + auto* R = (CFG::Relooper*)relooper; + auto* ret = new CFG::Block((Expression*)code, (Expression*)condition); + R->AddBlock(ret); + return RelooperRef(ret); +} + +void RelooperAddBranchForSwitch(RelooperBlockRef from, RelooperBlockRef to, BinaryenIndex index, BinaryenExpressionRef code) { + auto* fromBlock = (CFG::Block*)from; + auto* toBlock = (CFG::Block*)to; + fromBlock->AddBranchTo(toBlock, (wasm::Index)index, (Expression*)code); +} + +BinaryenExpressionRef RelooperRenderAndDispose(RelooperRef relooper, RelooperBlockRef entry, BinaryenIndex labelHelper, BinaryenModuleRef module) { + auto* R = (CFG::Relooper*)relooper; + R->Calculate((CFG::Block*)entry); + CFG::RelooperBuilder builder(*(Module*)module, labelHelper); + auto* ret = R->Render(builder); + delete R; + return BinaryenExpressionRef(ret); +} + } // extern "C" |