[commit] Make a Thumb test more portable

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[commit] Make a Thumb test more portable

Daniel Jacobowitz-2
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  <[hidden email]>

        * 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.*" \