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)