From fd20f75b0c15ed18549120f8b137e520726650ee Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Tue, 5 Jun 2007 18:50:41 +0000 Subject: [PATCH] * gdb.arch/thumb-prologue.c: Record the breakpoint address in tpcs_offset. Restore lr after the call. * gdb.arch/thumb-prologue.exp: Use tpcs_offset. --- gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.arch/thumb-prologue.c | 22 +++++++++++++++++----- gdb/testsuite/gdb.arch/thumb-prologue.exp | 4 +++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 3b882ca9826..80d31af48cd 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-06-05 Daniel Jacobowitz + + * gdb.arch/thumb-prologue.c: Record the breakpoint address in + tpcs_offset. Restore lr after the call. + * gdb.arch/thumb-prologue.exp: Use tpcs_offset. + 2007-05-23 Daniel Jacobowitz * lib/gdbserver-support.exp (gdbserver_spawn): Only match full_buffer. diff --git a/gdb/testsuite/gdb.arch/thumb-prologue.c b/gdb/testsuite/gdb.arch/thumb-prologue.c index dc51f9795b5..be2702b34f6 100644 --- a/gdb/testsuite/gdb.arch/thumb-prologue.c +++ b/gdb/testsuite/gdb.arch/thumb-prologue.c @@ -29,7 +29,8 @@ main (void) } /* Normally Thumb functions use r7 as the frame pointer. However, - with the GCC option -mtpcs-frame, they may use fp instead. */ + with the GCC option -mtpcs-frame, they may use fp instead. Make + sure that the prologue analyzer can handle this. */ asm(".text\n" " .align 2\n" @@ -51,8 +52,13 @@ asm(".text\n" " mov r7, sl\n" " push {r7}\n" - /* Trap. */ - " .short 0xdffe\n" + /* We'll set a breakpoint at this call. We can't hardcode a trap + instruction; the right instruction to use varies too much. And + we can't use a global label, because GDB will think that's the + start of a new function. So, this slightly convoluted + technique. */ + ".Ltpcs:\n" + " nop\n" " pop {r2}\n" " mov sl, r2\n" @@ -62,6 +68,11 @@ asm(".text\n" " mov sp, r2\n" " bx lr\n" + " .align 2\n" + " .type tpcs_offset, %object\n" + "tpcs_offset:\n" + " .word .Ltpcs - tpcs_frame_1\n" + " .align 2\n" " .thumb_func\n" " .code 16\n" @@ -81,7 +92,7 @@ asm(".text\n" " mov r7, sl\n" " push {r7}\n" - /* Clobber saved regs. */ + /* Clobber saved regs around the call. */ " mov r7, #0\n" " mov lr, r7\n" " bl tpcs_frame_1\n" @@ -89,8 +100,9 @@ asm(".text\n" " pop {r2}\n" " mov sl, r2\n" " pop {r7}\n" - " pop {r1, r2}\n" + " pop {r1, r2, r3}\n" " mov fp, r1\n" " mov sp, r2\n" + " mov lr, r3\n" " bx lr\n" ); diff --git a/gdb/testsuite/gdb.arch/thumb-prologue.exp b/gdb/testsuite/gdb.arch/thumb-prologue.exp index bad1f32ecb7..9320811fb09 100644 --- a/gdb/testsuite/gdb.arch/thumb-prologue.exp +++ b/gdb/testsuite/gdb.arch/thumb-prologue.exp @@ -49,7 +49,9 @@ if ![runto_main] then { # Testcase for TPCS prologue. -gdb_test "continue" "Program received signal SIG.*" "continue to TPCS" +gdb_breakpoint "* *(int *)tpcs_offset + (int) &tpcs_frame_1" +gdb_test "continue" "Breakpoint .*, $hex in tpcs_frame_1 \\(\\)" \ + "continue to TPCS" gdb_test "backtrace 10" \ "#0\[ \t\]*$hex in tpcs_frame_1 .*\r\n#1\[ \t\]*$hex in tpcs_frame .*\r\n#2\[ \t\]*$hex in main.*" \ -- 2.30.2