Having finished looping over the blocks and populating them with statements, the context is complete.
We can now compile it, extract machine code from the result, and run it:
class compilation_result { public: compilation_result (gcc_jit_result *result) : m_result (result) { } ~compilation_result () { gcc_jit_result_release (m_result); } void *get_code (const char *funcname) { return gcc_jit_result_get_code (m_result, funcname); } private: gcc_jit_result *m_result; };compilation_result compiler_result = fn->compile (); const char *funcname = fn->get_function_name (); toyvm_compiled_func code = (toyvm_compiled_func)compiler_result.get_code (funcname); printf ("compiler result: %d\n", code (atoi (argv[2])));