static void sh_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { linux_init_abi (info, gdbarch); /* GNU/Linux uses SVR4-style shared libraries. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Core files and signal handler frame unwinding are supported for 32-bit SH only, at present. */ if (info.bfd_arch_info->mach != bfd_mach_sh5) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* Remember regset characteristics. The sizes should match elf_gregset_t and elf_fpregset_t from Linux. */ tdep->core_gregmap = (struct sh_corefile_regmap *)gregs_table; tdep->sizeof_gregset = 92; tdep->core_fpregmap = (struct sh_corefile_regmap *)fpregs_table; tdep->sizeof_fpregset = 136; tramp_frame_prepend_unwinder (gdbarch, &sh_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &sh_linux_rt_sigreturn_tramp_frame); } }
static void nios2_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = new_gdbarch_tdep(gdbarch); linux_init_abi (info, gdbarch); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Core file support. */ set_gdbarch_regset_from_core_section (gdbarch, nios2_regset_from_core_section); /* Linux signal frame unwinders. */ tramp_frame_prepend_unwinder (gdbarch, &nios2_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &nios2_linux_rt_sigreturn_tramp_frame); tdep->syscall_next_pc = nios2_linux_syscall_next_pc; /* Index of target address word in glibc jmp_buf. */ tdep->jb_pc = 10; }
static void mips_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { enum mips_abi abi = mips_abi (gdbarch); /* Generic FreeBSD support. */ fbsd_init_abi (info, gdbarch); set_gdbarch_software_single_step (gdbarch, mips_software_single_step); switch (abi) { case MIPS_ABI_O32: tramp_frame_prepend_unwinder (gdbarch, &mips_fbsd_sigframe); break; case MIPS_ABI_N32: tramp_frame_prepend_unwinder (gdbarch, &mipsn32_fbsd_sigframe); break; case MIPS_ABI_N64: tramp_frame_prepend_unwinder (gdbarch, &mips64_fbsd_sigframe); break; } set_gdbarch_iterate_over_regset_sections (gdbarch, mips_fbsd_iterate_over_regset_sections); /* FreeBSD/mips has SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, (gdbarch_ptr_bit (gdbarch) == 32 ? mips_fbsd_ilp32_fetch_link_map_offsets : mips_fbsd_lp64_fetch_link_map_offsets)); }
static void i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* Obviously NetBSD is BSD-based. */ i386bsd_init_abi (info, gdbarch); /* NetBSD has a different `struct reg'. */ tdep->gregset_reg_offset = i386nbsd_r_reg_offset; tdep->gregset_num_regs = ARRAY_SIZE (i386nbsd_r_reg_offset); tdep->sizeof_gregset = 16 * 4; /* NetBSD uses -freg-struct-return by default. */ tdep->struct_return = reg_struct_return; /* NetBSD uses tramp_frame sniffers for signal trampolines. */ tdep->sigcontext_addr= 0; tdep->sigtramp_start = 0; tdep->sigtramp_end = 0; tdep->sigtramp_p = 0; tdep->sc_reg_offset = 0; tdep->sc_num_regs = 0; tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_sc16); tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_sc2); tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si2); tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si31); tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si4); }
static void alphanbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* Hook into the DWARF CFI frame unwinder. */ alpha_dwarf2_init_abi (info, gdbarch); /* Hook into the MDEBUG frame unwinder. */ alpha_mdebug_init_abi (info, gdbarch); /* NetBSD/alpha does not provide single step support via ptrace(2); we must use software single-stepping. */ set_gdbarch_software_single_step (gdbarch, alpha_software_single_step); /* NetBSD/alpha has SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); #ifdef notyet tdep->dynamic_sigtramp_offset = alphanbsd_sigtramp_offset; tdep->pc_in_sigtramp = alphanbsd_pc_in_sigtramp; tdep->sigcontext_addr = alphanbsd_sigcontext_addr; #endif tdep->jb_pc = 2; tdep->jb_elt_size = 8; set_gdbarch_regset_from_core_section (gdbarch, alphanbsd_regset_from_core_section); tramp_frame_prepend_unwinder (gdbarch, &alphanbsd_sigtramp_sc1); tramp_frame_prepend_unwinder (gdbarch, &alphanbsd_sigtramp_si2); tramp_frame_prepend_unwinder (gdbarch, &alphanbsd_sigtramp_si4); }
static void arm_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->lowest_pc = 0x8000; if (info.byte_order == BFD_ENDIAN_BIG) { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_be_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_be_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint; } else { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_le_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_le_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint; } tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint); tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint); if (tdep->fp_model == ARM_FLOAT_AUTO) tdep->fp_model = ARM_FLOAT_FPA; tdep->jb_pc = ARM_LINUX_JB_PC; tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE; set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* The following override shouldn't be needed. */ set_gdbarch_deprecated_extract_return_value (gdbarch, arm_linux_extract_return_value); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_rt_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_rt_sigreturn_tramp_frame); }
static void am33_linux_init_osabi (struct gdbarch_info gdbinfo, struct gdbarch *gdbarch) { set_gdbarch_regset_from_core_section (gdbarch, am33_regset_from_core_section); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); tramp_frame_prepend_unwinder (gdbarch, &am33_linux_sigframe); tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe); }
static void am33_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch) { linux_init_abi (info, gdbarch); set_gdbarch_iterate_over_regset_sections (gdbarch, am33_iterate_over_regset_sections); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); tramp_frame_prepend_unwinder (gdbarch, &am33_linux_sigframe); tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe); }
static void tilegx_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { int arch_size = gdbarch_addr_bit (gdbarch); linux_init_abi (info, gdbarch); tramp_frame_prepend_unwinder (gdbarch, &tilegx_linux_rt_sigframe); set_gdbarch_iterate_over_regset_sections (gdbarch, tilegx_iterate_over_regset_sections); /* GNU/Linux uses SVR4-style shared libraries. */ if (arch_size == 32) set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); else set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); }
static void riscv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { linux_init_abi (info, gdbarch); set_gdbarch_software_single_step (gdbarch, riscv_software_single_step); set_solib_svr4_fetch_link_map_offsets (gdbarch, (riscv_isa_xlen (gdbarch) == 4 ? svr4_ilp32_fetch_link_map_offsets : svr4_lp64_fetch_link_map_offsets)); /* GNU/Linux uses SVR4-style shared libraries. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); /* GNU/Linux uses the dynamic linker included in the GNU C Library. */ set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); set_gdbarch_iterate_over_regset_sections (gdbarch, riscv_linux_iterate_over_regset_sections); tramp_frame_prepend_unwinder (gdbarch, &riscv_linux_sigframe); }
static void mips_irix_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { set_solib_ops (gdbarch, &irix_so_ops); tramp_frame_prepend_unwinder (gdbarch, &mips_irix_n32_tramp_frame); }
static void ppcnbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { /* For NetBSD, this is an on again, off again thing. Some systems do use the broken struct convention, and some don't. */ set_gdbarch_return_value (gdbarch, ppcnbsd_return_value); /* NetBSD uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); set_gdbarch_regset_from_core_section (gdbarch, ppcnbsd_regset_from_core_section); tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd_sigtramp); tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd2_sigtramp); }
static void sparc32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); linux_init_abi (info, gdbarch); tdep->gregset = regset_alloc (gdbarch, sparc32_linux_supply_core_gregset, sparc32_linux_collect_core_gregset); tdep->sizeof_gregset = 152; tdep->fpregset = regset_alloc (gdbarch, sparc32_linux_supply_core_fpregset, sparc32_linux_collect_core_fpregset); tdep->sizeof_fpregset = 396; tramp_frame_prepend_unwinder (gdbarch, &sparc32_linux_sigframe); tramp_frame_prepend_unwinder (gdbarch, &sparc32_linux_rt_sigframe); /* GNU/Linux has SVR4-style shared libraries... */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* ...which means that we need some special handling when doing prologue analysis. */ tdep->plt_entry_size = 12; /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Make sure we can single-step over signal return system calls. */ tdep->step_trap = sparc32_linux_step_trap; /* Hook in the DWARF CFI frame unwinder. */ dwarf2_append_unwinders (gdbarch); set_gdbarch_write_pc (gdbarch, sparc_linux_write_pc); /* Functions for 'catch syscall'. */ set_xml_syscall_file_name (XML_SYSCALL_FILENAME_SPARC32); set_gdbarch_get_syscall_number (gdbarch, sparc32_linux_get_syscall_number); }
static void m68kbsd_aout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); m68kbsd_init_abi (info, gdbarch); tdep->struct_return = reg_struct_return; tramp_frame_prepend_unwinder (gdbarch, &m68kobsd_sigtramp); }
static void hppanbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { /* Obviously NetBSD is BSD-based. */ hppabsd_init_abi (info, gdbarch); /* Core file support. */ set_gdbarch_regset_from_core_section (gdbarch, hppanbsd_regset_from_core_section); tramp_frame_prepend_unwinder (gdbarch, &hppanbsd_sigtramp_si4); }
static void bfin_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { linux_init_abi (info, gdbarch); /* Set the sigtramp frame sniffer. */ tramp_frame_prepend_unwinder (gdbarch, &bfin_linux_sigframe); /* Functions for 'catch syscall'. */ set_xml_syscall_file_name (gdbarch, "syscalls/bfin-linux.xml"); set_gdbarch_get_syscall_number (gdbarch, bfin_linux_get_syscall_number); }
static void mips64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { /* OpenBSD/mips64 only supports the n64 ABI, but the braindamaged way GDB works, forces us to pretend we can handle them all. */ set_gdbarch_regset_from_core_section (gdbarch, mips64obsd_regset_from_core_section); tramp_frame_prepend_unwinder (gdbarch, &mips64obsd_sigframe); /* OpenBSD/mips64 has SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); }
static void aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { static const char *const stap_integer_prefixes[] = { "#", "", NULL }; static const char *const stap_register_prefixes[] = { "", NULL }; static const char *const stap_register_indirection_prefixes[] = { "[", NULL }; static const char *const stap_register_indirection_suffixes[] = { "]", NULL }; struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->lowest_pc = 0x8000; linux_init_abi (info, gdbarch); if (tdep->ilp32) set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); else set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type); tramp_frame_prepend_unwinder (gdbarch, &aarch64_linux_rt_sigframe); /* Enable longjmp. */ tdep->jb_pc = 11; set_gdbarch_regset_from_core_section (gdbarch, aarch64_linux_regset_from_core_section); /* SystemTap related. */ set_gdbarch_stap_integer_prefix (gdbarch, stap_integer_prefixes); set_gdbarch_stap_register_prefix (gdbarch, stap_register_prefixes); set_gdbarch_stap_register_indirection_prefix (gdbarch, stap_register_indirection_prefixes); set_gdbarch_stap_register_indirection_suffix (gdbarch, stap_register_indirection_suffixes); set_gdbarch_stap_is_single_operand (gdbarch, aarch64_stap_is_single_operand); set_gdbarch_stap_parse_special_token (gdbarch, aarch64_stap_parse_special_token); }
static void microblaze_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { linux_init_abi (info, gdbarch); set_gdbarch_memory_remove_breakpoint (gdbarch, microblaze_linux_memory_remove_breakpoint); /* Shared library handling. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Trampolines. */ tramp_frame_prepend_unwinder (gdbarch, µblaze_linux_sighandler_tramp_frame); }
static void armobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); if (tdep->fp_model == ARM_FLOAT_AUTO) tdep->fp_model = ARM_FLOAT_SOFT_VFP; tramp_frame_prepend_unwinder (gdbarch, &armobsd_sigframe); /* OpenBSD/arm uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); set_gdbarch_skip_solib_resolver (gdbarch, obsd_skip_solib_resolver); tdep->jb_pc = 24; tdep->jb_elt_size = 4; set_gdbarch_regset_from_core_section (gdbarch, armbsd_regset_from_core_section); /* OpenBSD/arm uses -fpcc-struct-return by default. */ tdep->struct_return = pcc_struct_return; /* Single stepping. */ set_gdbarch_software_single_step (gdbarch, arm_software_single_step); /* Breakpoints. */ switch (info.byte_order) { case BFD_ENDIAN_BIG: tdep->thumb_breakpoint = arm_obsd_thumb_be_breakpoint; tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_be_breakpoint); break; case BFD_ENDIAN_LITTLE: tdep->thumb_breakpoint = arm_obsd_thumb_le_breakpoint; tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_le_breakpoint); break; } }
static void mips64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { /* OpenBSD/mips64 only supports the n64 ABI, but the braindamaged way GDB works, forces us to pretend we can handle them all. */ set_gdbarch_iterate_over_regset_sections (gdbarch, mips64obsd_iterate_over_regset_sections); tramp_frame_prepend_unwinder (gdbarch, &mips64obsd_sigframe); set_gdbarch_long_double_bit (gdbarch, 128); set_gdbarch_long_double_format (gdbarch, floatformats_mips64_quad); obsd_init_abi(info, gdbarch); /* OpenBSD/mips64 has SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); }
static void tic6x_uclinux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); linux_init_abi (info, gdbarch); /* Shared library handling. */ set_solib_ops (gdbarch, &dsbt_so_ops); tdep->syscall_next_pc = tic6x_linux_syscall_next_pc; #ifdef HAVE_ELF /* In tic6x Linux kernel, breakpoint instructions varies on different archs. On C64x+ and C67x+, breakpoint instruction is 0x56454314, which is an illegal opcode. On other arch, breakpoint instruction is 0x0000a122 (BNOP .S2 0,5). */ if (info.abfd) switch (bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC, Tag_ISA)) { case C6XABI_Tag_ISA_C64XP: case C6XABI_Tag_ISA_C67XP: if (info.byte_order == BFD_ENDIAN_BIG) tdep->breakpoint = tic6x_bkpt_illegal_opcode_be; else tdep->breakpoint = tic6x_bkpt_illegal_opcode_le; break; default: { if (info.byte_order == BFD_ENDIAN_BIG) tdep->breakpoint = tic6x_bkpt_bnop_be; else tdep->breakpoint = tic6x_bkpt_bnop_le; } } #endif /* Signal trampoline support. */ tramp_frame_prepend_unwinder (gdbarch, &tic6x_linux_rt_sigreturn_tramp_frame); }
static void sparc64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = new_gdbarch_tdep(gdbarch); tramp_frame_prepend_unwinder (gdbarch, &sparc64_linux_rt_sigframe); sparc64_init_abi (info, gdbarch); /* GNU/Linux has SVR4-style shared libraries... */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); /* ...which means that we need some special handling when doing prologue analysis. */ tdep->plt_entry_size = 16; /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); }
static void csky_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { linux_init_abi (info, gdbarch); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Core file support. */ set_gdbarch_iterate_over_regset_sections ( gdbarch, csky_linux_iterate_over_regset_sections); /* Append tramp frame unwinder for SIGNAL. */ tramp_frame_prepend_unwinder (gdbarch, &csky_linux_rt_sigreturn_tramp_frame); }
static void ppc_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* NOTE: jimb/2004-03-26: The System V ABI PowerPC Processor Supplement says that long doubles are sixteen bytes long. However, as one of the known warts of its ABI, PPC GNU/Linux uses eight-byte long doubles. GCC only recently got 128-bit long double support on PPC, so it may be changing soon. The Linux[sic] Standards Base says that programs that use 'long double' on PPC GNU/Linux are non-conformant. */ /* NOTE: cagney/2005-01-25: True for both 32- and 64-bit. */ set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT); /* Handle PPC GNU/Linux 64-bit function pointers (which are really function descriptors) and 32-bit secure PLT entries. */ set_gdbarch_convert_from_func_ptr_addr (gdbarch, ppc_linux_convert_from_func_ptr_addr); if (tdep->wordsize == 4) { /* Until November 2001, gcc did not comply with the 32 bit SysV R4 ABI requirement that structures less than or equal to 8 bytes should be returned in registers. Instead GCC was using the the AIX/PowerOpen ABI - everything returned in memory (well ignoring vectors that is). When this was corrected, it wasn't fixed for GNU/Linux native platform. Use the PowerOpen struct convention. */ set_gdbarch_return_value (gdbarch, ppc_linux_return_value); set_gdbarch_memory_remove_breakpoint (gdbarch, ppc_linux_memory_remove_breakpoint); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, ppc_linux_skip_trampoline_code); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Trampolines. */ tramp_frame_prepend_unwinder (gdbarch, &ppc32_linux_sigaction_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &ppc32_linux_sighandler_tramp_frame); } if (tdep->wordsize == 8) { /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); /* Trampolines. */ tramp_frame_prepend_unwinder (gdbarch, &ppc64_linux_sigaction_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &ppc64_linux_sighandler_tramp_frame); } set_gdbarch_regset_from_core_section (gdbarch, ppc_linux_regset_from_core_section); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); }
static void mips_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum mips_abi abi = mips_abi (gdbarch); struct tdesc_arch_data *tdesc_data = (void *) info.tdep_info; linux_init_abi (info, gdbarch); switch (abi) { case MIPS_ABI_O32: set_gdbarch_get_longjmp_target (gdbarch, mips_linux_get_longjmp_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_sigframe); tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_rt_sigframe); break; case MIPS_ABI_N32: set_gdbarch_get_longjmp_target (gdbarch, mips_linux_get_longjmp_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); set_gdbarch_long_double_bit (gdbarch, 128); /* These floatformats should probably be renamed. MIPS uses the same 128-bit IEEE floating point format that IA-64 uses, except that the quiet/signalling NaN bit is reversed (GDB does not distinguish between quiet and signalling NaNs). */ set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad); tramp_frame_prepend_unwinder (gdbarch, &mips_linux_n32_rt_sigframe); break; case MIPS_ABI_N64: set_gdbarch_get_longjmp_target (gdbarch, mips64_linux_get_longjmp_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); set_gdbarch_long_double_bit (gdbarch, 128); /* These floatformats should probably be renamed. MIPS uses the same 128-bit IEEE floating point format that IA-64 uses, except that the quiet/signalling NaN bit is reversed (GDB does not distinguish between quiet and signalling NaNs). */ set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad); tramp_frame_prepend_unwinder (gdbarch, &mips_linux_n64_rt_sigframe); break; default: break; } set_gdbarch_skip_solib_resolver (gdbarch, mips_linux_skip_resolver); set_gdbarch_software_single_step (gdbarch, mips_software_single_step); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Initialize this lazily, to avoid an initialization order dependency on solib-svr4.c's _initialize routine. */ if (mips_svr4_so_ops.in_dynsym_resolve_code == NULL) { mips_svr4_so_ops = svr4_so_ops; mips_svr4_so_ops.in_dynsym_resolve_code = mips_linux_in_dynsym_resolve_code; } set_solib_ops (gdbarch, &mips_svr4_so_ops); set_gdbarch_write_pc (gdbarch, mips_linux_write_pc); set_gdbarch_core_read_description (gdbarch, mips_linux_core_read_description); set_gdbarch_regset_from_core_section (gdbarch, mips_linux_regset_from_core_section); tdep->syscall_next_pc = mips_linux_syscall_next_pc; if (tdesc_data) { const struct tdesc_feature *feature; /* If we have target-described registers, then we can safely reserve a number for MIPS_RESTART_REGNUM (whether it is described or not). */ gdb_assert (gdbarch_num_regs (gdbarch) <= MIPS_RESTART_REGNUM); set_gdbarch_num_regs (gdbarch, MIPS_RESTART_REGNUM + 1); set_gdbarch_num_pseudo_regs (gdbarch, MIPS_RESTART_REGNUM + 1); /* If it's present, then assign it to the reserved number. */ feature = tdesc_find_feature (info.target_desc, "org.gnu.gdb.mips.linux"); if (feature != NULL) tdesc_numbered_register (feature, tdesc_data, MIPS_RESTART_REGNUM, "restart"); } }
static void arm_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->lowest_pc = 0x8000; if (info.byte_order == BFD_ENDIAN_BIG) { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_be_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_be_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint; tdep->thumb2_breakpoint = arm_linux_thumb2_be_breakpoint; } else { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_le_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_le_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint; tdep->thumb2_breakpoint = arm_linux_thumb2_le_breakpoint; } tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint); tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint); tdep->thumb2_breakpoint_size = sizeof (arm_linux_thumb2_le_breakpoint); if (tdep->fp_model == ARM_FLOAT_AUTO) tdep->fp_model = ARM_FLOAT_FPA; switch (tdep->fp_model) { case ARM_FLOAT_FPA: tdep->jb_pc = ARM_LINUX_JB_PC_FPA; break; case ARM_FLOAT_SOFT_FPA: case ARM_FLOAT_SOFT_VFP: case ARM_FLOAT_VFP: tdep->jb_pc = ARM_LINUX_JB_PC_EABI; break; default: internal_error (__FILE__, __LINE__, _("arm_linux_init_abi: Floating point model not supported")); break; } tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE; set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Single stepping. */ set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_rt_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_rt_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_restart_syscall_tramp_frame); /* Core file support. */ set_gdbarch_regset_from_core_section (gdbarch, arm_linux_regset_from_core_section); set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type); /* Displaced stepping. */ set_gdbarch_displaced_step_copy_insn (gdbarch, arm_linux_displaced_step_copy_insn); set_gdbarch_displaced_step_fixup (gdbarch, arm_displaced_step_fixup); set_gdbarch_displaced_step_free_closure (gdbarch, simple_displaced_step_free_closure); set_gdbarch_displaced_step_location (gdbarch, displaced_step_at_entry_point); }
static void aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { static const char *const stap_integer_prefixes[] = { "#", "", NULL }; static const char *const stap_register_prefixes[] = { "", NULL }; static const char *const stap_register_indirection_prefixes[] = { "[", NULL }; static const char *const stap_register_indirection_suffixes[] = { "]", NULL }; struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->lowest_pc = 0x8000; linux_init_abi (info, gdbarch); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); tramp_frame_prepend_unwinder (gdbarch, &aarch64_linux_rt_sigframe); /* Enable longjmp. */ tdep->jb_pc = 11; set_gdbarch_iterate_over_regset_sections (gdbarch, aarch64_linux_iterate_over_regset_sections); /* SystemTap related. */ set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes); set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes); set_gdbarch_stap_register_indirection_prefixes (gdbarch, stap_register_indirection_prefixes); set_gdbarch_stap_register_indirection_suffixes (gdbarch, stap_register_indirection_suffixes); set_gdbarch_stap_is_single_operand (gdbarch, aarch64_stap_is_single_operand); set_gdbarch_stap_parse_special_token (gdbarch, aarch64_stap_parse_special_token); /* Reversible debugging, process record. */ set_gdbarch_process_record (gdbarch, aarch64_process_record); /* Syscall record. */ tdep->aarch64_syscall_record = aarch64_linux_syscall_record; /* Initialize the aarch64_linux_record_tdep. */ /* These values are the size of the type that will be used in a system call. They are obtained from Linux Kernel source. */ aarch64_linux_record_tdep.size_pointer = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; aarch64_linux_record_tdep.size__old_kernel_stat = 32; aarch64_linux_record_tdep.size_tms = 32; aarch64_linux_record_tdep.size_loff_t = 8; aarch64_linux_record_tdep.size_flock = 32; aarch64_linux_record_tdep.size_oldold_utsname = 45; aarch64_linux_record_tdep.size_ustat = 32; aarch64_linux_record_tdep.size_old_sigaction = 152; aarch64_linux_record_tdep.size_old_sigset_t = 128; aarch64_linux_record_tdep.size_rlimit = 16; aarch64_linux_record_tdep.size_rusage = 144; aarch64_linux_record_tdep.size_timeval = 16; aarch64_linux_record_tdep.size_timezone = 8; aarch64_linux_record_tdep.size_old_gid_t = 2; aarch64_linux_record_tdep.size_old_uid_t = 2; aarch64_linux_record_tdep.size_fd_set = 128; aarch64_linux_record_tdep.size_dirent = 280; aarch64_linux_record_tdep.size_dirent64 = 280; aarch64_linux_record_tdep.size_statfs = 120; aarch64_linux_record_tdep.size_statfs64 = 120; aarch64_linux_record_tdep.size_sockaddr = 16; aarch64_linux_record_tdep.size_int = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT; aarch64_linux_record_tdep.size_long = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; aarch64_linux_record_tdep.size_ulong = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; aarch64_linux_record_tdep.size_msghdr = 56; aarch64_linux_record_tdep.size_itimerval = 32; aarch64_linux_record_tdep.size_stat = 144; aarch64_linux_record_tdep.size_old_utsname = 325; aarch64_linux_record_tdep.size_sysinfo = 112; aarch64_linux_record_tdep.size_msqid_ds = 120; aarch64_linux_record_tdep.size_shmid_ds = 112; aarch64_linux_record_tdep.size_new_utsname = 390; aarch64_linux_record_tdep.size_timex = 208; aarch64_linux_record_tdep.size_mem_dqinfo = 24; aarch64_linux_record_tdep.size_if_dqblk = 72; aarch64_linux_record_tdep.size_fs_quota_stat = 80; aarch64_linux_record_tdep.size_timespec = 16; aarch64_linux_record_tdep.size_pollfd = 8; aarch64_linux_record_tdep.size_NFS_FHSIZE = 32; aarch64_linux_record_tdep.size_knfsd_fh = 132; aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16; aarch64_linux_record_tdep.size_sigaction = 152; aarch64_linux_record_tdep.size_sigset_t = 128; aarch64_linux_record_tdep.size_siginfo_t = 128; aarch64_linux_record_tdep.size_cap_user_data_t = 8; aarch64_linux_record_tdep.size_stack_t = 24; aarch64_linux_record_tdep.size_off_t = 8; aarch64_linux_record_tdep.size_stat64 = 144; aarch64_linux_record_tdep.size_gid_t = 4; aarch64_linux_record_tdep.size_uid_t = 4; aarch64_linux_record_tdep.size_PAGE_SIZE = 4096; aarch64_linux_record_tdep.size_flock64 = 32; aarch64_linux_record_tdep.size_user_desc = 16; aarch64_linux_record_tdep.size_io_event = 32; aarch64_linux_record_tdep.size_iocb = 64; aarch64_linux_record_tdep.size_epoll_event = 12; aarch64_linux_record_tdep.size_itimerspec = 32; aarch64_linux_record_tdep.size_mq_attr = 64; aarch64_linux_record_tdep.size_siginfo = 128; aarch64_linux_record_tdep.size_termios = 60; aarch64_linux_record_tdep.size_termios2 = 44; aarch64_linux_record_tdep.size_pid_t = 4; aarch64_linux_record_tdep.size_winsize = 8; aarch64_linux_record_tdep.size_serial_struct = 72; aarch64_linux_record_tdep.size_serial_icounter_struct = 80; aarch64_linux_record_tdep.size_hayes_esp_config = 12; aarch64_linux_record_tdep.size_size_t = 8; aarch64_linux_record_tdep.size_iovec = 16; /* These values are the second argument of system call "sys_ioctl". They are obtained from Linux Kernel source. */ aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401; aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402; aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403; aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404; aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405; aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406; aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407; aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408; aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409; aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a; aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b; aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c; aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d; aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e; aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f; aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410; aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411; aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412; aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413; aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414; aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415; aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416; aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417; aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418; aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419; aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a; aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b; aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b; aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c; aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d; aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e; aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f; aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420; aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421; aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422; aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423; aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424; aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425; aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426; aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427; aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428; aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429; aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a; aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b; aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c; aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d; aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430; aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431; aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450; aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451; aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452; aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453; aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454; aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455; aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456; aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457; aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458; aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459; aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a; aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b; aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c; aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d; aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e; aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f; aarch64_linux_record_tdep.ioctl_FIOQSIZE = 0x5460; /* These values are the second argument of system call "sys_fcntl" and "sys_fcntl64". They are obtained from Linux Kernel source. */ aarch64_linux_record_tdep.fcntl_F_GETLK = 5; aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12; aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13; aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14; /* The AArch64 syscall calling convention: reg x0-x6 for arguments, reg x8 for syscall number and return value in reg x0. */ aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0; aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1; aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2; aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4; aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5; aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6; /* `catch syscall' */ set_xml_syscall_file_name (gdbarch, "syscalls/aarch64-linux.xml"); set_gdbarch_get_syscall_number (gdbarch, aarch64_linux_get_syscall_number); /* Displaced stepping. */ set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS); set_gdbarch_displaced_step_copy_insn (gdbarch, aarch64_displaced_step_copy_insn); set_gdbarch_displaced_step_fixup (gdbarch, aarch64_displaced_step_fixup); set_gdbarch_displaced_step_free_closure (gdbarch, simple_displaced_step_free_closure); set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location); set_gdbarch_displaced_step_hw_singlestep (gdbarch, aarch64_displaced_step_hw_singlestep); }
static void arm_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { static const char *const stap_integer_prefixes[] = { "#", NULL }; static const char *const stap_register_prefixes[] = { "r", NULL }; static const char *const stap_register_indirection_prefixes[] = { "[", NULL }; static const char *const stap_register_indirection_suffixes[] = { "]", NULL }; struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); linux_init_abi (info, gdbarch); tdep->lowest_pc = 0x8000; if (info.byte_order == BFD_ENDIAN_BIG) { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_be_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_be_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint; tdep->thumb2_breakpoint = arm_linux_thumb2_be_breakpoint; } else { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_le_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_le_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint; tdep->thumb2_breakpoint = arm_linux_thumb2_le_breakpoint; } tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint); tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint); tdep->thumb2_breakpoint_size = sizeof (arm_linux_thumb2_le_breakpoint); if (tdep->fp_model == ARM_FLOAT_AUTO) tdep->fp_model = ARM_FLOAT_FPA; switch (tdep->fp_model) { case ARM_FLOAT_FPA: tdep->jb_pc = ARM_LINUX_JB_PC_FPA; break; case ARM_FLOAT_SOFT_FPA: case ARM_FLOAT_SOFT_VFP: case ARM_FLOAT_VFP: tdep->jb_pc = ARM_LINUX_JB_PC_EABI; break; default: internal_error (__FILE__, __LINE__, _("arm_linux_init_abi: Floating point model not supported")); break; } tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE; set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Single stepping. */ set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_rt_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_rt_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_restart_syscall_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_kernel_linux_restart_syscall_tramp_frame); /* Core file support. */ set_gdbarch_regset_from_core_section (gdbarch, arm_linux_regset_from_core_section); set_gdbarch_core_read_description (gdbarch, arm_linux_core_read_description); if (tdep->have_vfp_registers) set_gdbarch_core_regset_sections (gdbarch, arm_linux_vfp_regset_sections); else if (tdep->have_fpa_registers) set_gdbarch_core_regset_sections (gdbarch, arm_linux_fpa_regset_sections); set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type); /* Displaced stepping. */ set_gdbarch_displaced_step_copy_insn (gdbarch, arm_linux_displaced_step_copy_insn); set_gdbarch_displaced_step_fixup (gdbarch, arm_displaced_step_fixup); set_gdbarch_displaced_step_free_closure (gdbarch, simple_displaced_step_free_closure); set_gdbarch_displaced_step_location (gdbarch, displaced_step_at_entry_point); /* Reversible debugging, process record. */ set_gdbarch_process_record (gdbarch, arm_process_record); /* SystemTap functions. */ set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes); set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes); set_gdbarch_stap_register_indirection_prefixes (gdbarch, stap_register_indirection_prefixes); set_gdbarch_stap_register_indirection_suffixes (gdbarch, stap_register_indirection_suffixes); set_gdbarch_stap_gdb_register_prefix (gdbarch, "r"); set_gdbarch_stap_is_single_operand (gdbarch, arm_stap_is_single_operand); set_gdbarch_stap_parse_special_token (gdbarch, arm_stap_parse_special_token); tdep->syscall_next_pc = arm_linux_syscall_next_pc; /* `catch syscall' */ set_xml_syscall_file_name ("syscalls/arm-linux.xml"); set_gdbarch_get_syscall_number (gdbarch, arm_linux_get_syscall_number); /* Syscall record. */ tdep->arm_swi_record = NULL; }
static void arm_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); linux_init_abi (info, gdbarch); tdep->lowest_pc = 0x8000; if (info.byte_order == BFD_ENDIAN_BIG) { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_be_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_be_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint; tdep->thumb2_breakpoint = arm_linux_thumb2_be_breakpoint; } else { if (tdep->arm_abi == ARM_ABI_AAPCS) tdep->arm_breakpoint = eabi_linux_arm_le_breakpoint; else tdep->arm_breakpoint = arm_linux_arm_le_breakpoint; tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint; tdep->thumb2_breakpoint = arm_linux_thumb2_le_breakpoint; } tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint); tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint); tdep->thumb2_breakpoint_size = sizeof (arm_linux_thumb2_le_breakpoint); if (tdep->fp_model == ARM_FLOAT_AUTO) tdep->fp_model = ARM_FLOAT_FPA; switch (tdep->fp_model) { case ARM_FLOAT_FPA: tdep->jb_pc = ARM_LINUX_JB_PC_FPA; break; case ARM_FLOAT_SOFT_FPA: case ARM_FLOAT_SOFT_VFP: case ARM_FLOAT_VFP: tdep->jb_pc = ARM_LINUX_JB_PC_EABI; break; default: internal_error (__FILE__, __LINE__, _("arm_linux_init_abi: Floating point model not supported")); break; } if (is_target_linux_android ()) tdep->jb_pc = ARM_ANDROID_JB_PC; tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE; set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Single stepping. */ set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step); /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); if (is_target_linux_android ()) /* This is incomplete, we can't singlestep through the handler back to the interrupted code, address 0xffff0500 is inaccessible. This is really a temp hack until there's libc additions to put the trampoline code in user space. */ frame_unwind_prepend_unwinder (gdbarch, &arm_android_sigreturn_tramp_frame); else { /* This indentation is on purpose to minimize whitespace changes. */ tramp_frame_prepend_unwinder (gdbarch, &arm_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_rt_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_eabi_linux_rt_sigreturn_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_linux_restart_syscall_tramp_frame); tramp_frame_prepend_unwinder (gdbarch, &arm_kernel_linux_restart_syscall_tramp_frame); } /* Core file support. */ set_gdbarch_regset_from_core_section (gdbarch, arm_linux_regset_from_core_section); set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type); /* Displaced stepping. */ set_gdbarch_displaced_step_copy_insn (gdbarch, arm_linux_displaced_step_copy_insn); set_gdbarch_displaced_step_fixup (gdbarch, arm_displaced_step_fixup); set_gdbarch_displaced_step_free_closure (gdbarch, simple_displaced_step_free_closure); set_gdbarch_displaced_step_location (gdbarch, displaced_step_at_entry_point); tdep->syscall_next_pc = arm_linux_syscall_next_pc; }