Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Meador Inge <meadori@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 1/1] ARM: Change prologue analyzer to always fallback on SP.
Date: Tue, 19 Jul 2011 19:11:00 -0000	[thread overview]
Message-ID: <1311101033-7648-2-git-send-email-meadori@codesourcery.com> (raw)
In-Reply-To: <1311101033-7648-1-git-send-email-meadori@codesourcery.com>

2011-07-19  Meador Inge  <meadori@codesourcery.com>

	* arm-tdep.c (thumb_analyze_prologue): Always fallback on the SP
	register when the frame can't be determined.
	* arm-tdep.c (arm_analyze_prologue): Ditto.

2011-07-19  Meador Inge  <meadori@codesourcery.com>

	* gdb.arch/thumb-prologue.c (switch_stack_to_same): New test function.
	(switch_stack_to_other): New test function.
	* gdb.arch/thumb-prologue.exp: New test cases.

Signed-off-by: Meador Inge <meadori@codesourcery.com>
---
 gdb/arm-tdep.c                            |   16 +------------
 gdb/testsuite/gdb.arch/thumb-prologue.c   |   34 +++++++++++++++++++++++++++++
 gdb/testsuite/gdb.arch/thumb-prologue.exp |   27 +++++++++++++++++++++++
 3 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 1a75af1..9aeec48 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -1150,18 +1150,12 @@ thumb_analyze_prologue (struct gdbarch *gdbarch,
       cache->framereg = THUMB_FP_REGNUM;
       cache->framesize = -regs[THUMB_FP_REGNUM].k;
     }
-  else if (pv_is_register (regs[ARM_SP_REGNUM], ARM_SP_REGNUM))
+  else
     {
       /* Try the stack pointer... this is a bit desperate.  */
       cache->framereg = ARM_SP_REGNUM;
       cache->framesize = -regs[ARM_SP_REGNUM].k;
     }
-  else
-    {
-      /* We're just out of luck.  We don't know where the frame is.  */
-      cache->framereg = -1;
-      cache->framesize = 0;
-    }
 
   for (i = 0; i < 16; i++)
     if (pv_area_find_reg (stack, gdbarch, i, &offset))
@@ -1881,18 +1875,12 @@ arm_analyze_prologue (struct gdbarch *gdbarch,
       framereg = ARM_FP_REGNUM;
       framesize = -regs[ARM_FP_REGNUM].k;
     }
-  else if (pv_is_register (regs[ARM_SP_REGNUM], ARM_SP_REGNUM))
+  else
     {
       /* Try the stack pointer... this is a bit desperate.  */
       framereg = ARM_SP_REGNUM;
       framesize = -regs[ARM_SP_REGNUM].k;
     }
-  else
-    {
-      /* We're just out of luck.  We don't know where the frame is.  */
-      framereg = -1;
-      framesize = 0;
-    }
 
   if (cache)
     {
diff --git a/gdb/testsuite/gdb.arch/thumb-prologue.c b/gdb/testsuite/gdb.arch/thumb-prologue.c
index bb24df0..a726149 100644
--- a/gdb/testsuite/gdb.arch/thumb-prologue.c
+++ b/gdb/testsuite/gdb.arch/thumb-prologue.c
@@ -18,11 +18,15 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 void tpcs_frame (void);
+void switch_stack_to_same (void);
+void switch_stack_to_other (void);
 
 int
 main (void)
 {
   tpcs_frame ();
+  switch_stack_to_same ();
+  switch_stack_to_other ();
   return 0;
 }
 
@@ -104,3 +108,33 @@ asm(".text\n"
     "	mov	lr, r3\n"
     "	bx	lr\n"
 );
+
+asm(".text\n"
+    "	.align 2\n"
+    "	.thumb_func\n"
+    "	.code 16\n"
+    "write_sp:\n"
+    "	mov	sp, r0\n"
+    "	bx	lr\n"
+
+    "	.align 2\n"
+    "	.thumb_func\n"
+    "	.code 16\n"
+    "switch_stack_to_same:\n"
+    "	push	{lr}\n"
+    "	mov	r0, sp\n"
+    "	bl	write_sp\n"
+    "	pop	{r1}\n"
+    "	bx	r1\n"
+
+    "	.align 2\n"
+    "	.thumb_func\n"
+    "	.code 16\n"
+    "switch_stack_to_other:\n"
+    "	push	{lr}\n"
+    "	mov	r7, sp\n"
+    "	mov	r0, #128\n"
+    "	bl	write_sp\n"
+    "	mov	sp, r7\n"
+    "	pop	{r1}\n"
+    "	bx	r1\n");
diff --git a/gdb/testsuite/gdb.arch/thumb-prologue.exp b/gdb/testsuite/gdb.arch/thumb-prologue.exp
index e685bc5..39b61c4 100644
--- a/gdb/testsuite/gdb.arch/thumb-prologue.exp
+++ b/gdb/testsuite/gdb.arch/thumb-prologue.exp
@@ -59,3 +59,30 @@ gdb_test "backtrace 10" \
 gdb_test "info frame" \
 	".*Saved registers:.*r7 at.*r10 at.*r11 at.*lr at.*" \
 	"saved registers in TPCS"
+
+
+# Testcase for "switching" the stack to the same stack in the prologue.
+
+gdb_breakpoint "switch_stack_to_same"
+
+gdb_test "continue" "Breakpoint .*, $hex in switch_stack_to_same \\(\\)" \
+	"continue to switch_stack_to_same"
+
+gdb_test "stepi 2" "in write_sp \\(\\)" "stepi over mov sp, sp"
+
+gdb_test "backtrace 10" \
+	"#0\[ \t\]*$hex in write_sp .*\r\n#1\[ \t\]*$hex in switch_stack_to_same .*\r\n#2\[ \t\]*$hex in main.*" \
+	"backtrace in write_sp"
+
+# Testcase for switching to another stack in the prologue.
+
+gdb_breakpoint "switch_stack_to_other"
+
+gdb_test "continue" "Breakpoint .*, $hex in switch_stack_to_other \\(\\)" \
+	"continue to switch_stack_to_other"
+
+gdb_test "stepi 2" "in write_sp \\(\\)" "stepi over mov sp, 128"
+
+gdb_test "backtrace 10" \
+	"#0\[ \t\]*$hex in write_sp .*\r\n#1\[ \t\]*$hex in switch_stack_to_other .*\r\n#2\[ \t\]*$hex in main.*" \
+	"backtrace in write_sp"
-- 
1.7.0.4


  reply	other threads:[~2011-07-19 18:44 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-19 19:05 [PATCH 0/1] ARM: Fix crash when frame cannot be found Meador Inge
2011-07-19 19:11 ` Meador Inge [this message]
2011-07-19 21:04   ` [PATCH 1/1] ARM: Change prologue analyzer to always fallback on SP Daniel Jacobowitz
2011-10-25  2:19     ` Meador Inge
2011-11-09  0:54       ` Meador Inge

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1311101033-7648-2-git-send-email-meadori@codesourcery.com \
    --to=meadori@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox