示例#1
0
文件: jit.cpp 项目: goccy/gperl
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);
}
示例#2
0
文件: type.c 项目: krakjoe/jitfu
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])");
	}
}
示例#3
0
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);
}
示例#4
0
文件: jit.cpp 项目: goccy/gperl
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;
}
示例#5
0
/*@
 * @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;
}
示例#6
0
文件: bf-jit.c 项目: sankha93/bf-jit
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;
}