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.
>>
>>
>>
>>
>>
>

Reply via email to