+ tdep->i386_syscall_record = amd64_linux_syscall_record;
+
+ /* GNU/Linux uses SVR4-style shared libraries. */
+ set_solib_svr4_fetch_link_map_offsets
+ (gdbarch, svr4_lp64_fetch_link_map_offsets);
+
+ /* Register DTrace handlers. */
+ set_gdbarch_dtrace_parse_probe_argument (gdbarch, amd64_dtrace_parse_probe_argument);
+ set_gdbarch_dtrace_probe_is_enabled (gdbarch, amd64_dtrace_probe_is_enabled);
+ set_gdbarch_dtrace_enable_probe (gdbarch, amd64_dtrace_enable_probe);
+ set_gdbarch_dtrace_disable_probe (gdbarch, amd64_dtrace_disable_probe);
+}
+
+static void
+amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ struct tdesc_arch_data *tdesc_data = info.tdesc_data;
+ const struct tdesc_feature *feature;
+ int valid_p;
+
+ gdb_assert (tdesc_data);
+
+ tdep->gregset_reg_offset = amd64_linux_gregset_reg_offset;
+ tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset);
+ tdep->sizeof_gregset = 27 * 8;
+
+ amd64_x32_init_abi (info, gdbarch,
+ amd64_linux_read_description (X86_XSTATE_SSE_MASK,
+ true));
+
+ /* Reserve a number for orig_rax. */
+ set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
+
+ const target_desc *tdesc = tdep->tdesc;
+
+ feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux");
+ if (feature == NULL)
+ return;
+
+ valid_p = tdesc_numbered_register (feature, tdesc_data,
+ AMD64_LINUX_ORIG_RAX_REGNUM,
+ "orig_rax");
+ if (!valid_p)
+ return;
+
+ amd64_linux_init_abi_common (info, gdbarch);
+
+ /* Initialize the amd64_x32_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. */
+ amd64_x32_linux_record_tdep.size_pointer
+ = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
+ amd64_x32_linux_record_tdep.size__old_kernel_stat = 32;
+ amd64_x32_linux_record_tdep.size_tms = 32;
+ amd64_x32_linux_record_tdep.size_loff_t = 8;
+ amd64_x32_linux_record_tdep.size_flock = 32;
+ amd64_x32_linux_record_tdep.size_oldold_utsname = 45;
+ amd64_x32_linux_record_tdep.size_ustat = 32;
+ /* ADM64 doesn't need this size because it doesn't have sys_sigaction
+ but sys_rt_sigaction. */
+ amd64_x32_linux_record_tdep.size_old_sigaction = 16;
+ /* ADM64 doesn't need this size because it doesn't have sys_sigpending
+ but sys_rt_sigpending. */
+ amd64_x32_linux_record_tdep.size_old_sigset_t = 4;
+ amd64_x32_linux_record_tdep.size_rlimit = 16;
+ amd64_x32_linux_record_tdep.size_rusage = 144;
+ amd64_x32_linux_record_tdep.size_timeval = 16;
+ amd64_x32_linux_record_tdep.size_timezone = 8;
+ /* ADM64 doesn't need this size because it doesn't have sys_getgroups16
+ but sys_getgroups. */
+ amd64_x32_linux_record_tdep.size_old_gid_t = 2;
+ /* ADM64 doesn't need this size because it doesn't have sys_getresuid16
+ but sys_getresuid. */
+ amd64_x32_linux_record_tdep.size_old_uid_t = 2;
+ amd64_x32_linux_record_tdep.size_fd_set = 128;
+ /* ADM64 doesn't need this size because it doesn't have sys_readdir. */
+ amd64_x32_linux_record_tdep.size_old_dirent = 268;
+ amd64_x32_linux_record_tdep.size_statfs = 120;
+ amd64_x32_linux_record_tdep.size_statfs64 = 120;
+ amd64_x32_linux_record_tdep.size_sockaddr = 16;
+ amd64_x32_linux_record_tdep.size_int
+ = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
+ amd64_x32_linux_record_tdep.size_long
+ = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
+ amd64_x32_linux_record_tdep.size_ulong
+ = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
+ amd64_x32_linux_record_tdep.size_msghdr = 28;
+ amd64_x32_linux_record_tdep.size_itimerval = 32;
+ amd64_x32_linux_record_tdep.size_stat = 144;
+ amd64_x32_linux_record_tdep.size_old_utsname = 325;
+ amd64_x32_linux_record_tdep.size_sysinfo = 112;
+ amd64_x32_linux_record_tdep.size_msqid_ds = 120;
+ amd64_x32_linux_record_tdep.size_shmid_ds = 112;
+ amd64_x32_linux_record_tdep.size_new_utsname = 390;
+ amd64_x32_linux_record_tdep.size_timex = 208;
+ amd64_x32_linux_record_tdep.size_mem_dqinfo = 24;
+ amd64_x32_linux_record_tdep.size_if_dqblk = 72;
+ amd64_x32_linux_record_tdep.size_fs_quota_stat = 80;
+ amd64_x32_linux_record_tdep.size_timespec = 16;
+ amd64_x32_linux_record_tdep.size_pollfd = 8;
+ amd64_x32_linux_record_tdep.size_NFS_FHSIZE = 32;
+ amd64_x32_linux_record_tdep.size_knfsd_fh = 132;
+ amd64_x32_linux_record_tdep.size_TASK_COMM_LEN = 16;
+ amd64_x32_linux_record_tdep.size_sigaction = 20;
+ amd64_x32_linux_record_tdep.size_sigset_t = 8;
+ amd64_x32_linux_record_tdep.size_siginfo_t = 128;
+ amd64_x32_linux_record_tdep.size_cap_user_data_t = 8;
+ amd64_x32_linux_record_tdep.size_stack_t = 12;
+ amd64_x32_linux_record_tdep.size_off_t = 8;
+ amd64_x32_linux_record_tdep.size_stat64 = 144;
+ amd64_x32_linux_record_tdep.size_gid_t = 4;
+ amd64_x32_linux_record_tdep.size_uid_t = 4;
+ amd64_x32_linux_record_tdep.size_PAGE_SIZE = 4096;
+ amd64_x32_linux_record_tdep.size_flock64 = 32;
+ amd64_x32_linux_record_tdep.size_user_desc = 16;
+ amd64_x32_linux_record_tdep.size_io_event = 32;
+ amd64_x32_linux_record_tdep.size_iocb = 64;
+ amd64_x32_linux_record_tdep.size_epoll_event = 12;
+ amd64_x32_linux_record_tdep.size_itimerspec = 32;
+ amd64_x32_linux_record_tdep.size_mq_attr = 64;
+ amd64_x32_linux_record_tdep.size_termios = 36;
+ amd64_x32_linux_record_tdep.size_termios2 = 44;
+ amd64_x32_linux_record_tdep.size_pid_t = 4;
+ amd64_x32_linux_record_tdep.size_winsize = 8;
+ amd64_x32_linux_record_tdep.size_serial_struct = 72;
+ amd64_x32_linux_record_tdep.size_serial_icounter_struct = 80;
+ amd64_x32_linux_record_tdep.size_hayes_esp_config = 12;
+ amd64_x32_linux_record_tdep.size_size_t = 4;
+ amd64_x32_linux_record_tdep.size_iovec = 8;
+ amd64_x32_linux_record_tdep.size_time_t = 8;
+