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 /test/example/c-api-kitchen-sink.c | |
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 'test/example/c-api-kitchen-sink.c')
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 125 |
1 files changed, 123 insertions, 2 deletions
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index bfcb1ddea..28fd901a4 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -46,9 +46,9 @@ BinaryenExpressionRef makeSomething(BinaryenModuleRef module) { return makeInt32(module, 1337); } -// main +// tests -int main() { +void test_core() { // Core types @@ -221,3 +221,124 @@ int main() { BinaryenModuleDispose(module); } +void test_relooper() { + BinaryenModuleRef module = BinaryenModuleCreate(); + BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", BinaryenNone(), NULL, 0); + BinaryenType localTypes[] = { BinaryenInt32() }; + + { // trivial: just one block + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block = RelooperAddBlock(relooper, makeSomething(module)); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "just-one-block", v, localTypes, 1, body); + } + { // two blocks + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperAddBranch(block0, block1, NULL, NULL); // no condition, no code on branch + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "two-blocks", v, localTypes, 1, body); + } + { // two blocks with code between them + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperAddBranch(block0, block1, NULL, makeInt32(module, 77)); // code on branch + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "two-blocks-plus-code", v, localTypes, 1, body); + } + { // two blocks in a loop + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperAddBranch(block0, block1, NULL, NULL); + RelooperAddBranch(block1, block0, NULL, NULL); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop", v, localTypes, 1, body); + } + { // two blocks in a loop with codes + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperAddBranch(block0, block1, NULL, makeInt32(module, 33)); + RelooperAddBranch(block1, block0, NULL, makeInt32(module, -66)); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-plus-code", v, localTypes, 1, body); + } + { // split + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2)); + RelooperAddBranch(block0, block1, makeInt32(module, 55), NULL); + RelooperAddBranch(block0, block2, NULL, NULL); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "split", v, localTypes, 1, body); + } + { // split + code + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2)); + RelooperAddBranch(block0, block1, makeInt32(module, 55), makeInt32(module, 10)); + RelooperAddBranch(block0, block2, NULL, makeInt32(module, 20)); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "split-plus-code", v, localTypes, 1, body); + } + { // if + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2)); + RelooperAddBranch(block0, block1, makeInt32(module, 55), NULL); + RelooperAddBranch(block0, block2, NULL, NULL); + RelooperAddBranch(block1, block2, NULL, NULL); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "if", v, localTypes, 1, body); + } + { // if + code + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2)); + RelooperAddBranch(block0, block1, makeInt32(module, 55), makeInt32(module, -1)); + RelooperAddBranch(block0, block2, NULL, makeInt32(module, -2)); + RelooperAddBranch(block1, block2, NULL, makeInt32(module, -3)); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "if-plus-code", v, localTypes, 1, body); + } + { // if-else + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2)); + RelooperBlockRef block3 = RelooperAddBlock(relooper, makeInt32(module, 3)); + RelooperAddBranch(block0, block1, makeInt32(module, 55), NULL); + RelooperAddBranch(block0, block2, NULL, NULL); + RelooperAddBranch(block1, block3, NULL, NULL); + RelooperAddBranch(block2, block3, NULL, NULL); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "if-else", v, localTypes, 1, body); + } + { // loop+tail + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2)); + RelooperAddBranch(block0, block1, NULL, NULL); + RelooperAddBranch(block1, block0, makeInt32(module, 10), NULL); + RelooperAddBranch(block1, block2, NULL, NULL); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-tail", v, localTypes, 1, body); + } + + BinaryenModulePrint(module); + BinaryenModuleDispose(module); +} + +int main() { + test_core(); + test_relooper(); +} + |