GPerlJITCompiler::GPerlJITCompiler(void) { size_t h_fields_num = 5; jit_type_t h_fields[5]; h_fields[0] = jit_type_int;/* type */ h_fields[1] = jit_type_int;/* mark_flag */ h_fields[2] = jit_type_void_ptr;/* mark */ h_fields[3] = jit_type_void_ptr;/* free */ h_fields[4] = jit_type_void_ptr;/* next */ jit_type_t header = jit_type_create_struct(h_fields, h_fields_num, 0); size_t fields_num = 5; jit_type_t fields[5]; fields[0] = header; fields[1] = jit_type_void_ptr;/* slot1 */ fields[2] = jit_type_void_ptr;/* slot2 */ fields[3] = jit_type_void_ptr;/* slot3 */ fields[4] = jit_type_void_ptr;/* slot4 */ jit_type_t object = jit_type_create_struct(fields, fields_num, 0); object_ptr_type = jit_type_create_pointer(object, 0); jit_type_t v_fields[6]; size_t v_fields_num = 6; v_fields[0] = jit_type_sys_ulonglong; /* bytes */ v_fields[1] = jit_type_int; /* ivalue */ v_fields[2] = jit_type_float64;/* dvalue */ v_fields[3] = jit_type_sys_bool; /* bvalue */ v_fields[4] = jit_type_void_ptr;/* svalue */ v_fields[5] = jit_type_void_ptr;/* ovalue */ value_type = jit_type_create_union(v_fields, v_fields_num, 0); }
PHP_METHOD(Type, __construct) { zval *ztype = NULL; zend_bool zpointer = 0; php_jit_type_t *ptype; if (php_jit_parameters("z|b", &ztype, &zpointer) != SUCCESS) { php_jit_exception("unexpected parameters, expected (int|Type of [, bool pointer = false])"); return; } ptype = PHP_JIT_FETCH_TYPE(getThis()); switch (Z_TYPE_P(ztype)) { case IS_LONG: if (zpointer) { ptype->type = jit_type_create_pointer( php_jit_type(Z_LVAL_P(ztype)), 1); ptype->pt = 1; } else ptype->type = php_jit_type(Z_LVAL_P(ztype)); ptype->id = Z_LVAL_P(ztype); break; case IS_OBJECT: { php_jit_type_t *patype = PHP_JIT_FETCH_TYPE(ztype); if (zpointer) { ptype->type = jit_type_create_pointer(patype->type, 1); ptype->pt = (patype->pt + 1); } else ptype->type = jit_type_copy(patype->type); ptype->id = patype->id; ptype->copied = 1; } break; default: php_jit_exception("unexpected parameters, expected (int|Type of [, bool pointer = false])"); } }
void init_decompiler() { context = jit_context_create(); jit_context_build_start(context); jit_type_t s5params[5]; s5params[0] = jit_type_uint; s5params[1] = jit_type_uint; s5params[2] = jit_type_uint; s5params[3] = jit_type_uint; s5params[4] = jit_type_uint; sig_5 = jit_type_create_signature(jit_abi_cdecl, jit_type_uint, s5params, 5, 1); jit_type_t s4params[4]; s4params[0] = jit_type_uint; s4params[1] = jit_type_uint; s4params[2] = jit_type_uint; s4params[3] = jit_type_uint; sig_4 = jit_type_create_signature(jit_abi_cdecl, jit_type_uint, s4params, 4, 1); jit_type_t s3params[3]; s3params[0] = jit_type_uint; s3params[1] = jit_type_uint; s3params[2] = jit_type_uint; sig_3 = jit_type_create_signature(jit_abi_cdecl, jit_type_uint, s3params, 3, 1); jit_type_t sparams[2]; sparams[0] = jit_type_uint; sparams[1] = jit_type_uint; sig_2 = jit_type_create_signature(jit_abi_cdecl, jit_type_uint, sparams, 2, 1); jit_type_t lparams[1]; lparams[0] = jit_type_uint; sig_1 = jit_type_create_signature(jit_abi_cdecl, jit_type_uint, lparams, 1, 1); jit_type_t pparams[1]; pparams[0] = jit_type_void_ptr; sig_1_ptr = jit_type_create_signature(jit_abi_cdecl, jit_type_void, pparams, 1, 1); sig_0 = jit_type_create_signature(jit_abi_cdecl, jit_type_void, NULL, 0, 1); jit_type_t params[7]; params[0] = jit_type_create_pointer(jit_type_uint, 0); // State params[1] = jit_type_create_pointer(jit_type_ubyte, 0); // ReadAbsorb params[2] = jit_type_create_pointer(jit_type_ubyte, 0); // ReadAbsorbWhich params[3] = jit_type_create_pointer(jit_type_ubyte, 0); // ReadFudge params[4] = jit_type_create_pointer(jit_type_uint, 0); // LDWhich params[5] = jit_type_create_pointer(jit_type_uint, 0); // LDValue params[6] = jit_type_create_pointer(jit_type_uint, 0); // LDAbsorb block_sig = jit_type_create_signature(jit_abi_cdecl, jit_type_void, params, 7, 1); }
jit_type_t GPerlJITCompiler::getJitType(GPerlT type) { jit_type_t ret; switch (type) { case Int: ret = jit_type_int; break; case Double: ret = jit_type_nfloat; break; case String: ret = jit_type_create_pointer(jit_type_sys_char, 0); break; case Object: ret = object_ptr_type; break; default: break; } return ret; }
/*@ * @deftypefun jit_value_t jit_value_get_struct_pointer (jit_function_t @var{func}) * Get the value that contains the structure return pointer for * a function. If the function does not have a structure return pointer * (i.e. structures are returned in registers), then this returns NULL. * @end deftypefun @*/ jit_value_t jit_value_get_struct_pointer(jit_function_t func) { jit_type_t type; jit_value_t value; /* Ensure that we have a builder for this function */ if(!_jit_function_ensure_builder(func)) { return 0; } type = jit_type_remove_tags(jit_type_get_return(func->signature)); if(jit_type_is_struct(type) || jit_type_is_union(type)) { if(jit_type_return_via_pointer(type)) { if(!func->builder->struct_return) { type = jit_type_create_pointer(type, 1); if(!type) { return 0; } value = jit_value_create(func, type); func->builder->struct_return = value; if(value) { /* The value belongs to the entry block, no matter where it happens to be created */ value->block = func->builder->entry_block; value->is_parameter = 1; } jit_type_free(type); } return func->builder->struct_return; } } return 0; }
jit_function_t bf_compile(jit_context_t cx, FILE *fp) { jit_type_t params[1], putchar_params[1], signature, putchar_sig, getchar_sig; jit_value_t ptr, uptr, ubyte, tmp; bf_loop_t loop = NULL; ubyte_ptr = jit_type_create_pointer(jit_type_ubyte, 1); params[0] = ubyte_ptr; putchar_params[0] = jit_type_ubyte; signature = jit_type_create_signature(jit_abi_cdecl, jit_type_void, params, 1, 1); putchar_sig = jit_type_create_signature(jit_abi_cdecl, jit_type_ubyte, putchar_params, 1, 1); getchar_sig = jit_type_create_signature(jit_abi_cdecl, jit_type_ubyte, NULL, 0, 1); jit_function_t function = jit_function_create(cx, signature); ptr = jit_value_get_param(function, 0); uptr = jit_value_create_nint_constant(function, ubyte_ptr, 1); ubyte = jit_value_create_nint_constant(function, jit_type_ubyte, 1); ops *unit = (ops*)malloc(sizeof(ops)); unit->count = 0; int first = 1; while(!feof(fp)) { char c = fgetc(fp); if (first) { unit->token = c; first = 0; } switch(c) { case '>': OPTIMIZE_TOKEN('>') case '<': OPTIMIZE_TOKEN('<') case '+': OPTIMIZE_TOKEN('+') case '-': OPTIMIZE_TOKEN('-') case '.': emitOpcodes(function, ptr, unit); unit->token = '.'; tmp = jit_insn_load_relative(function, ptr, 0, jit_type_ubyte); jit_insn_call_native(function, "putchar", putchar, putchar_sig, &tmp, 1, JIT_CALL_NOTHROW); break; case ',': emitOpcodes(function, ptr, unit); unit->token = ','; jit_insn_call_native(function, "getchar", getchar, getchar_sig, NULL, 0, JIT_CALL_NOTHROW); jit_insn_store_relative(function, ptr, 0, tmp); break; case '[': emitOpcodes(function, ptr, unit); unit->token = '['; loop_start(function, &loop); tmp = jit_insn_load_relative(function, ptr, 0, jit_type_ubyte); jit_insn_branch_if_not(function, tmp, &loop->stop); break; case ']': emitOpcodes(function, ptr, unit); unit->token = ']'; loop_stop(function, &loop); break; } } jit_insn_return(function, NULL); jit_function_compile(function); return function; }