Ping ^ 2
On Fri, Aug 5, 2011 at 8:56 AM, Ye Joey <joey.ye...@gmail.com> wrote: > Ping > > On Wed, Aug 3, 2011 at 8:44 AM, Joey Ye <joey...@arm.com> wrote: >> >> This patch fixes PR49437 with a single line change in ARM backend >> and a regression test case for ARM target >> >> ChangeLog: >> 2011-08-02 Matthew Gretton-Dann <matthew.gretton-d...@arm.com> >> PR target/49437 >> * config/arm/arm.c (arm_output_epilogue): Properly handle epilogue >> when stack was realigned in interrupt handler prologue. >> >> 2011-08-02 Joey Ye <joey...@arm.com> >> PR target/49437 >> * gcc.target/arm/handler-align.c: New test. >> * lib/target-supports.exp (check_effective_target_arm_cortex_m): >> New Function. >> >> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c >> index d9763d2..427c58d 100644 >> --- a/gcc/config/arm/arm.c >> +++ b/gcc/config/arm/arm.c >> @@ -14878,6 +14878,7 @@ arm_output_epilogue (rtx sibling) >> && !crtl->calls_eh_return >> && bit_count(saved_regs_mask) * 4 == count >> && !IS_INTERRUPT (func_type) >> + && !IS_STACKALIGN (func_type) >> && !crtl->tail_call_emit) >> { >> unsigned long mask; >> diff --git a/gcc/testsuite/gcc.target/arm/handler-align.c >> b/gcc/testsuite/gcc.target/arm/handler-align.c >> new file mode 100644 >> index 0000000..6c5187b >> --- /dev/null >> +++ b/gcc/testsuite/gcc.target/arm/handler-align.c >> @@ -0,0 +1,42 @@ >> +/* Test epilogue of a realigned interrupt handler. */ >> +/* { dg-do run } */ >> +/* { dg-options "-mthumb -Os" } */ >> +/* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */ >> +/* { dg-require-effective-target arm_cortex_m } */ >> +/* { dg-require-effective-target arm_eabi } */ >> + >> +extern __attribute__((noreturn)) void abort(void); >> +extern int snprintf(char *, int, const char *, ...); >> + >> +#define BUFF_LEN 256 >> +char buff[BUFF_LEN]; >> + >> +char *get_buffer(void) >> +{ >> + return buff; >> +} >> + >> +void __attribute__((interrupt)) foo(void) >> +{ >> + char *msg = get_buffer(); >> + snprintf(msg, BUFF_LEN, "%d %p", 1, buff+BUFF_LEN); >> +} >> + >> +volatile void * save_sp; >> +int main() >> +{ >> + register volatile void * sp asm("sp"); >> + /* Check stack pointer before/after calling the interrupt >> + * handler. Not equal means that handler doesn't restore >> + * stack correctly. */ >> + save_sp = sp; >> + foo(); >> + /* Abort here instead of return non-zero. Due to wrong sp, lr value, >> + * returning from main may not work. */ >> + if (save_sp != sp) >> + { >> + sp = save_sp; >> + abort(); >> + } >> + return 0; >> +} >> diff --git a/gcc/testsuite/lib/target-supports.exp >> b/gcc/testsuite/lib/target-supports.exp >> index cf44f1e..10cfcb4 100644 >> --- a/gcc/testsuite/lib/target-supports.exp >> +++ b/gcc/testsuite/lib/target-supports.exp >> @@ -2108,6 +2108,19 @@ proc check_effective_target_arm_thumb2 { } { >> } ""] >> } >> >> +# Return 1 if this is an ARM cortex-M profile cpu >> + >> +proc check_effective_target_arm_cortex_m { } { >> + return [check_no_compiler_messages arm_cortex_m assembly { >> + #if !defined(__ARM_ARCH_7M__) \ >> + && !defined (__ARM_ARCH_7EM__) \ >> + && !defined (__ARM_ARCH_6M__) >> + #error FOO >> + #endif >> + int i; >> + } "-mthumb"] >> +} >> + >> # Return 1 if the target supports executing NEON instructions, 0 >> # otherwise. Cache the result. >> >> >> >> >> >