Beispiel #1
0
void dmemory_init(void)
{
	ir_type *type_reference = new_type_primitive(mode_P);
	ir_type *type_int       = new_type_primitive(mode_Is);
	ir_type *type_size_t    = new_type_primitive(mode_Iu);

	ir_type *calloc_type    = new_type_method(2, 1);

	set_method_param_type(calloc_type, 0, type_size_t);
	set_method_param_type(calloc_type, 1, type_size_t);
	set_method_res_type(calloc_type, 0, type_reference);
	set_method_additional_properties(calloc_type, mtp_property_malloc);

	ir_type *glob           = get_glob_type();
	ident   *calloc_id      = new_id_from_str("calloc");
	calloc_entity = new_entity(glob, calloc_id, calloc_type);
	set_entity_visibility(calloc_entity, ir_visibility_external);

	ir_type *arraylength_type = new_type_method(1, 1);
	set_method_param_type(arraylength_type, 0, type_reference);
	set_method_res_type(arraylength_type, 0, type_int);
	set_method_additional_properties(arraylength_type, mtp_property_pure);

	default_arraylength_mode = mode_Is;

	dmemory_model.alloc_object    = dmemory_default_alloc_object;
	dmemory_model.alloc_array     = dmemory_default_alloc_array;
	dmemory_model.get_arraylength = dmemory_default_get_arraylength;
}
Beispiel #2
0
/*
 * The 64-bit version of libgcc does not contain some builtin
 * functions for 32-bit values (__<builtin>si2) anymore.
 */
