From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2990 invoked by alias); 7 Jun 2013 13:25:56 -0000 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 Received: (qmail 2971 invoked by uid 89); 7 Jun 2013 13:25:56 -0000 X-Spam-SWARE-Status: No, score=-4.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.1 X-Spam-User: qpsmtpd, 2 recipients Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 07 Jun 2013 13:25:54 +0000 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1Ukwfw-0001at-Op from Maciej_Rozycki@mentor.com ; Fri, 07 Jun 2013 06:25:52 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Fri, 7 Jun 2013 06:25:52 -0700 Received: from [172.30.64.189] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.2.247.3; Fri, 7 Jun 2013 14:25:50 +0100 Date: Fri, 07 Jun 2013 13:25:00 -0000 From: "Maciej W. Rozycki" To: CC: Richard Sandiford , Catherine Moore , Subject: [PATCH] in_plt_section: support alternate stub section names (was: [PATCH 1/2] MIPS: Compressed PLT/stubs support) In-Reply-To: Message-ID: References: User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" X-SW-Source: 2013-06/txt/msg00150.txt.bz2 Hi, I have realised the change to support alternate stub section names in in_plt_section is really self-contained and while a prerequisite for microMIPS/MIPS16 PLT support it can be applied separately. I have therefore split it off from the PLT change, hopefully making a review easier. For a reference, here are the relevant original observations I made when posting the combined change: > As to the semantics change of the in_plt_section GDB helper -- the `name' > argument is unused and all the callers pass it as NULL. I've tracked down > the history of this function, and it was introduced with GDB 4.13: > > Fri Apr 1 00:44:00 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) > > * sparc-tdep.c (in_solib_trampoline): Renamed to in_plt_section > and moved to objfiles.c. > * objfiles.c (in_plt_section): Moved to here from sparc-tdep. > * config/tm-sysv4.h (IN_SOLIB_TRAMPOLINE): Use new in_plt_section. > * config/sparc/tm-sun4sol2.h (IN_SOLIB_TRAMPOLINE): Removed, > the new generic definition from tm-sysv4.h works for Solaris. > > -- with this argument already unused. Furthermore, `in_solib_trampoline' > was introduced in GDB 4.9: > > Tue Mar 30 15:46:14 1993 K. Richard Pixley (rich@rtl.cygnus.com) > > * sparc-tdep.c (in_solib_trampoline): new function. > * config/sparc/tm-sun4sol2.h (IN_SOLIB_TRAMPOLINE): redefine to > in_solib_trampoline. > > with this argument also unused. I was unable to track down the pre-4.9 > tm-sun4sol2.h version of IN_SOLIB_TRAMPOLINE as GDB 4.8 didn't have the > macro there yet, so no GDB version was ever released that provided it. > > However, the tm-sysv4.h version was defined like this: > > #define IN_SOLIB_TRAMPOLINE(pc,name) ((name) && (STREQ ("_init", name))) > > -- and then redefined in terms of in_plt_section as recorded in the > ChangeLog entry quoted above like this: > > #define IN_SOLIB_TRAMPOLINE(pc, name) in_plt_section((pc), (name)) > > at which point the `name' argument became unused as well. > > HP-PA had its own version: > > #define IN_SOLIB_TRAMPOLINE(pc, name) skip_trampoline_code (pc, name) > > -- but skip_trampoline_code didn't make any use of its `name' argument > either -- just as does't current code in hppa_in_solib_call_trampoline the > former has evolved to (and neither does code in > hppa32_hpux_in_solib_call_trampoline, hppa64_hpux_in_solib_call_trampoline > or hppa_hpux_in_solib_return_trampoline). > > With the above consideration in mind, I think it is safe to redefine > in_plt_section's API as proposed in this change -- remembering that MIPS > stubs are the functional equivalent of PLT entries -- for the sake of code > duplication avoidance. With in_plt_section such redefined, all the handcoded conditions throughout the MIPS backend can be unified, and also the helper can now be used in mips_linux_in_dynsym_stub to avoid the heuristic there if possible. This change was regression-tested for the mips-sde-elf and mips-linux-gnu targets using the following configurations (multilibs), both endiannesses each: * o32 (-mabi=32), * n64 (-mabi=64) (mips-linux-gnu only), * n32 (-mabi=n32) (mips-linux-gnu only), * MIPS16 o32 (-mips16 -mabi=32), * microMIPS o32 (-mmicromips -mabi=32). with no regressions (as previously, with the outstanding ISA bit fix applied). OK to apply? 2013-06-07 Maciej W. Rozycki gdb/ * mips-linux-tdep.c (mips_linux_in_dynsym_stub): Handle .MIPS.stubs section like .plt. Remove unused `name' argument. Return 1 rather than the low 16-bit halfword of any instruction examined. (mips_linux_in_dynsym_resolve_code): Update accordingly. * mips-tdep.c (mips_stub_frame_sniffer): Call in_plt_section in place of an equivalent hand-coded sequence. * objfiles.c (in_plt_section): Reuse the `name' argument as an trampoline section name override. Maciej gdb-mips-in-stubs-section.diff Index: gdb-fsf-trunk-quilt/gdb/mips-linux-tdep.c =================================================================== --- gdb-fsf-trunk-quilt.orig/gdb/mips-linux-tdep.c 2013-06-06 20:48:30.243223201 +0100 +++ gdb-fsf-trunk-quilt/gdb/mips-linux-tdep.c 2013-06-06 20:52:00.273227140 +0100 @@ -30,6 +30,7 @@ #include "trad-frame.h" #include "tramp-frame.h" #include "gdbtypes.h" +#include "objfiles.h" #include "solib.h" #include "solib-svr4.h" #include "solist.h" @@ -666,25 +667,34 @@ mips_linux_core_read_description (struct /* Check the code at PC for a dynamic linker lazy resolution stub. - Because they aren't in the .plt section, we pattern-match on the - code generated by GNU ld. They look like this: + GNU ld for MIPS has put lazy resolution stubs into a ".MIPS.stubs" + section uniformly since version 2.15. If the pc is in that section, + then we are in such a stub. Before that ".stub" was used in 32-bit + ELF binaries, however we do not bother checking for that since we + have never had and that case should be extremely rare these days. + Instead we pattern-match on the code generated by GNU ld. They look + like this: lw t9,0x8010(gp) addu t7,ra jalr t9,ra addiu t8,zero,INDEX - (with the appropriate doubleword instructions for N64). Also - return the dynamic symbol index used in the last instruction. */ + (with the appropriate doubleword instructions for N64). As any lazy + resolution stubs in microMIPS binaries will always be in a + ".MIPS.stubs" section we only ever verify standard MIPS patterns. */ static int -mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name) +mips_linux_in_dynsym_stub (CORE_ADDR pc) { gdb_byte buf[28], *p; ULONGEST insn, insn1; int n64 = (mips_abi (target_gdbarch ()) == MIPS_ABI_N64); enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); + if (in_plt_section (pc, ".MIPS.stubs")) + return 1; + read_memory (pc - 12, buf, 28); if (n64) @@ -742,7 +752,7 @@ mips_linux_in_dynsym_stub (CORE_ADDR pc, return 0; } - return (insn & 0xffff); + return 1; } /* Return non-zero iff PC belongs to the dynamic linker resolution @@ -756,9 +766,10 @@ mips_linux_in_dynsym_resolve_code (CORE_ if (svr4_in_dynsym_resolve_code (pc)) return 1; - /* Pattern match for the stub. It would be nice if there were a - more efficient way to avoid this check. */ - if (mips_linux_in_dynsym_stub (pc, NULL)) + /* Likewise for the stubs. They live in the .MIPS.stubs section these + days, so we check if the PC is within, than fall back to a pattern + match. */ + if (mips_linux_in_dynsym_stub (pc)) return 1; return 0; Index: gdb-fsf-trunk-quilt/gdb/mips-tdep.c =================================================================== --- gdb-fsf-trunk-quilt.orig/gdb/mips-tdep.c 2013-06-06 20:48:30.243223201 +0100 +++ gdb-fsf-trunk-quilt/gdb/mips-tdep.c 2013-06-06 20:52:00.273227140 +0100 @@ -3591,12 +3591,7 @@ mips_stub_frame_sniffer (const struct fr if (in_plt_section (pc, NULL)) return 1; - /* Binutils for MIPS puts lazy resolution stubs into .MIPS.stubs. */ - s = find_pc_section (pc); - - if (s != NULL - && strcmp (bfd_get_section_name (s->objfile->obfd, s->the_bfd_section), - ".MIPS.stubs") == 0) + if (in_plt_section (pc, ".MIPS.stubs")) return 1; /* Calling a PIC function from a non-PIC function passes through a Index: gdb-fsf-trunk-quilt/gdb/objfiles.c =================================================================== --- gdb-fsf-trunk-quilt.orig/gdb/objfiles.c 2013-06-06 20:48:30.243223201 +0100 +++ gdb-fsf-trunk-quilt/gdb/objfiles.c 2013-06-06 20:52:00.273227140 +0100 @@ -1410,9 +1410,11 @@ find_pc_section (CORE_ADDR pc) } -/* In SVR4, we recognize a trampoline by it's section name. - That is, if the pc is in a section named ".plt" then we are in - a trampoline. */ +/* In SVR4, we recognize a trampoline by it's section name. That is, + if the pc is in a section named ".plt" then we are in a trampoline. + We let targets request an alternative name, this is currently used + by the MIPS backend to handle the SVR4 lazy resolution stubs that + binutils put into ".MIPS.stubs" instead. */ int in_plt_section (CORE_ADDR pc, char *name) @@ -1424,7 +1426,7 @@ in_plt_section (CORE_ADDR pc, char *name retval = (s != NULL && s->the_bfd_section->name != NULL - && strcmp (s->the_bfd_section->name, ".plt") == 0); + && strcmp (s->the_bfd_section->name, name ? name : ".plt") == 0); return (retval); }