From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26505 invoked by alias); 22 Mar 2004 21:58:56 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 26458 invoked from network); 22 Mar 2004 21:58:55 -0000 Received: from unknown (HELO localhost.redhat.com) (66.30.197.194) by sources.redhat.com with SMTP; 22 Mar 2004 21:58:55 -0000 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 8445E2B9B; Mon, 22 Mar 2004 16:58:51 -0500 (EST) Message-ID: <405F619B.5020300@gnu.org> Date: Mon, 22 Mar 2004 21:58:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-GB; rv:1.4.1) Gecko/20040217 MIME-Version: 1.0 To: Ulrich Weigand Cc: gdb-patches@sources.redhat.com Subject: Re: [PATCH] Fix gdb1476.exp on s390* References: <200403221905.UAA12203@faui1d.informatik.uni-erlangen.de> In-Reply-To: <200403221905.UAA12203@faui1d.informatik.uni-erlangen.de> Content-Type: multipart/mixed; boundary="------------030201040502090607060908" X-SW-Source: 2004-03/txt/msg00509.txt.bz2 This is a multi-part message in MIME format. --------------030201040502090607060908 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1391 > Andrew Cagney wrote: > > >>>> > Hello, >>>> > >>>> > this patch fixes the gdb.base/gdb1476.exp test case (backtrace from NULL >>>> > function pointer call). >>>> > >>>> > When calling via an invalid function pointer, what we should do is simply >>>> > unwind the PC from the return address register and continue. This is >>>> > exactly what is done to unwind from a PLT stub as well, so the patch >>>> > simply uses the PLT frame unwinder to handle this case as well. >> >>> >>> While that might be true, I don't know that its the job of something >>> called "PLTSTUB". > > > Yes, the name's a bit unfortunate. What this unwinder does is basically > unwind from any situation where we don't have a proper function prolog. > It could in theory handle all kinds of stubs, trampolines etc. > > >>> I can think of either: >>> - renaming pltstub to something that matches its new purpose (just "stub"?) > > > This would be my preferred solution. Try the attached. Andrew >>> - using the default unwinder > > > The default unwinder as it is now would handle the situation incorrectly. > I could build the stub detection logic into the default unwinder, but that > would make it even more complex than it already is; I would think with the > new frame logic it is preferable to have multiple unwinders rather than a > single one that handles everything. > > Bye, > Ulrich --------------030201040502090607060908 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 5018 2004-03-22 Andrew Cagney * s390-tdep.c (struct s390_stub_unwind_cache): Rename s390_pltstub_unwind_cache. (s390_stub_frame_unwind_cache): Rename s390_pltstub_frame_unwind_cache. (s390_stub_frame_this_id): Rename s390_pltstub_frame_this_id. (s390_stub_frame_prev_register): Rename s390_pltstub_frame_prev_register. (s390_stub_frame_unwind): Rename s390_pltstub_frame_unwind. (s390_stub_frame_sniffer): Rename s390_stub_frame_sniffer. From Ulrich Weigand: * s390-tdep.c (s390_pltstub_frame_sniffer): Handle invalid function pointer calls like PLT calls. Index: s390-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/s390-tdep.c,v retrieving revision 1.129 diff -u -r1.129 s390-tdep.c --- s390-tdep.c 26 Feb 2004 23:48:01 -0000 1.129 +++ s390-tdep.c 22 Mar 2004 21:55:33 -0000 @@ -2037,27 +2037,29 @@ } -/* PLT stub stack frames. */ - -struct s390_pltstub_unwind_cache { +/* Code stubs and their stack frames. For things like PLTs and NULL + function calls (where there is no true frame and the return address + is in the RETADDR register). */ +struct s390_stub_unwind_cache +{ CORE_ADDR frame_base; struct trad_frame_saved_reg *saved_regs; }; -static struct s390_pltstub_unwind_cache * -s390_pltstub_frame_unwind_cache (struct frame_info *next_frame, - void **this_prologue_cache) +static struct s390_stub_unwind_cache * +s390_stub_frame_unwind_cache (struct frame_info *next_frame, + void **this_prologue_cache) { struct gdbarch *gdbarch = get_frame_arch (next_frame); int word_size = gdbarch_ptr_bit (gdbarch) / 8; - struct s390_pltstub_unwind_cache *info; + struct s390_stub_unwind_cache *info; ULONGEST reg; if (*this_prologue_cache) return *this_prologue_cache; - info = FRAME_OBSTACK_ZALLOC (struct s390_pltstub_unwind_cache); + info = FRAME_OBSTACK_ZALLOC (struct s390_stub_unwind_cache); *this_prologue_cache = info; info->saved_regs = trad_frame_alloc_saved_regs (next_frame); @@ -2072,41 +2074,47 @@ } static void -s390_pltstub_frame_this_id (struct frame_info *next_frame, - void **this_prologue_cache, - struct frame_id *this_id) +s390_stub_frame_this_id (struct frame_info *next_frame, + void **this_prologue_cache, + struct frame_id *this_id) { - struct s390_pltstub_unwind_cache *info - = s390_pltstub_frame_unwind_cache (next_frame, this_prologue_cache); + struct s390_stub_unwind_cache *info + = s390_stub_frame_unwind_cache (next_frame, this_prologue_cache); *this_id = frame_id_build (info->frame_base, frame_pc_unwind (next_frame)); } static void -s390_pltstub_frame_prev_register (struct frame_info *next_frame, - void **this_prologue_cache, - int regnum, int *optimizedp, - enum lval_type *lvalp, CORE_ADDR *addrp, - int *realnump, void *bufferp) +s390_stub_frame_prev_register (struct frame_info *next_frame, + void **this_prologue_cache, + int regnum, int *optimizedp, + enum lval_type *lvalp, CORE_ADDR *addrp, + int *realnump, void *bufferp) { - struct s390_pltstub_unwind_cache *info - = s390_pltstub_frame_unwind_cache (next_frame, this_prologue_cache); + struct s390_stub_unwind_cache *info + = s390_stub_frame_unwind_cache (next_frame, this_prologue_cache); trad_frame_prev_register (next_frame, info->saved_regs, regnum, optimizedp, lvalp, addrp, realnump, bufferp); } -static const struct frame_unwind s390_pltstub_frame_unwind = { +static const struct frame_unwind s390_stub_frame_unwind = { NORMAL_FRAME, - s390_pltstub_frame_this_id, - s390_pltstub_frame_prev_register + s390_stub_frame_this_id, + s390_stub_frame_prev_register }; static const struct frame_unwind * -s390_pltstub_frame_sniffer (struct frame_info *next_frame) +s390_stub_frame_sniffer (struct frame_info *next_frame) { - if (!in_plt_section (frame_pc_unwind (next_frame), NULL)) - return NULL; + CORE_ADDR pc = frame_pc_unwind (next_frame); + bfd_byte insn[S390_MAX_INSTR_SIZE]; - return &s390_pltstub_frame_unwind; + /* If the current PC points to non-readable memory, we assume we + have trapped due to an invalid function pointer call. We handle + the non-existing current function like a PLT stub. */ + if (in_plt_section (pc, NULL) + || s390_readinstruction (insn, pc) < 0) + return &s390_stub_frame_unwind; + return NULL; } @@ -3028,7 +3036,7 @@ dwarf2_frame_set_init_reg (gdbarch, s390_dwarf2_frame_init_reg); frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer); frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); - frame_unwind_append_sniffer (gdbarch, s390_pltstub_frame_sniffer); + frame_unwind_append_sniffer (gdbarch, s390_stub_frame_sniffer); frame_unwind_append_sniffer (gdbarch, s390_sigtramp_frame_sniffer); frame_unwind_append_sniffer (gdbarch, s390_frame_sniffer); frame_base_set_default (gdbarch, &s390_frame_base); --------------030201040502090607060908--