#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_value_t arg = jit_value_get_param(func, 0); jit_value_t x = jit_value_create(func, jit_type_int); jit_value_t ret; // child ret = jit_insn_import(child, arg); ret = jit_insn_load_relative(child, ret, 0, jit_type_int); 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); /* // func jit_insn_store(func, x, const(int, 42)); jit_value_t frame = jit_insn_get_frame_pointer(func); jit_value_t childVal = const(void_ptr, (jit_nuint)jit_function_to_closure(child)); ret = jit_insn_call_nested_indirect(func, childVal, frame, signature, 0, 0, 0); jit_insn_return(func, ret); */ /*jit_dump_function(stdout, func, "func"); jit_dump_function(stdout, child, "child");*/ jit_optimize(func); jit_optimize(child); jit_dump_function(stdout, func, "optimized func"); jit_dump_function(stdout, child, "optimized child"); jit_function_compile(func); jit_function_compile(child); jit_context_build_end(ctx); jit_dump_function(stdout, func, "func"); jit_dump_function(stdout, child, "child"); jit_int result; jit_int applyArg = 1337; void *applyArgPtr = &applyArg; jit_function_apply(func, &applyArgPtr, &result); printf("func() = %d\n", result); return 0; }