This test checks that the stack pointer is handled correctly in
prologue/epilogue of Cortex-M interrupt handlers. An interrupt handler may
be called when stack is not double-word aligned. The prologue of the
interrupt handler aligns the stack pointer and the epilogue restores the
original stack pointer.

However, in this test, the stack is always double-word aligned when the
handler function foo is called. As a result, the test is not very effective,
for example it passes even if the epilogue does not restore the stack
pointer. This patch forces the stack pointer to be not double-word aligned
on the call to foo.

Tested on qemu -cpu cortex-m3.

Ok for trunk?

Thanks,
Greta

ChangeLog:

gcc/testsuite

2012-06-18  Greta Yorsh  <greta.yo...@arm.com>

        * gcc.target/arm/handler-align.c (main): Force the stack pointer
        to be not double-word aligned on the call to the interrupt handler.
diff --git a/gcc/testsuite/gcc.target/arm/handler-align.c 
b/gcc/testsuite/gcc.target/arm/handler-align.c
index 6c5187b..b0efa58 100644
--- a/gcc/testsuite/gcc.target/arm/handler-align.c
+++ b/gcc/testsuite/gcc.target/arm/handler-align.c
@@ -29,8 +29,15 @@ int main()
        /* Check stack pointer before/after calling the interrupt
          * handler. Not equal means that handler doesn't restore
          * stack correctly.  */
        save_sp = sp;
-       foo();
+
+        /* The stack is always double-word aligned here. To test interrupt 
handling,
+           force the stack to be not double-word aligned. */
+        asm volatile ("sub\tsp, sp, #4" : : : "memory" );
+        foo ();
+        /* Restore the stack.  */
+        asm volatile ("add\t sp, sp, #4" : : : "memory" );
+
        /* Abort here instead of return non-zero. Due to wrong sp, lr value,
         * returning from main may not work.  */
        if (save_sp != sp)

Reply via email to