From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10719 invoked by alias); 14 May 2012 18:10:39 -0000 Received: (qmail 10706 invoked by uid 22791); 14 May 2012 18:10:37 -0000 X-SWARE-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_AV X-Spam-Check-By: sourceware.org Received: from mail-qc0-f169.google.com (HELO mail-qc0-f169.google.com) (209.85.216.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 14 May 2012 18:10:24 +0000 Received: by qcsd16 with SMTP id d16so4265672qcs.0 for ; Mon, 14 May 2012 11:10:23 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.137.20 with SMTP id u20mr4591111qct.9.1337019023187; Mon, 14 May 2012 11:10:23 -0700 (PDT) Received: by 10.229.169.130 with HTTP; Mon, 14 May 2012 11:10:23 -0700 (PDT) In-Reply-To: References: <20120511192949.GA5070@intel.com> <201205112020.q4BKKAbT010335@glazunov.sibelius.xs4all.nl> Date: Mon, 14 May 2012 18:10:00 -0000 Message-ID: Subject: Re: PATCH: Check bfd_mach_x64_32 to set tdesc for x32 binary From: "H.J. Lu" To: Mark Kettenis Cc: gdb-patches@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-05/txt/msg00531.txt.bz2 On Fri, May 11, 2012 at 4:13 PM, H.J. Lu wrote: > On Fri, May 11, 2012 at 1:20 PM, Mark Kettenis = wrote: >>> Hi, >>> >>> This patch checks bfd_mach_x64_32 to set tdesc for x32 binary. =A0Tested >>> on Linux/x86-64. =A0OK to install? >>> >>> Thanks. >>> >>> >>> H.J. >>> --- >>> =A0 =A0 =A0 * amd64-linux-tdep.c: Include features/i386/x32-linux.c >>> =A0 =A0 =A0 and features/i386/x32-avx-linux.c. >>> =A0 =A0 =A0 (amd64_linux_init_abi): Check bfd_mach_x64_32 for x32 proce= ss. >>> =A0 =A0 =A0 (_initialize_amd64_linux_tdep): Register bfd_mach_x64_32. = =A0Call >>> =A0 =A0 =A0 initialize_tdesc_x32_linux and initialize_tdesc_x32_avx_lin= ux. >>> >>> =A0 =A0 =A0 * amd64-linux-tdep.h (tdesc_x32_linux): New. >>> =A0 =A0 =A0 (tdesc_x32_avx_linux): Likewise. >>> >>> diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c >>> index acc7303..601ce20 100644 >>> --- a/gdb/amd64-linux-tdep.c >>> +++ b/gdb/amd64-linux-tdep.c >>> @@ -1545,8 +1578,12 @@ _initialize_amd64_linux_tdep (void) >>> =A0{ >>> =A0 =A0gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 GDB_OSABI_LINUX, amd64_= linux_init_abi); >>> + =A0gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x64_32, >>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 GDB_OSABI_LINUX, amd64_li= nux_init_abi); >> >> Instead of doing this, you should introduce an >> amd64_x32_linux_init_abi() function, make that call amd64_linix_init_abi= () and ovverride the bits that are different for X32. > > I don't think I should override tdep->tdesc. =A0Here is a different appro= ach. > I updated amd64_linux_init_abi to take amd64_linux_tdesc and fetch_func. > I also added amd64_lp64_linux_init_abi and amd64_ilp32_linux_init_abi > to pass the right ones to amd64_linux_init_abi. =A0Tested on Linux/x86-64. > OK to install? > > Thanks. > > -- > H.J. > -- > =A0 =A0 =A0 =A0* amd64-linux-tdep.c (amd64_linux_init_abi): Add 2 argumen= ts, > =A0 =A0 =A0 =A0amd64_linux_tdesc and fetch_func. =A0Replace tdesc_amd64_l= inux > =A0 =A0 =A0 =A0with amd64_linux_tdesc and svr4_lp64_fetch_link_map_offsets > =A0 =A0 =A0 =A0with fetch_func. > =A0 =A0 =A0 =A0(amd64_lp64_linux_init_abi): New function. > =A0 =A0 =A0 =A0(amd64_ilp32_linux_init_abi): Likewise. > =A0 =A0 =A0 =A0(_initialize_amd64_linux_tdep): Replace amd64_linux_init_a= bi > =A0 =A0 =A0 =A0with amd64_lp64_linux_init_abi. =A0Register bfd_mach_x64_3= 2 with > =A0 =A0 =A0 =A0amd64_ilp32_linux_init_abi. =A0Call initialize_tdesc_x32_l= inux > =A0 =A0 =A0 =A0and initialize_tdesc_x32_avx_linux. > An updated patch to remove the change which are already in trunk. OK to install? Thanks. --=20 H.J. --- * amd64-linux-tdep.c (amd64_linux_init_abi): Add 2 arguments, amd64_linux_tdesc and fetch_func. Replace tdesc_amd64_linux with amd64_linux_tdesc and svr4_lp64_fetch_link_map_offsets with fetch_func. (amd64_lp64_linux_init_abi): New function. (amd64_ilp32_linux_init_abi): Likewise. (_initialize_amd64_linux_tdep): Replace amd64_linux_init_abi with amd64_lp64_linux_init_abi. Register bfd_mach_x64_32 with amd64_ilp32_linux_init_abi. diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index cfe6e4b..e68d70f 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -1288,7 +1288,9 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch, } static void -amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch, + const struct target_desc *amd64_linux_tdesc, + struct link_map_offsets *(*fetch_func) (void)) { struct gdbarch_tdep *tdep =3D gdbarch_tdep (gdbarch); const struct target_desc *tdesc =3D info.target_desc; @@ -1310,7 +1312,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS); if (! tdesc_has_registers (tdesc)) - tdesc =3D tdesc_amd64_linux; + tdesc =3D amd64_linux_tdesc; tdep->tdesc =3D tdesc; feature =3D tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux"); @@ -1331,8 +1333,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->xsave_xcr0_offset =3D I386_LINUX_XSAVE_XCR0_OFFSET; /* GNU/Linux uses SVR4-style shared libraries. */ - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_lp64_fetch_link_map_offsets); + set_solib_svr4_fetch_link_map_offsets (gdbarch, fetch_func); /* Add the %orig_rax register used for syscall restarting. */ set_gdbarch_write_pc (gdbarch, amd64_linux_write_pc); @@ -1543,6 +1544,22 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->i386_syscall_record =3D amd64_linux_syscall_record; } + +static void +amd64_lp64_linux_init_abi (struct gdbarch_info info, + struct gdbarch *gdbarch) +{ + amd64_linux_init_abi (info, gdbarch, tdesc_amd64_linux, + svr4_lp64_fetch_link_map_offsets); +} + +static void +amd64_ilp32_linux_init_abi (struct gdbarch_info info, + struct gdbarch *gdbarch) +{ + amd64_linux_init_abi (info, gdbarch, tdesc_x32_linux, + svr4_ilp32_fetch_link_map_offsets); +} /* Provide a prototype to silence -Wmissing-prototypes. */ @@ -1552,7 +1589,9 @@ void _initialize_amd64_linux_tdep (void) { gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, - GDB_OSABI_LINUX, amd64_linux_init_abi); + GDB_OSABI_LINUX, amd64_lp64_linux_init_abi); + gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x64_32, + GDB_OSABI_LINUX, amd64_ilp32_linux_init_abi); /* Initialize the Linux target description. */ initialize_tdesc_amd64_linux ();