#include #include #include #define const(t, v) jit_value_create_nint_constant(func, jit_type_##t, v) #define constl(t, v) jit_value_create_long_constant(func, jit_type_##t, v) int main() { jit_init(); jit_context_t ctx = jit_context_create(); jit_context_build_start(ctx); jit_type_t signature = jit_type_create_signature(jit_abi_cdecl, jit_type_int, &jit_type_int, 1, 0); jit_function_t func = jit_function_create(ctx, signature); jit_function_t child = jit_function_create_nested(ctx, signature, func); jit_function_t child2 = jit_function_create_nested(ctx, signature, child); jit_value_t arg = jit_value_get_param(func, 0); jit_value_t x = jit_value_create(func, jit_type_int); jit_value_t ret; // child2 ret = jit_insn_import(child2, x); ret = jit_insn_load_relative(child2, ret, 0, jit_type_int); jit_insn_return(child2, ret); // child ret = jit_value_get_param(child, 0); ret = jit_insn_call(child, "child", child2, 0, &ret, 1, 0); jit_insn_return(child, ret); // func jit_insn_store(func, x, const(int, 42)); ret = jit_insn_call(func, "child", child, 0, &x, 1, 0); jit_insn_return(func, ret); jit_optimize(child2); jit_optimize(child); jit_optimize(func); jit_dump_function(stdout, func, "optimized func"); jit_dump_function(stdout, child, "optimized child"); jit_dump_function(stdout, child2, "optimized child2"); jit_function_compile(child2); jit_function_compile(child); jit_function_compile(func); jit_context_build_end(ctx); jit_dump_function(stdout, func, "func"); jit_dump_function(stdout, child, "child"); jit_dump_function(stdout, child2, "child2"); jit_int result; jit_int applyArg = 1337; void *applyArgPtr = &applyArg; jit_function_apply(func, &applyArgPtr, &result); printf("func() = %d\n", result); return 0; }