From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11650 invoked by alias); 8 May 2012 22:08:27 -0000 Received: (qmail 11638 invoked by uid 22791); 8 May 2012 22:08:26 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_NO,TW_EG X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 08 May 2012 22:08:13 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 8420A1C6817; Tue, 8 May 2012 18:08:12 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id JrPVAzibIeTK; Tue, 8 May 2012 18:08:12 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 4C9DB1C6812; Tue, 8 May 2012 18:08:12 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 01103145616; Tue, 8 May 2012 15:08:05 -0700 (PDT) Date: Tue, 08 May 2012 22:08:00 -0000 From: Joel Brobecker To: "Maciej W. Rozycki" Cc: Mark Kettenis , gdb-patches@sourceware.org Subject: Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method. Message-ID: <20120508220805.GD15555@adacore.com> References: <20120503214933.GJ15555@adacore.com> <20120504205818.GT15555@adacore.com> <201205042118.q44LIh3p018153@glazunov.sibelius.xs4all.nl> <201205051144.q45Bitv4006357@glazunov.sibelius.xs4all.nl> <20120508160542.GB15555@adacore.com> <20120508204257.GC15555@adacore.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="R6sEYoIZpp9JErk7" Content-Disposition: inline In-Reply-To: <20120508204257.GC15555@adacore.com> User-Agent: Mutt/1.5.20 (2009-06-14) 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/msg00244.txt.bz2 --R6sEYoIZpp9JErk7 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 721 Attached is the latest version. It's very very slightly different from the version you suggested, in the fact that I didn't create a local variable for the breakpoint address, and stored it in *bp_addr directly. I didn't see a real purpose for having a local variable in this case. I did create a local variable for the nop instruction address, however. I found that it did make things a little clearer for that one. As before, I'm attaching two patches, the first being the last version of the patch, and the second being the changes introduced by this iteration. Testec on mips-irix with no regression. If we'd rather go with AT_ENTRY_POINT instead, at least the patch is available here for the record. -- Joel --R6sEYoIZpp9JErk7 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-mips-Switch-inferior-function-calls-to-ON_STACK-meth.patch" Content-length: 2945 >From 19ebe2e03aab266ddd3771fbd7aeff430c32079a Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Wed, 2 May 2012 20:39:57 -0400 Subject: [PATCH] mips: Switch inferior function calls to ON_STACK method. This patch switches the mips code to use the ON_STACK method for function calls instead of AT_SYMBOL, which we want to remove. gdb/ChangeLog: * mips-tdep.c (mips_push_dummy_code): New function. (mips_gdbarch_init): Set the gdbarch call_dummy_location to ON_STACK and install mips_push_dummy_code as our gdbarch push_dummy_code routine. --- gdb/mips-tdep.c | 38 ++++++++++++++++++++++++++++++++++---- 1 files changed, 34 insertions(+), 4 deletions(-) diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 9a3c7fb..ebf7c48 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -3009,6 +3009,38 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr) return align_down (addr, 16); } +/* Implement the "push_dummy_call" gdbarch method. */ + +static CORE_ADDR +mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, + CORE_ADDR funaddr, struct value **args, + int nargs, struct type *value_type, + CORE_ADDR *real_pc, CORE_ADDR *bp_addr, + struct regcache *regcache) +{ + CORE_ADDR nop_addr; + static gdb_byte nop_insn[] = { 0, 0, 0, 0 }; + + /* Reserve enough room on the stack for our breakpoint instruction. */ + *bp_addr = sp - sizeof (nop_insn); + + /* The breakpoint layer automatically adjusts the address of + breakpoints inserted in a branch delay slot. With enough + bad luck, the 4 bytes located just before our breakpoint + instruction could look like a branch instruction, and thus + trigger the adjustement, and break the function call entirely. + So, we reserve those 4 bytes and write a nop instruction + to prevent that from happening. */ + nop_addr = *bp_addr - sizeof (nop_insn); + write_memory (nop_addr, nop_insn, sizeof (nop_insn)); + sp = mips_frame_align (gdbarch, nop_addr); + + /* Inferior resumes at the function entry point. */ + *real_pc = funaddr; + + return sp; +} + static CORE_ADDR mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, @@ -6906,10 +6938,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* MIPS version of CALL_DUMMY. */ - /* NOTE: cagney/2003-08-05: Eventually call dummy location will be - replaced by a command, and all targets will default to on stack - (regardless of the stack's execute status). */ - set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL); + set_gdbarch_call_dummy_location (gdbarch, ON_STACK); + set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code); set_gdbarch_frame_align (gdbarch, mips_frame_align); set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p); -- 1.7.0.4 --R6sEYoIZpp9JErk7 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-More-mods-to-mips-ON_STACK-function-call.patch" Content-length: 1630 >From 0e907377fff968693ff42d3cab61cafa4d50521b Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Tue, 8 May 2012 17:57:56 -0400 Subject: [PATCH] More mods to mips ON_STACK function call. --- gdb/mips-tdep.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 68ac858..ebf7c48 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -3018,11 +3018,11 @@ mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, CORE_ADDR *real_pc, CORE_ADDR *bp_addr, struct regcache *regcache) { - int bp_len; + CORE_ADDR nop_addr; static gdb_byte nop_insn[] = { 0, 0, 0, 0 }; - *bp_addr = sp; - gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len); + /* Reserve enough room on the stack for our breakpoint instruction. */ + *bp_addr = sp - sizeof (nop_insn); /* The breakpoint layer automatically adjusts the address of breakpoints inserted in a branch delay slot. With enough @@ -3031,8 +3031,9 @@ mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, trigger the adjustement, and break the function call entirely. So, we reserve those 4 bytes and write a nop instruction to prevent that from happening. */ - write_memory (*bp_addr - bp_len, nop_insn, sizeof (nop_insn)); - sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len); + nop_addr = *bp_addr - sizeof (nop_insn); + write_memory (nop_addr, nop_insn, sizeof (nop_insn)); + sp = mips_frame_align (gdbarch, nop_addr); /* Inferior resumes at the function entry point. */ *real_pc = funaddr; -- 1.7.0.4 --R6sEYoIZpp9JErk7--