From patchwork Wed Aug 3 00:44:42 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joey Ye X-Patchwork-Id: 108012 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id B3AEEB71CF for ; Wed, 3 Aug 2011 10:45:13 +1000 (EST) Received: (qmail 25018 invoked by alias); 3 Aug 2011 00:45:11 -0000 Received: (qmail 25007 invoked by uid 22791); 3 Aug 2011 00:45:10 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL, BAYES_00, MSGID_MULTIPLE_AT, RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from service87.mimecast.com (HELO service87.mimecast.com) (94.185.240.25) by sourceware.org (qpsmtpd/0.43rc1) with SMTP; Wed, 03 Aug 2011 00:44:56 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Wed, 03 Aug 2011 01:44:53 +0100 Received: from E103005 ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 3 Aug 2011 01:44:50 +0100 From: "Joey Ye" To: Subject: [PATCH, ARM] Fix PR target/49437 Thumb2 epilog with stack realignment Date: Wed, 3 Aug 2011 08:44:42 +0800 Message-ID: <000001cc5176$8a702d60$9f508820$@ye@arm.com> MIME-Version: 1.0 x-cr-hashedpuzzle: LkM= BDy2 DQzQ D460 EQnR Eu28 E+uQ FNYa Gt6/ G07I HT12 IJQ8 IOKN IvAK J6ct Kx1B; 1; ZwBjAGMALQBwAGEAdABjAGgAZQBzAEAAZwBjAGMALgBnAG4AdQAuAG8AcgBnAA==; Sosha1_v1; 7; {D6842F2B-3FE8-496A-A6F0-833EC9C7FD2F}; agBvAGUAeQAuAHkAZQBAAGEAcgBtAC4AYwBvAG0A; Wed, 03 Aug 2011 00:44:39 GMT; WwBQAEEAVABDAEgALAAgAEEAUgBNAF0AIABGAGkAeAAgAFAAUgAgAHQAYQByAGcAZQB0AC8ANAA5ADQAMwA3ACAAVABoAHUAbQBiADIAIABlAHAAaQBsAG8AZwAgAHcAaQB0AGgAIABzAHQAYQBjAGsAIAByAGUAYQBsAGkAZwBuAG0AZQBuAHQA x-cr-puzzleid: {D6842F2B-3FE8-496A-A6F0-833EC9C7FD2F} X-MC-Unique: 111080301445300201 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 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 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.