[commit] Make a Thumb test more portable

Daniel Jacobowitz drow@false.org
Tue Jun 5 18:52:00 GMT 2007


The thumb-prologue.exp test has a hard-coded breakpoint.
Unfortunately different ARM environments require different
breakpoints; for instance, Linux and bare metal use different ones,
and SymbianOS required something different yet again.  So I reworked
the test to make GDB set the breakpoint.  The method used to find the
right location is a little convoluted, but reliable - see the comment.

Tested on arm-none-eabi and committed.

-- 
Daniel Jacobowitz
CodeSourcery

2007-06-05  Daniel Jacobowitz  <dan@codesourcery.com>

	* 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/gdb.arch/thumb-prologue.c	(revision 464)
+++ gdb/testsuite/gdb.arch/thumb-prologue.c	(local)
@@ -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"
@@ -63,6 +69,11 @@ asm(".text\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"
     "tpcs_frame:\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"
 );
--- gdb/testsuite/gdb.arch/thumb-prologue.exp	(revision 464)
+++ gdb/testsuite/gdb.arch/thumb-prologue.exp	(local)
@@ -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.*" \



More information about the Gdb-patches mailing list