static void widen_builtin(ir_node *node)
{
	ir_type *mtp  = get_Builtin_type(node);
	ir_type *arg1 = get_method_param_type(mtp, 0);

	// Nothing to do, if argument size is at least machine size.
	if (get_type_size(arg1) >= ir_target_pointer_size())
		return;

	// Only touch builtins with no 32-bit version.
	ir_builtin_kind kind = get_Builtin_kind(node);
	if (kind != ir_bk_clz    &&
	    kind != ir_bk_ctz    &&
	    kind != ir_bk_ffs    &&
	    kind != ir_bk_parity &&
	    kind != ir_bk_popcount) {
		return;
	}

	ir_mode  *target_mode = get_reference_offset_mode(mode_P);
	dbg_info *dbgi        = get_irn_dbg_info(node);
	ir_node  *block       = get_nodes_block(node);
	ir_node  *op          = get_irn_n(node, n_Builtin_max + 1);

	ir_node *conv = new_rd_Conv(dbgi, block, op, target_mode);
	set_irn_n(node, n_Builtin_max + 1, conv);

	ir_type *new_arg1   = get_type_for_mode(target_mode);
	ir_type *new_result = get_method_res_type(mtp, 0);
	ir_type *new_type   = new_type_method(1, 1, false, cc_cdecl_set, mtp_no_property);
	set_method_param_type(new_type, 0, new_arg1);
	set_method_res_type(new_type, 0, new_result);
	set_Builtin_type(node, new_type);
}
Beispiel #3
0
static ir_type *make_divmod_type(ir_type *const tp)
{
	ir_type *const mtp = new_type_method(2, 1, false, cc_cdecl_set, mtp_no_property);
	set_method_param_type(mtp, 0, tp);
	set_method_param_type(mtp, 1, tp);
	set_method_res_type(mtp, 0, tp);
	return mtp;
}
Beispiel #4
0
static ir_entity *make_divmod(char const *const name, ir_type *const even, ir_type *const odd)
{
	ir_type *const mtp = new_type_method(4, 4);
	set_method_param_type(mtp, 0, even);
	set_method_param_type(mtp, 1, odd);
	set_method_param_type(mtp, 2, even);
	set_method_param_type(mtp, 3, odd);
	set_method_res_type(mtp, 0, even);
	set_method_res_type(mtp, 1, odd);
	set_method_res_type(mtp, 2, even);
	set_method_res_type(mtp, 3, odd);

	ident     *const id   = new_id_from_str(name);
	ir_type   *const glob = get_glob_type();
	ir_entity *const ent  = new_entity(glob, id, mtp);
	set_entity_ld_ident(ent, id);
	set_entity_visibility(ent, ir_visibility_external);
	return ent;
}
Beispiel #5
0
static ir_type *get_memcpy_methodtype(void)
{
	ir_type *tp          = new_type_method(3, 1, false, cc_cdecl_set, mtp_no_property);
	ir_mode *size_t_mode = get_ir_mode(native_mode_bytes);

	set_method_param_type(tp, 0, get_type_for_mode(mode_P));
	set_method_param_type(tp, 1, get_type_for_mode(mode_P));
	set_method_param_type(tp, 2, get_type_for_mode(size_t_mode));
	set_method_res_type  (tp, 0, get_type_for_mode(mode_P));

	return tp;
}
Beispiel #6
0
static ir_type *get_memcpy_methodtype(void)
{
	ir_type *tp          = new_type_method(3, 1);
	ir_mode *size_t_mode = get_ir_mode(native_mode_bytes);

	set_method_param_type(tp, 0, get_type_for_mode(mode_P));
	set_method_param_type(tp, 1, get_type_for_mode(mode_P));
	set_method_param_type(tp, 2, get_type_for_mode(size_t_mode));
	set_method_res_type  (tp, 0, get_type_for_mode(mode_P));

	return tp;
}
Beispiel #7
0
static void arm_create_runtime_entities(void)
{
	if (divsi3 != NULL)
		return;

	ir_mode *mode_int = new_int_mode("arm_be_int", irma_twos_complement,
	                                 ARM_MACHINE_SIZE, true, ARM_MODULO_SHIFT);
	ir_mode *mode_uint = new_int_mode("arm_be_int", irma_twos_complement,
	                                  ARM_MACHINE_SIZE, false,
	                                  ARM_MODULO_SHIFT);

	ir_type *int_tp  = get_type_for_mode(mode_int);
	ir_type *uint_tp = get_type_for_mode(mode_uint);

	ir_type *tp_divsi3 = new_type_method(2, 1);
	set_method_param_type(tp_divsi3, 0, int_tp);
	set_method_param_type(tp_divsi3, 1, int_tp);
	set_method_res_type(tp_divsi3, 0, int_tp);
	divsi3 = create_compilerlib_entity(new_id_from_str("__divsi3"), tp_divsi3);

	ir_type *tp_udivsi3 = new_type_method(2, 1);
	set_method_param_type(tp_udivsi3, 0, uint_tp);
	set_method_param_type(tp_udivsi3, 1, uint_tp);
	set_method_res_type(tp_udivsi3, 0, uint_tp);
	udivsi3 = create_compilerlib_entity(new_id_from_str("__udivsi3"), tp_udivsi3);

	ir_type *tp_modsi3 = new_type_method(2, 1);
	set_method_param_type(tp_modsi3, 0, int_tp);
	set_method_param_type(tp_modsi3, 1, int_tp);
	set_method_res_type(tp_modsi3, 0, int_tp);
	modsi3 = create_compilerlib_entity(new_id_from_str("__modsi3"), tp_modsi3);

	ir_type *tp_umodsi3 = new_type_method(2, 1);
	set_method_param_type(tp_umodsi3, 0, uint_tp);
	set_method_param_type(tp_umodsi3, 1, uint_tp);
	set_method_res_type(tp_umodsi3, 0, uint_tp);
	umodsi3 = create_compilerlib_entity(new_id_from_str("__umodsi3"), tp_umodsi3);
}
Beispiel #8
0
/**
 * @return The lowered method type.
 */
