summaryrefslogtreecommitdiff
path: root/test/example/c-api-kitchen-sink.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/example/c-api-kitchen-sink.c')
-rw-r--r--test/example/c-api-kitchen-sink.c125
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();
+}
+