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; }
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; }
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; }
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; }
/* * 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); }
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; }
/** * 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; }
void eh_init(void) { obstack_init(&lpads); ir_type *type_reference = new_type_primitive(mode_P); exception_object_entity = new_entity(get_tls_type(), new_id_from_str("__oo_rt_exception_object__"), type_reference); set_entity_initializer(exception_object_entity, get_initializer_null()); ir_type *throw_type = new_type_method(1, 0); set_method_param_type(throw_type, 0, type_reference); throw_entity = new_entity(get_glob_type(), new_id_from_str("firm_personality"), throw_type); set_entity_visibility(throw_entity, ir_visibility_external); top = NULL; }
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); }
/** * @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; }
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); }