void init_mode(void) { obstack_init(&modes); mode_list = NEW_ARR_F(ir_mode*, 0); /* initialize predefined modes */ mode_BB = new_non_data_mode("BB"); mode_X = new_non_data_mode("X"); mode_M = new_non_data_mode("M"); mode_T = new_non_data_mode("T"); mode_ANY = new_non_data_mode("ANY"); mode_BAD = new_non_data_mode("BAD"); mode_b = alloc_mode("b", irms_internal_boolean, irma_none, 1, 0, 0); mode_b = register_mode(mode_b); mode_F = new_float_mode("F", irma_ieee754, 8, 23, ir_overflow_min_max); mode_D = new_float_mode("D", irma_ieee754, 11, 52, ir_overflow_min_max); mode_Bs = new_int_mode("Bs", irma_twos_complement, 8, 1, 32); mode_Bu = new_int_mode("Bu", irma_twos_complement, 8, 0, 32); mode_Hs = new_int_mode("Hs", irma_twos_complement, 16, 1, 32); mode_Hu = new_int_mode("Hu", irma_twos_complement, 16, 0, 32); mode_Is = new_int_mode("Is", irma_twos_complement, 32, 1, 32); mode_Iu = new_int_mode("Iu", irma_twos_complement, 32, 0, 32); mode_Ls = new_int_mode("Ls", irma_twos_complement, 64, 1, 64); mode_Lu = new_int_mode("Lu", irma_twos_complement, 64, 0, 64); mode_P = new_reference_mode("P", irma_twos_complement, 32, 32); }
static void arm_create_runtime_entities(void) { if (divsi3 != NULL) return; ir_mode *mode_int = new_int_mode("arm_be_int", ARM_MACHINE_SIZE, true, ARM_MODULO_SHIFT); ir_mode *mode_uint = new_int_mode("arm_be_int", 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 *const mtps = make_divmod_type(int_tp); divsi3 = create_compilerlib_entity("__divsi3", mtps); modsi3 = create_compilerlib_entity("__modsi3", mtps); ir_type *const mtpu = make_divmod_type(uint_tp); udivsi3 = create_compilerlib_entity("__udivsi3", mtpu); umodsi3 = create_compilerlib_entity("__umodsi3", mtpu); }
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); }
void init_mode(void) { obstack_init(&modes); mode_list = NEW_ARR_F(ir_mode*, 0); /* initialize predefined modes */ mode_BB = new_internal_mode("BB", irms_block); mode_X = new_internal_mode("X", irms_control_flow); mode_M = new_internal_mode("M", irms_memory); mode_T = new_internal_mode("T", irms_tuple); mode_ANY = new_internal_mode("ANY", irms_any); mode_BAD = new_internal_mode("BAD", irms_bad); mode_b = new_internal_mode("b", irms_internal_boolean); mode_F = new_float_mode("F", irma_ieee754, 8, 23); mode_D = new_float_mode("D", irma_ieee754, 11, 52); mode_Q = new_float_mode("Q", irma_ieee754, 15, 112); mode_Bs = new_int_mode("Bs", irma_twos_complement, 8, 1, 32); mode_Bu = new_int_mode("Bu", irma_twos_complement, 8, 0, 32); mode_Hs = new_int_mode("Hs", irma_twos_complement, 16, 1, 32); mode_Hu = new_int_mode("Hu", irma_twos_complement, 16, 0, 32); mode_Is = new_int_mode("Is", irma_twos_complement, 32, 1, 32); mode_Iu = new_int_mode("Iu", irma_twos_complement, 32, 0, 32); mode_Ls = new_int_mode("Ls", irma_twos_complement, 64, 1, 64); mode_Lu = new_int_mode("Lu", irma_twos_complement, 64, 0, 64); mode_LLs = new_int_mode("LLs", irma_twos_complement, 128, 1, 128); mode_LLu = new_int_mode("LLu", irma_twos_complement, 128, 0, 128); mode_P = new_reference_mode("P", irma_twos_complement, 32, 32); set_reference_mode_signed_eq(mode_P, mode_Is); set_reference_mode_unsigned_eq(mode_P, mode_Iu); /* set the machine specific modes to the predefined ones */ mode_P_code = mode_P; mode_P_data = mode_P; }
static ir_mode *init_atomic_ir_mode(atomic_type_kind_t kind) { unsigned flags = get_atomic_type_flags(kind); unsigned size = get_atomic_type_size(kind); if (flags & ATOMIC_TYPE_FLAG_FLOAT) { if (kind == ATOMIC_TYPE_LONG_DOUBLE && dialect.long_double_x87_80bit_float) { assert(size == 12 || size == 16); return new_float_mode("F80", irma_x86_extended_float, 15, 64, target.float_int_overflow); } switch (size) { case 4: return new_float_mode("F32", irma_ieee754, 8, 23, target.float_int_overflow); case 8: return new_float_mode("F64", irma_ieee754, 11, 52, target.float_int_overflow); case 16: return new_float_mode("F128", irma_ieee754, 15, 112, target.float_int_overflow); default: panic("unexpected kind"); } } else if (flags & ATOMIC_TYPE_FLAG_INTEGER) { char name[64]; unsigned bit_size = size * 8; bool is_signed = (flags & ATOMIC_TYPE_FLAG_SIGNED) != 0; unsigned modulo_shift = decide_modulo_shift(bit_size); snprintf(name, sizeof(name), "%s%u", is_signed ? "I" : "U", bit_size); return new_int_mode(name, irma_twos_complement, bit_size, is_signed, modulo_shift); } return NULL; }
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); }