From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27434 invoked by alias); 10 Feb 2014 15:08:18 -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 27420 invoked by uid 89); 10 Feb 2014 15:08:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: glazunov.sibelius.xs4all.nl Received: from sibelius.xs4all.nl (HELO glazunov.sibelius.xs4all.nl) (83.163.83.176) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 10 Feb 2014 15:08:16 +0000 Received: from glazunov.sibelius.xs4all.nl (kettenis@localhost [127.0.0.1]) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3) with ESMTP id s1AF81Ug013779; Mon, 10 Feb 2014 16:08:01 +0100 (CET) Received: (from kettenis@localhost) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3/Submit) id s1AF81Ip015382; Mon, 10 Feb 2014 16:08:01 +0100 (CET) Date: Mon, 10 Feb 2014 15:08:00 -0000 Message-Id: <201402101508.s1AF81Ip015382@glazunov.sibelius.xs4all.nl> From: Mark Kettenis To: jose.marchesi@oracle.com CC: brobecker@adacore.com, palves@redhat.com, gdb-patches@sourceware.org In-reply-to: <87fvnrgmyw.fsf@oracle.com> (jose.marchesi@oracle.com) Subject: Re: [PATCH] add gdbarch_in_function_epilogue_p hook for sparc64 References: <87mwm9b8pr.fsf@oracle.com> <529E2ADD.6020409@redhat.com> <8738m9j5de.fsf@oracle.com> <529F1CE0.2060000@redhat.com> <87y540iz29.fsf@oracle.com> <87ppnau7ho.fsf@oracle.com> <87ppn0uxid.fsf@oracle.com> <20140208030146.GK5485@adacore.com> <87fvnrgmyw.fsf@oracle.com> X-SW-Source: 2014-02/txt/msg00310.txt.bz2 > From: jose.marchesi@oracle.com (Jose E. Marchesi) > Date: Mon, 10 Feb 2014 13:40:23 +0100 > > 2013-10-16 Jose E. Marchesi > > * sparc-tdep.c (sparc_in_function_epilogue_p): New function. > (X_RETTURN): New macro. > * sparc-tdep.h: sparc_in_function_epilogue_p prototype. > > * sparc64-tdep.c (sparc64_init_abi): Hook > sparc_in_function_epilogue_p. Finally managed to test this on OpenBSD/sparc64. Seems to fix an XFAIL and a FAIL in mi-watch.exp for me. Although those are a bit suspect since (software) watchpoints are currently a bit broken on OpenBSD/sparc64. Pretty sure this doesn't cause any regressions though, so please go ahaed. > diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c > index 38b345b..311a156 100644 > --- a/gdb/sparc-tdep.c > +++ b/gdb/sparc-tdep.c > @@ -88,6 +88,9 @@ struct regset; > #define X_DISP19(i) ((((i) & 0x7ffff) ^ 0x40000) - 0x40000) > #define X_DISP10(i) ((((((i) >> 11) && 0x300) | (((i) >> 5) & 0xff)) ^ 0x200) - 0x200) > #define X_SIMM13(i) ((((i) & 0x1fff) ^ 0x1000) - 0x1000) > +/* Macros to identify some instructions. */ > +/* RETURN (RETT in V8) */ > +#define X_RETTURN(i) ((X_OP (i) == 0x2) && (X_OP3 (i) == 0x39)) > > /* Fetch the instruction at PC. Instructions are always big-endian > even if the processor operates in little-endian mode. */ > @@ -452,6 +455,29 @@ sparc32_pseudo_register_write (struct gdbarch *gdbarch, > regcache_raw_write (regcache, regnum + 1, buf + 4); > } > > +/* Implement "in_function_epilogue_p". */ > + > +int > +sparc_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc) > +{ > + /* This function must return true if we are one instruction after an > + instruction that destroyed the stack frame of the current > + function. The SPARC instructions used to restore the callers > + stack frame are RESTORE and RETURN/RETT. > + > + Of these RETURN/RETT is a branch instruction and thus we return > + true if we are in its delay slot. > + > + RESTORE is almost always found in the delay slot of a branch > + instruction that transfers control to the caller, such as JMPL. > + Thus the next instruction is in the caller frame and we don't > + need to do anything about it. */ > + > + unsigned int insn = sparc_fetch_instruction (pc - 4); > + > + return X_RETTURN (insn); > +} > + > > static CORE_ADDR > sparc32_frame_align (struct gdbarch *gdbarch, CORE_ADDR address) > diff --git a/gdb/sparc-tdep.h b/gdb/sparc-tdep.h > index b83d711..a065ebe 100644 > --- a/gdb/sparc-tdep.h > +++ b/gdb/sparc-tdep.h > @@ -193,6 +193,9 @@ extern struct sparc_frame_cache * > extern struct sparc_frame_cache * > sparc32_frame_cache (struct frame_info *this_frame, void **this_cache); > > +extern int > + sparc_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc); > + > > > extern int sparc_software_single_step (struct frame_info *frame); > diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c > index 52958df..9e4db3a 100644 > --- a/gdb/sparc64-tdep.c > +++ b/gdb/sparc64-tdep.c > @@ -1196,6 +1196,7 @@ sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) > (gdbarch, default_stabs_argument_has_addr); > > set_gdbarch_skip_prologue (gdbarch, sparc64_skip_prologue); > + set_gdbarch_in_function_epilogue_p (gdbarch, sparc_in_function_epilogue_p); > > /* Hook in the DWARF CFI frame unwinder. */ > dwarf2_frame_set_init_reg (gdbarch, sparc64_dwarf2_frame_init_reg); >