static ir_type *lower_method_type(ir_type *mtp)
{
	ir_type *res = pmap_get(ir_type, lowered_type, mtp);
	if (res != NULL)
		return res;

	size_t const n_param     = get_method_n_params(mtp);
	size_t const n_res       = get_method_n_ress(mtp);
	bool   const is_variadic = is_method_variadic(mtp);
	res = new_type_method(n_param, n_res, is_variadic);

	/* set param types and result types */
	for (size_t i = 0; i < n_param; ++i) {
		ir_type *ptp   = get_method_param_type(mtp, i);
		ir_mode *pmode = get_type_mode(ptp);

		if (pmode != NULL && mode_is_float(pmode)) {
			ptp = lower_type(ptp);
		}

		set_method_param_type(res, i, ptp);
	}
	for (size_t i = 0; i < n_res; ++i) {
		ir_type *rtp   = get_method_res_type(mtp, i);
		ir_mode *rmode = get_type_mode(rtp);

		if (rmode != NULL && mode_is_float(rmode)) {
			rtp = lower_type(rtp);
		}

		set_method_res_type(res, i, rtp);
	}

	copy_method_properties(res, mtp);

	set_higher_type(res, mtp);

	pmap_insert(lowered_type, mtp, res);
	return res;
}
Beispiel #9
0
/**
 * Perform some fixups for variadic functions.
 * To make the rest of the frontend code easier to understand we add
 * "dummy" parameters until the number of parameters transmitted in registers.
 * (because otherwise the backend wouldn't store the value of the register
 *  parameters into memory for the VLA magic)
 */
