void create_gnu_builtins(void) { entity_t *(*b)(builtin_kind_t,const char*,type_t*) = create_gnu_builtin; b(BUILTIN_ALLOCA, "alloca", make_function_1_type(type_void_ptr, type_size_t, DM_NONE)); b(BUILTIN_INF, "huge_val", make_function_0_type(type_double, DM_CONST)); b(BUILTIN_INF, "huge_valf", make_function_0_type(type_float, DM_CONST)); b(BUILTIN_INF, "huge_vall", make_function_0_type(type_long_double, DM_CONST)); b(BUILTIN_INF, "inf", make_function_0_type(type_double, DM_CONST)); b(BUILTIN_INF, "inff", make_function_0_type(type_float, DM_CONST)); b(BUILTIN_INF, "infl", make_function_0_type(type_long_double, DM_CONST)); b(BUILTIN_NAN, "nan", make_function_1_type(type_double, type_char_ptr, DM_CONST)); b(BUILTIN_NAN, "nanf", make_function_1_type(type_float, type_char_ptr, DM_CONST)); b(BUILTIN_NAN, "nanl", make_function_1_type(type_long_double, type_char_ptr, DM_CONST)); b(BUILTIN_VA_END, "va_end", make_function_1_type(type_void, type_valist, DM_NONE)); b(BUILTIN_EXPECT, "expect", make_function_2_type(type_long, type_long, type_long, DM_CONST)); b(BUILTIN_OBJECT_SIZE, "object_size", make_function_2_type(type_size_t, type_void_ptr, type_int, DM_CONST)); entity_t *(*f)(ir_builtin_kind,const char*,type_t*) = create_gnu_builtin_firm; f(ir_bk_bswap, "bswap32", make_function_1_type(type_int32_t, type_int32_t, DM_CONST)); f(ir_bk_bswap, "bswap64", make_function_1_type(type_int64_t, type_int64_t, DM_CONST)); f(ir_bk_clz, "clz", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_clz, "clzl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_clz, "clzll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_ctz, "ctz", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_ctz, "ctzl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_ctz, "ctzll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_ffs, "ffs", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_ffs, "ffsl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_ffs, "ffsll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_frame_address, "frame_address", make_function_1_type(type_void_ptr, type_unsigned_int, DM_CONST)); f(ir_bk_parity, "parity", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_parity, "parityl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_parity, "parityll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_popcount, "popcount", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_popcount, "popcountl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_popcount, "popcountll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_prefetch, "prefetch", make_function_1_type_variadic(type_float, type_void_ptr, DM_NONE)); f(ir_bk_return_address, "return_address", make_function_1_type(type_void_ptr, type_unsigned_int, DM_CONST)); f(ir_bk_trap, "trap", make_function_type(type_void, 0, NULL, DM_NORETURN)); entity_t *(*s)(ir_builtin_kind,const char*,type_t*) = create_builtin_firm; type_t *template = type_builtin_template;
f(ir_bk_parity, "parityl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_parity, "parityll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_popcount, "popcount", make_function_1_type(type_int, type_unsigned_int, DM_CONST)); f(ir_bk_popcount, "popcountl", make_function_1_type(type_int, type_unsigned_long, DM_CONST)); f(ir_bk_popcount, "popcountll", make_function_1_type(type_int, type_unsigned_long_long, DM_CONST)); f(ir_bk_prefetch, "prefetch", make_function_1_type_variadic(type_float, type_void_ptr, DM_NONE)); f(ir_bk_return_address, "return_address", make_function_1_type(type_void_ptr, type_unsigned_int, DM_NONE)); f(ir_bk_trap, "trap", make_function_type(type_void, 0, NULL, DM_NORETURN)); entity_t *(*s)(ir_builtin_kind,const char*,type_t*) = create_builtin_firm; type_t *template = type_builtin_template; type_t *template_ptr = type_builtin_template_ptr; s(ir_bk_compare_swap, "__sync_val_compare_and_swap", make_function_type(template, 3, (type_t*[]) { template_ptr, template, template }, DM_NONE)); entity_t *(*l)(const char*,type_t*) = create_gnu_builtin_libc; l("abort", make_function_type(type_void, 0, NULL, DM_NORETURN)); l("abs", make_function_type(type_int, 1, (type_t *[]) { type_int }, DM_CONST)); l("fabs", make_function_type(type_double, 1, (type_t *[]) { type_double }, DM_CONST)); l("fabsf", make_function_type(type_float, 1, (type_t *[]) { type_float }, DM_CONST)); l("fabsl", make_function_type(type_long_double, 1, (type_t *[]) { type_long_double }, DM_CONST)); l("labs", make_function_type(type_long, 1, (type_t *[]) { type_long }, DM_CONST)); l("llabs", make_function_type(type_long_long, 1, (type_t *[]) { type_long_long }, DM_CONST)); l("memcpy", make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr_restrict, type_const_void_ptr_restrict, type_size_t }, DM_NONE)); l("memcmp", make_function_type(type_int, 3, (type_t *[]) { type_const_void_ptr, type_const_void_ptr, type_size_t }, DM_PURE)); l("memset", make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr, type_int, type_size_t }, DM_NONE)); l("memmove", make_function_type(type_void_ptr, 3, (type_t *[]) { type_void_ptr_restrict, type_const_void_ptr_restrict, type_size_t }, DM_NONE)); l("strcat", make_function_type(type_char_ptr, 2, (type_t *[]) { type_char_ptr_restrict, type_const_char_ptr_restrict }, DM_NONE)); l("strncat", make_function_type(type_char_ptr, 3, (type_t *[]) { type_char_ptr_restrict, type_const_char_ptr_restrict, type_size_t }, DM_NONE)); l("strlen", make_function_type(type_size_t, 1, (type_t *[]) { type_const_char_ptr }, DM_PURE)); l("strcmp", make_function_type(type_int, 2, (type_t *[]) { type_const_char_ptr, type_const_char_ptr }, DM_PURE)); l("strcpy", make_function_type(type_char_ptr, 2, (type_t *[]) { type_char_ptr_restrict, type_const_char_ptr_restrict }, DM_NONE));
static struct gdbarch * ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { struct gdbarch *gdbarch; struct gdbarch_tdep *tdep; struct type *void_type; struct type *func_void_type; /* If there is already a candidate, use it. */ arches = gdbarch_list_lookup_by_info (arches, &info); if (arches != NULL) return arches->gdbarch; /* Allocate space for the new architecture. */ tdep = XNEW (struct gdbarch_tdep); gdbarch = gdbarch_alloc (&info, tdep); /* Create a type for PC. We can't use builtin types here, as they may not be defined. */ void_type = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void"); func_void_type = make_function_type (void_type, NULL); tdep->pc_type = arch_type (gdbarch, TYPE_CODE_PTR, 4, NULL); TYPE_TARGET_TYPE (tdep->pc_type) = func_void_type; TYPE_UNSIGNED (tdep->pc_type) = 1; TYPE_INSTANCE_FLAGS (tdep->pc_type) |= TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; set_gdbarch_read_pc (gdbarch, ft32_read_pc); set_gdbarch_write_pc (gdbarch, ft32_write_pc); set_gdbarch_unwind_sp (gdbarch, ft32_unwind_sp); set_gdbarch_num_regs (gdbarch, FT32_NUM_REGS); set_gdbarch_sp_regnum (gdbarch, FT32_SP_REGNUM); set_gdbarch_pc_regnum (gdbarch, FT32_PC_REGNUM); set_gdbarch_register_name (gdbarch, ft32_register_name); set_gdbarch_register_type (gdbarch, ft32_register_type); set_gdbarch_return_value (gdbarch, ft32_return_value); set_gdbarch_pointer_to_address (gdbarch, ft32_pointer_to_address); set_gdbarch_skip_prologue (gdbarch, ft32_skip_prologue); set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_breakpoint_from_pc (gdbarch, ft32_breakpoint_from_pc); set_gdbarch_frame_align (gdbarch, ft32_frame_align); frame_base_set_default (gdbarch, &ft32_frame_base); /* Methods for saving / extracting a dummy frame's ID. The ID's stack address must match the SP value returned by PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */ set_gdbarch_dummy_id (gdbarch, ft32_dummy_id); set_gdbarch_unwind_pc (gdbarch, ft32_unwind_pc); set_gdbarch_print_insn (gdbarch, print_insn_ft32); /* Hook in ABI-specific overrides, if they have been registered. */ gdbarch_init_osabi (info, gdbarch); /* Hook in the default unwinders. */ frame_unwind_append_unwinder (gdbarch, &ft32_frame_unwind); /* Support simple overlay manager. */ set_gdbarch_overlay_update (gdbarch, simple_overlay_update); set_gdbarch_address_class_type_flags (gdbarch, ft32_address_class_type_flags); set_gdbarch_address_class_name_to_type_flags (gdbarch, ft32_address_class_name_to_type_flags); set_gdbarch_address_class_type_flags_to_name (gdbarch, ft32_address_class_type_flags_to_name); return gdbarch; }