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.c263
1 files changed, 200 insertions, 63 deletions
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 500188a55..b3419d184 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -260,8 +260,11 @@ void test_core() {
BinaryenExpressionRef callOperands4[] = { makeInt32(module, 13), makeInt64(module, 37), makeFloat32(module, 1.3f), makeFloat64(module, 3.7) };
BinaryenExpressionRef callOperands4b[] = { makeInt32(module, 13), makeInt64(module, 37), makeFloat32(module, 1.3f), makeFloat64(module, 3.7) };
- BinaryenType params[4] = { BinaryenTypeInt32(), BinaryenTypeInt64(), BinaryenTypeFloat32(), BinaryenTypeFloat64() };
- BinaryenFunctionTypeRef iiIfF = BinaryenAddFunctionType(module, "iiIfF", BinaryenTypeInt32(), params, 4);
+ BinaryenType iIfF_[4] = {BinaryenTypeInt32(),
+ BinaryenTypeInt64(),
+ BinaryenTypeFloat32(),
+ BinaryenTypeFloat64()};
+ BinaryenType iIfF = BinaryenTypeCreate(iIfF_, 4);
BinaryenExpressionRef temp1 = makeInt32(module, 1), temp2 = makeInt32(module, 2), temp3 = makeInt32(module, 3),
temp4 = makeInt32(module, 4), temp5 = makeInt32(module, 5),
@@ -635,11 +638,14 @@ void test_core() {
callOperands2,
2,
BinaryenTypeFloat32()))),
- BinaryenUnary(
- module,
- BinaryenEqZInt32(), // check the output type of the call node
- BinaryenCallIndirect(
- module, makeInt32(module, 2449), callOperands4b, 4, "iiIfF")),
+ BinaryenUnary(module,
+ BinaryenEqZInt32(), // check the output type of the call node
+ BinaryenCallIndirect(module,
+ makeInt32(module, 2449),
+ callOperands4b,
+ 4,
+ iIfF,
+ BinaryenTypeInt32())),
BinaryenDrop(module, BinaryenLocalGet(module, 0, BinaryenTypeInt32())),
BinaryenLocalSet(module, 0, makeInt32(module, 101)),
BinaryenDrop(module, BinaryenLocalTee(module, 0, makeInt32(module, 102))),
@@ -656,8 +662,12 @@ void test_core() {
// Tail call
BinaryenReturnCall(
module, "kitchen()sinker", callOperands4, 4, BinaryenTypeInt32()),
- BinaryenReturnCallIndirect(
- module, makeInt32(module, 2449), callOperands4b, 4, "iiIfF"),
+ BinaryenReturnCallIndirect(module,
+ makeInt32(module, 2449),
+ callOperands4b,
+ 4,
+ iIfF,
+ BinaryenTypeInt32()),
// Exception handling
BinaryenTry(module, tryBody, catchBody),
// Atomics
@@ -697,8 +707,8 @@ void test_core() {
// Create the function
BinaryenType localTypes[] = {BinaryenTypeInt32(), BinaryenTypeExnref()};
- BinaryenFunctionRef sinker =
- BinaryenAddFunction(module, "kitchen()sinker", iiIfF, localTypes, 2, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(
+ module, "kitchen()sinker", iIfF, BinaryenTypeInt32(), localTypes, 2, body);
// Globals
@@ -707,9 +717,10 @@ void test_core() {
// Imports
- BinaryenType iparams[2] = { BinaryenTypeInt32(), BinaryenTypeFloat64() };
- BinaryenFunctionTypeRef fiF = BinaryenAddFunctionType(module, "fiF", BinaryenTypeFloat32(), iparams, 2);
- BinaryenAddFunctionImport(module, "an-imported", "module", "base", fiF);
+ BinaryenType iF_[2] = {BinaryenTypeInt32(), BinaryenTypeFloat64()};
+ BinaryenType iF = BinaryenTypeCreate(iF_, 2);
+ BinaryenAddFunctionImport(
+ module, "an-imported", "module", "base", iF, BinaryenTypeFloat32());
// Exports
@@ -729,14 +740,15 @@ void test_core() {
// Start function. One per module
- BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", BinaryenTypeNone(), NULL, 0);
- BinaryenFunctionRef starter = BinaryenAddFunction(module, "starter", v, NULL, 0, BinaryenNop(module));
+ BinaryenFunctionRef starter = BinaryenAddFunction(module,
+ "starter",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ NULL,
+ 0,
+ BinaryenNop(module));
BinaryenSetStart(module, starter);
- // Unnamed function type
-
- BinaryenFunctionTypeRef noname = BinaryenAddFunctionType(module, NULL, BinaryenTypeNone(), NULL, 0);
-
// A bunch of our code needs drop(), auto-add it
BinaryenModuleAutoDrop(module);
@@ -756,11 +768,19 @@ void test_core() {
void test_unreachable() {
BinaryenModuleRef module = BinaryenModuleCreate();
- BinaryenFunctionTypeRef i = BinaryenAddFunctionType(module, "i", BinaryenTypeInt32(), NULL, 0);
- BinaryenFunctionTypeRef I = BinaryenAddFunctionType(module, "I", BinaryenTypeInt64(), NULL, 0);
-
- BinaryenExpressionRef body = BinaryenCallIndirect(module, BinaryenUnreachable(module), NULL, 0, "I");
- BinaryenFunctionRef fn = BinaryenAddFunction(module, "unreachable-fn", i, NULL, 0, body);
+ BinaryenExpressionRef body = BinaryenCallIndirect(module,
+ BinaryenUnreachable(module),
+ NULL,
+ 0,
+ BinaryenTypeNone(),
+ BinaryenTypeInt64());
+ BinaryenFunctionRef fn = BinaryenAddFunction(module,
+ "unreachable-fn",
+ BinaryenTypeNone(),
+ BinaryenTypeInt32(),
+ NULL,
+ 0,
+ body);
assert(BinaryenModuleValidate(module));
BinaryenModulePrint(module);
@@ -774,20 +794,26 @@ BinaryenExpressionRef makeCallCheck(BinaryenModuleRef module, int x) {
void test_relooper() {
BinaryenModuleRef module = BinaryenModuleCreate();
- BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", BinaryenTypeNone(), NULL, 0);
BinaryenType localTypes[] = { BinaryenTypeInt32() };
- {
- BinaryenType iparams[1] = { BinaryenTypeInt32() };
- BinaryenFunctionTypeRef vi = BinaryenAddFunctionType(module, "vi", BinaryenTypeNone(), iparams, 1);
- BinaryenAddFunctionImport(module, "check", "module", "check", vi);
- }
+ BinaryenAddFunctionImport(module,
+ "check",
+ "module",
+ "check",
+ BinaryenTypeInt32(),
+ BinaryenTypeNone());
{ // trivial: just one block
RelooperRef relooper = RelooperCreate(module);
RelooperBlockRef block = RelooperAddBlock(relooper, makeCallCheck(module, 1337));
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "just-one-block", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "just-one-block",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // two blocks
RelooperRef relooper = RelooperCreate(module);
@@ -795,7 +821,13 @@ void test_relooper() {
RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
RelooperAddBranch(block0, block1, NULL, NULL); // no condition, no code on branch
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "two-blocks", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "two-blocks",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // two blocks with code between them
RelooperRef relooper = RelooperCreate(module);
@@ -803,7 +835,13 @@ void test_relooper() {
RelooperBlockRef block1 = RelooperAddBlock(relooper, makeCallCheck(module, 1));
RelooperAddBranch(block0, block1, NULL, makeDroppedInt32(module, 77)); // code on branch
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "two-blocks-plus-code", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "two-blocks-plus-code",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // two blocks in a loop
RelooperRef relooper = RelooperCreate(module);
@@ -812,7 +850,13 @@ void test_relooper() {
RelooperAddBranch(block0, block1, NULL, NULL);
RelooperAddBranch(block1, block0, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "loop",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // two blocks in a loop with codes
RelooperRef relooper = RelooperCreate(module);
@@ -821,7 +865,13 @@ void test_relooper() {
RelooperAddBranch(block0, block1, NULL, makeDroppedInt32(module, 33));
RelooperAddBranch(block1, block0, NULL, makeDroppedInt32(module, -66));
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-plus-code", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "loop-plus-code",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // split
RelooperRef relooper = RelooperCreate(module);
@@ -831,7 +881,13 @@ void test_relooper() {
RelooperAddBranch(block0, block1, makeInt32(module, 55), NULL);
RelooperAddBranch(block0, block2, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "split", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "split",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // split + code
RelooperRef relooper = RelooperCreate(module);
@@ -842,7 +898,13 @@ void test_relooper() {
RelooperAddBranch(block0, block1, makeInt32(module, 55), temp);
RelooperAddBranch(block0, block2, NULL, makeDroppedInt32(module, 20));
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "split-plus-code", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "split-plus-code",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // if
RelooperRef relooper = RelooperCreate(module);
@@ -853,7 +915,13 @@ void test_relooper() {
RelooperAddBranch(block0, block2, NULL, NULL);
RelooperAddBranch(block1, block2, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "if", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "if",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // if + code
RelooperRef relooper = RelooperCreate(module);
@@ -865,7 +933,13 @@ void test_relooper() {
RelooperAddBranch(block0, block2, NULL, makeDroppedInt32(module, -2));
RelooperAddBranch(block1, block2, NULL, makeDroppedInt32(module, -3));
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "if-plus-code", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "if-plus-code",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // if-else
RelooperRef relooper = RelooperCreate(module);
@@ -878,7 +952,13 @@ void test_relooper() {
RelooperAddBranch(block1, block3, NULL, NULL);
RelooperAddBranch(block2, block3, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "if-else", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "if-else",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // loop+tail
RelooperRef relooper = RelooperCreate(module);
@@ -889,7 +969,13 @@ void test_relooper() {
RelooperAddBranch(block1, block0, makeInt32(module, 10), NULL);
RelooperAddBranch(block1, block2, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-tail", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "loop-tail",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // nontrivial loop + phi to head
RelooperRef relooper = RelooperCreate(module);
@@ -910,7 +996,14 @@ void test_relooper() {
RelooperAddBranch(block4, block5, NULL, NULL);
RelooperAddBranch(block5, block6, NULL, makeDroppedInt32(module, 40));
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "nontrivial-loop-plus-phi-to-head", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker =
+ BinaryenAddFunction(module,
+ "nontrivial-loop-plus-phi-to-head",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // switch
RelooperRef relooper = RelooperCreate(module);
@@ -928,7 +1021,13 @@ void test_relooper() {
RelooperAddBranchForSwitch(block0, block2, to_block2, 1, makeDroppedInt32(module, 55));
RelooperAddBranchForSwitch(block0, block3, NULL, 0, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "switch", v, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "switch",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
+ body);
}
{ // duff's device
RelooperRef relooper = RelooperCreate(module);
@@ -941,18 +1040,29 @@ void test_relooper() {
RelooperAddBranch(block2, block1, NULL, NULL);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 3); // use $3 as the helper var
BinaryenType localTypes[] = { BinaryenTypeInt32(), BinaryenTypeInt32(), BinaryenTypeInt64(), BinaryenTypeInt32(), BinaryenTypeFloat32(), BinaryenTypeFloat64(), BinaryenTypeInt32() };
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "duffs-device", v, localTypes, sizeof(localTypes)/sizeof(BinaryenType), body);
+ BinaryenFunctionRef sinker =
+ BinaryenAddFunction(module,
+ "duffs-device",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ sizeof(localTypes) / sizeof(BinaryenType),
+ body);
}
- BinaryenFunctionTypeRef i = BinaryenAddFunctionType(module, "i", BinaryenTypeInt32(), NULL, 0);
-
{ // return in a block
RelooperRef relooper = RelooperCreate(module);
BinaryenExpressionRef listList[] = { makeCallCheck(module, 42), BinaryenReturn(module, makeInt32(module, 1337)) };
BinaryenExpressionRef list = BinaryenBlock(module, "the-list", listList, 2, -1);
RelooperBlockRef block = RelooperAddBlock(relooper, list);
BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block, 0);
- BinaryenFunctionRef sinker = BinaryenAddFunction(module, "return", i, localTypes, 1, body);
+ BinaryenFunctionRef sinker = BinaryenAddFunction(module,
+ "return",
+ BinaryenTypeNone(),
+ BinaryenTypeInt32(),
+ localTypes,
+ 1,
+ body);
}
printf("raw:\n");
@@ -976,12 +1086,13 @@ void test_binaries() {
{ // create a module and write it to binary
BinaryenModuleRef module = BinaryenModuleCreate();
- BinaryenType params[2] = { BinaryenTypeInt32(), BinaryenTypeInt32() };
- BinaryenFunctionTypeRef iii = BinaryenAddFunctionType(module, "iii", BinaryenTypeInt32(), params, 2);
+ BinaryenType ii_[2] = {BinaryenTypeInt32(), BinaryenTypeInt32()};
+ BinaryenType ii = BinaryenTypeCreate(ii_, 2);
BinaryenExpressionRef x = BinaryenLocalGet(module, 0, BinaryenTypeInt32()),
y = BinaryenLocalGet(module, 1, BinaryenTypeInt32());
BinaryenExpressionRef add = BinaryenBinary(module, BinaryenAddInt32(), x, y);
- BinaryenFunctionRef adder = BinaryenAddFunction(module, "adder", iii, NULL, 0, add);
+ BinaryenFunctionRef adder = BinaryenAddFunction(
+ module, "adder", ii, BinaryenTypeInt32(), NULL, 0, add);
BinaryenSetDebugInfo(1); // include names section
size = BinaryenModuleWrite(module, buffer, 1024); // write out the module
BinaryenSetDebugInfo(0);
@@ -1019,13 +1130,17 @@ void test_interpret() {
BinaryenModuleRef module = BinaryenModuleCreate();
BinaryenType iparams[2] = { BinaryenTypeInt32() };
- BinaryenFunctionTypeRef vi = BinaryenAddFunctionType(module, "vi", BinaryenTypeNone(), iparams, 1);
- BinaryenAddFunctionImport(module, "print-i32", "spectest", "print", vi);
+ BinaryenAddFunctionImport(module,
+ "print-i32",
+ "spectest",
+ "print",
+ BinaryenTypeInt32(),
+ BinaryenTypeNone());
- BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", BinaryenTypeNone(), NULL, 0);
BinaryenExpressionRef callOperands[] = { makeInt32(module, 1234) };
BinaryenExpressionRef call = BinaryenCall(module, "print-i32", callOperands, 1, BinaryenTypeNone());
- BinaryenFunctionRef starter = BinaryenAddFunction(module, "starter", v, NULL, 0, call);
+ BinaryenFunctionRef starter = BinaryenAddFunction(
+ module, "starter", BinaryenTypeNone(), BinaryenTypeNone(), NULL, 0, call);
BinaryenSetStart(module, starter);
BinaryenModulePrint(module);
@@ -1039,9 +1154,14 @@ void test_nonvalid() {
{
BinaryenModuleRef module = BinaryenModuleCreate();
- BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", BinaryenTypeNone(), NULL, 0);
BinaryenType localTypes[] = { BinaryenTypeInt32() };
- BinaryenFunctionRef func = BinaryenAddFunction(module, "func", v, localTypes, 1,
+ BinaryenFunctionRef func = BinaryenAddFunction(
+ module,
+ "func",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ localTypes,
+ 1,
BinaryenLocalSet(module, 0, makeInt64(module, 1234)) // wrong type!
);
@@ -1080,12 +1200,28 @@ void test_for_each() {
BinaryenModuleRef module = BinaryenModuleCreate();
{
- BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", BinaryenTypeNone(), NULL, 0);
-
BinaryenFunctionRef fns[3] = {0};
- fns[0] = BinaryenAddFunction(module, "fn0", v, NULL, 0, BinaryenNop(module));
- fns[1] = BinaryenAddFunction(module, "fn1", v, NULL, 0, BinaryenNop(module));
- fns[2] = BinaryenAddFunction(module, "fn2", v, NULL, 0, BinaryenNop(module));
+ fns[0] = BinaryenAddFunction(module,
+ "fn0",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ NULL,
+ 0,
+ BinaryenNop(module));
+ fns[1] = BinaryenAddFunction(module,
+ "fn1",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ NULL,
+ 0,
+ BinaryenNop(module));
+ fns[2] = BinaryenAddFunction(module,
+ "fn2",
+ BinaryenTypeNone(),
+ BinaryenTypeNone(),
+ NULL,
+ 0,
+ BinaryenNop(module));
for (i = 0; i < BinaryenGetNumFunctions(module) ; i++) {
assert(BinaryenGetFunctionByIndex(module, i) == fns[i]);
@@ -1125,6 +1261,8 @@ void test_for_each() {
}
int main() {
+ // Tracing must be first so it starts with a fresh set of interned types
+ test_tracing();
test_types();
test_features();
test_core();
@@ -1133,7 +1271,6 @@ int main() {
test_binaries();
test_interpret();
test_nonvalid();
- test_tracing();
test_color_status();
test_for_each();