static bool sparc_variadic_fixups(ir_graph *const irg, calling_convention_t *const cconv)
{
	ir_entity *entity = get_irg_entity(irg);
	ir_type   *mtp    = get_entity_type(entity);
	if (!is_method_variadic(mtp))
		return false;

	if (cconv->n_param_regs >= SPARC_N_PARAM_REGS)
		return false;

	size_t                    const n_params     = get_method_n_params(mtp);
	size_t                    const n_ress       = get_method_n_ress(mtp);
	size_t                    const new_n_params = n_params + (SPARC_N_PARAM_REGS - cconv->n_param_regs);
	unsigned                  const cc_mask      = get_method_calling_convention(mtp);
	mtp_additional_properties const props        = get_method_additional_properties(mtp);
	ir_type                  *const new_mtp      = new_type_method(new_n_params, n_ress, true, cc_mask, props);

	type_dbg_info *const dbgi = get_type_dbg_info(mtp);
	set_type_dbg_info(new_mtp, dbgi);

	for (size_t i = 0; i < n_ress; ++i) {
		ir_type *type = get_method_res_type(mtp, i);
		set_method_res_type(new_mtp, i, type);
	}
	for (size_t i = 0; i < n_params; ++i) {
		ir_type *type = get_method_param_type(mtp, i);
		set_method_param_type(new_mtp, i, type);
	}
	ir_type *const frame_type  = get_irg_frame_type(irg);
	ir_mode *const gp_reg_mode = sparc_reg_classes[CLASS_sparc_gp].mode;
	ir_type *const gp_reg_type = get_type_for_mode(gp_reg_mode);
	for (size_t i = n_params; i < new_n_params; ++i) {
		set_method_param_type(new_mtp, i, gp_reg_type);
		new_parameter_entity(frame_type, i, gp_reg_type);
	}

	set_entity_type(entity, new_mtp);
	return true;
}
Beispiel #10
0
void gcji_init()
{
	class_dollar_ident = new_id_from_str("class$");
	glob               = get_glob_type();

	ir_type *t_ptr  = new_type_primitive(mode_reference);
	ir_type *t_size = new_type_primitive(mode_Iu);

	// gcj_alloc
	ir_type *gcj_alloc_method_type
		= new_type_method(1, 1, false, 0, mtp_property_malloc);
	set_method_param_type(gcj_alloc_method_type, 0, t_ptr);
	set_method_res_type(gcj_alloc_method_type, 0, t_ptr);

	ident *gcj_alloc_id
		= ir_platform_mangle_global("_Jv_AllocObjectNoFinalizer");
	gcj_alloc_entity = new_entity(glob, gcj_alloc_id, gcj_alloc_method_type);
	set_entity_visibility(gcj_alloc_entity, ir_visibility_external);

	// gcj_init
	ir_type *gcj_init_method_type = new_type_method(1, 0, false, 0, 0);
	set_method_param_type(gcj_init_method_type, 0, t_ptr);

	ident *gcj_init_id = ir_platform_mangle_global("_Jv_InitClass");
	gcj_init_entity = new_entity(glob, gcj_init_id, gcj_init_method_type);
	set_entity_visibility(gcj_init_entity, ir_visibility_external);

	// gcj_new_string
	ir_type *gcj_new_string_method_type = new_type_method(1, 1, false, 0, 0);
	set_method_param_type(gcj_new_string_method_type, 0, t_ptr);
	set_method_res_type(gcj_new_string_method_type, 0, t_ptr);

	ident *gcj_new_string_id
		= ir_platform_mangle_global("_Z22_Jv_NewStringUtf8ConstP13_Jv_Utf8Const");
	gcj_new_string_entity = new_entity(glob, gcj_new_string_id, gcj_new_string_method_type);
	set_entity_visibility(gcj_new_string_entity, ir_visibility_external);

	// gcj_new_prim_array
	ir_type *gcj_new_prim_array_method_type
		= new_type_method(2, 1, false, 0, 0);
	set_method_param_type(gcj_new_prim_array_method_type, 0, t_ptr);
	set_method_param_type(gcj_new_prim_array_method_type, 1, t_size);
	set_method_res_type(gcj_new_prim_array_method_type, 0, t_ptr);

	ident *gcj_new_prim_array_id
		= ir_platform_mangle_global("_Jv_NewPrimArray");
	gcj_new_prim_array_entity = new_entity(glob, gcj_new_prim_array_id, gcj_new_prim_array_method_type);
	set_entity_visibility(gcj_new_prim_array_entity, ir_visibility_external);

	// gcj_new_object_array
	ir_type *gcj_new_object_array_method_type
		= new_type_method(3, 1, false, 0, 0);
	set_method_param_type(gcj_new_object_array_method_type, 0, t_size);
	set_method_param_type(gcj_new_object_array_method_type, 1, t_ptr);
	set_method_param_type(gcj_new_object_array_method_type, 2, t_ptr);
	set_method_res_type(gcj_new_object_array_method_type, 0, t_ptr);

	ident *gcj_new_object_array_id
		= ir_platform_mangle_global("_Jv_NewObjectArray");
	gcj_new_object_array_entity = new_entity(glob, gcj_new_object_array_id, gcj_new_object_array_method_type);
	set_entity_visibility(gcj_new_object_array_entity, ir_visibility_external);

	// gcji_abstract_method
	ir_type *gcj_abstract_method_type = new_type_method(0, 0, false, 0, 0);
	gcj_abstract_method_entity
		= new_entity(glob, ir_platform_mangle_global("_Jv_ThrowAbstractMethodError"), gcj_abstract_method_type);
	set_entity_visibility(gcj_abstract_method_entity, ir_visibility_external);

	// gcji_lookup_interface
	ir_type *gcj_lookup_interface_type = new_type_method(3, 1, false, 0, 0);
	set_method_param_type(gcj_lookup_interface_type, 0, t_ptr);
	set_method_param_type(gcj_lookup_interface_type, 1, t_ptr);
	set_method_param_type(gcj_lookup_interface_type, 2, t_ptr);
	set_method_res_type(gcj_lookup_interface_type, 0, t_ptr);
	gcj_lookup_interface_entity = new_entity(glob, ir_platform_mangle_global("_Jv_LookupInterfaceMethod"), gcj_lookup_interface_type);
	set_entity_visibility(gcj_lookup_interface_entity, ir_visibility_external);

	// gcji_instanceof
	ir_type *gcj_instanceof_type = new_type_method(2, 1, false, 0, 0);
	set_method_param_type(gcj_instanceof_type, 0, type_reference);
	set_method_param_type(gcj_instanceof_type, 1, type_reference);
	set_method_res_type(gcj_instanceof_type, 0, type_int);
	gcj_instanceof_entity = new_entity(glob, ir_platform_mangle_global("_Jv_IsInstanceOf"), gcj_instanceof_type);
	set_entity_visibility(gcj_instanceof_entity, ir_visibility_external);

	// gcji_checkcast
	ir_type *gcj_checkcast_type = new_type_method(2, 0, false, 0, 0);
	set_method_param_type(gcj_checkcast_type, 0, type_reference);
	set_method_param_type(gcj_checkcast_type, 1, type_reference);
	gcj_checkcast_entity = new_entity(glob, ir_platform_mangle_global("_Jv_CheckCast"), gcj_checkcast_type);
	set_entity_visibility(gcj_checkcast_entity, ir_visibility_external);

	// gcji_get_array_class
	ir_type *gcj_get_array_class_type = new_type_method(2, 1, false, 0, 0);
	set_method_param_type(gcj_get_array_class_type, 0, type_reference);
	set_method_param_type(gcj_get_array_class_type, 1, type_reference);
	set_method_res_type(gcj_get_array_class_type, 0, type_reference);
	gcj_get_array_class_entity
		= new_entity(glob, ir_platform_mangle_global("_Z17_Jv_GetArrayClassPN4java4lang5ClassEPNS0_11ClassLoaderE"), gcj_get_array_class_type);
	set_entity_visibility(gcj_get_array_class_entity, ir_visibility_external);

	// gcji_new_multi_array
	ir_type *gcj_new_multiarray_type = new_type_method(3, 1, false, 0, 0);
	set_method_param_type(gcj_new_multiarray_type, 0, type_reference);
	set_method_param_type(gcj_new_multiarray_type, 1, type_int);
	set_method_param_type(gcj_new_multiarray_type, 2, type_reference); // XXX: actually int[]
	set_method_res_type(gcj_new_multiarray_type, 0, type_reference);
	gcj_new_multiarray_entity
		= new_entity(glob, ir_platform_mangle_global("_Z17_Jv_NewMultiArrayPN4java4lang5ClassEiPi"), gcj_new_multiarray_type);
	set_entity_visibility(gcj_new_multiarray_entity, ir_visibility_external);

	// primitive classes
	gcj_boolean_rtti_entity= extvar("_Jv_booleanClass", type_reference);
	gcj_byte_rtti_entity   = extvar("_Jv_byteClass", type_reference);
	gcj_char_rtti_entity   = extvar("_Jv_charClass", type_reference);
	gcj_short_rtti_entity  = extvar("_Jv_shortClass", type_reference);
	gcj_int_rtti_entity    = extvar("_Jv_intClass", type_reference);
	gcj_long_rtti_entity   = extvar("_Jv_longClass", type_reference);
	gcj_float_rtti_entity  = extvar("_Jv_floatClass", type_reference);
	gcj_double_rtti_entity = extvar("_Jv_doubleClass", type_reference);

	mode_ushort = new_int_mode("US", 16, 0, 16);
	type_ushort = new_type_primitive(mode_ushort);

	cpset_init(&scp, scp_hash, scp_cmp);

	type_method_desc = create_method_desc_type();
	type_field_desc  = create_field_desc_type();
	type_utf8_const  = create_utf8_const_type();

	superobject_ident  = new_id_from_str("@base");

	ddispatch_set_vtable_layout(2, 4, 2, setup_vtable);
	ddispatch_set_abstract_method_entity(gcj_abstract_method_entity);
	ddispatch_set_interface_lookup_constructor(gcji_lookup_interface);

	/* we construct rtti right away */
	rtti_set_runtime_typeinfo_constructor(dummy);
	rtti_set_instanceof_constructor(gcji_instanceof);

	dmemory_set_allocation_methods(gcji_get_arraylength);
}