summaryrefslogtreecommitdiff
path: root/src/binaryen-c.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-05-05 09:20:41 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-05-05 09:20:41 -0700
commitf85e310924535da09822f3d43aeee9265eb12760 (patch)
treeb78e5f471fd284710032762927d719e98921e2fc /src/binaryen-c.cpp
parent2811727a118e92e6b7ef293458f9bab1cf5dacdc (diff)
downloadbinaryen-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.cpp44
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"