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.c97
1 files changed, 54 insertions, 43 deletions
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 568492659..496ac4efd 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -270,37 +270,48 @@ void test_core() {
BinaryenModuleDispose(module);
}
+BinaryenExpressionRef makeCallCheck(BinaryenModuleRef module, int x) {
+ BinaryenExpressionRef callOperands[] = { makeInt32(module, x) };
+ return BinaryenCallImport(module, "check", callOperands, 1, BinaryenNone());
+}
+
void test_relooper() {
BinaryenModuleRef module = BinaryenModuleCreate();
BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", BinaryenNone(), NULL, 0);
BinaryenType localTypes[] = { BinaryenInt32() };
+ {
+ BinaryenType iparams[1] = { BinaryenInt32() };
+ BinaryenFunctionTypeRef vi = BinaryenAddFunctionType(module, "vi", BinaryenNone(), iparams, 1);
+ BinaryenAddImport(module, "check", "module", "check", vi);
+ }
+
{ // trivial: just one block
RelooperRef relooper = RelooperCreate();
- RelooperBlockRef block = RelooperAddBlock(relooper, makeSomething(module));
+ RelooperBlockRef block = RelooperAddBlock(relooper, makeCallCheck(module, 1337));
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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
RelooperAddBranch(block0, block1, NULL, NULL);
RelooperAddBranch(block1, block0, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module);
@@ -308,8 +319,8 @@ void test_relooper() {
}
{ // two blocks in a loop with codes
RelooperRef relooper = RelooperCreate();
- RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0));
- RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
RelooperAddBranch(block0, block1, NULL, makeInt32(module, 33));
RelooperAddBranch(block1, block0, NULL, makeInt32(module, -66));
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module);
@@ -317,9 +328,9 @@ void test_relooper() {
}
{ // 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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
RelooperAddBranch(block0, block1, makeInt32(module, 55), NULL);
RelooperAddBranch(block0, block2, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module);
@@ -327,9 +338,9 @@ void test_relooper() {
}
{ // 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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
BinaryenExpressionRef temp = makeInt32(module, 10);
RelooperAddBranch(block0, block1, makeInt32(module, 55), temp);
RelooperAddBranch(block0, block2, NULL, makeInt32(module, 20));
@@ -338,9 +349,9 @@ void test_relooper() {
}
{ // 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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
RelooperAddBranch(block0, block1, makeInt32(module, 55), NULL);
RelooperAddBranch(block0, block2, NULL, NULL);
RelooperAddBranch(block1, block2, NULL, NULL);
@@ -349,9 +360,9 @@ void test_relooper() {
}
{ // 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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
BinaryenExpressionRef temp = makeInt32(module, -1);
RelooperAddBranch(block0, block1, makeInt32(module, 55), temp);
RelooperAddBranch(block0, block2, NULL, makeInt32(module, -2));
@@ -361,10 +372,10 @@ void test_relooper() {
}
{ // 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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
+ RelooperBlockRef block3 = RelooperAddBlock(relooper, makeCallCheck(module, 3));
RelooperAddBranch(block0, block1, makeInt32(module, 55), NULL);
RelooperAddBranch(block0, block2, NULL, NULL);
RelooperAddBranch(block1, block3, NULL, NULL);
@@ -374,9 +385,9 @@ void test_relooper() {
}
{ // 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));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
RelooperAddBranch(block0, block1, NULL, NULL);
RelooperAddBranch(block1, block0, makeInt32(module, 10), NULL);
RelooperAddBranch(block1, block2, NULL, NULL);
@@ -385,13 +396,13 @@ void test_relooper() {
}
{ // nontrivial loop + phi to head
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));
- RelooperBlockRef block4 = RelooperAddBlock(relooper, makeInt32(module, 4));
- RelooperBlockRef block5 = RelooperAddBlock(relooper, makeInt32(module, 5));
- RelooperBlockRef block6 = RelooperAddBlock(relooper, makeInt32(module, 6));
+ RelooperBlockRef block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
+ RelooperBlockRef block3 = RelooperAddBlock(relooper, makeCallCheck(module, 3));
+ RelooperBlockRef block4 = RelooperAddBlock(relooper, makeCallCheck(module, 4));
+ RelooperBlockRef block5 = RelooperAddBlock(relooper, makeCallCheck(module, 5));
+ RelooperBlockRef block6 = RelooperAddBlock(relooper, makeCallCheck(module, 6));
RelooperAddBranch(block0, block1, NULL, makeInt32(module, 10));
RelooperAddBranch(block1, block2, makeInt32(module, -2), NULL);
RelooperAddBranch(block1, block6, NULL, makeInt32(module, 20));
@@ -407,10 +418,10 @@ void test_relooper() {
{ // switch
RelooperRef relooper = RelooperCreate();
BinaryenExpressionRef temp = makeInt32(module, -99);
- RelooperBlockRef block0 = RelooperAddBlockWithSwitch(relooper, makeInt32(module, 0), temp);
- RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1));
- RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2));
- RelooperBlockRef block3 = RelooperAddBlock(relooper, makeInt32(module, 3));
+ RelooperBlockRef block0 = RelooperAddBlockWithSwitch(relooper, makeCallCheck(module, 0), temp);
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
+ RelooperBlockRef block3 = RelooperAddBlock(relooper, makeCallCheck(module, 3));
BinaryenIndex to_block1[] = { 2, 5 };
RelooperAddBranchForSwitch(block0, block1, to_block1, 2, NULL);
BinaryenIndex to_block2[] = { 4 };
@@ -421,9 +432,9 @@ void test_relooper() {
}
{ // duff's device
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 block0 = RelooperAddBlock(relooper, makeCallCheck(module, 0));
+ RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
+ RelooperBlockRef block2 = RelooperAddBlock(relooper, makeCallCheck(module, 2));
RelooperAddBranch(block0, block1, makeInt32(module, 10), NULL);
RelooperAddBranch(block0, block2, NULL, NULL);
RelooperAddBranch(block1, block2, NULL, NULL);
@@ -437,7 +448,7 @@ void test_relooper() {
{ // return in a block
RelooperRef relooper = RelooperCreate();
- BinaryenExpressionRef listList[] = { makeInt32(module, 42), BinaryenReturn(module, makeInt32(module, 1337)) };
+ BinaryenExpressionRef listList[] = { makeCallCheck(module, 42), BinaryenReturn(module, makeInt32(module, 1337)) };
BinaryenExpressionRef list = BinaryenBlock(module, "the-list", listList, 2);
RelooperBlockRef block = RelooperAddBlock(relooper, list);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block, 0, module);