From f3a81b39c05f955e6203ec1a61b517563d63314f Mon Sep 17 00:00:00 2001 From: Greta Yorsh Date: Thu, 2 May 2013 16:45:10 +0100 Subject: [PATCH] re PR rtl-optimization/56732 (ICE in advance_target_bb) gcc/ChangeLog 2013-05-02 Greta Yorsh PR target/56732 * config/arm/arm.c (arm_expand_epilogue): Check really_return before generating simple_return for naked functions. gcc/testsuite/ChangeLog 2013-05-02 Greta Yorsh PR target/56732 * gcc.target/arm/pr56732-1.c: New test. From-SVN: r198547 --- gcc/ChangeLog | 6 ++++++ gcc/config/arm/arm.c | 3 ++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/arm/pr56732-1.c | 20 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/arm/pr56732-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a3d4666076..cd257b12c75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-05-02 Greta Yorsh + + PR target/56732 + * config/arm/arm.c (arm_expand_epilogue): Check really_return before + generating simple_return for naked functions. + 2013-05-02 Martin Jambor PR middle-end/56988 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index bc4247358eb..0b97cf89d18 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -24114,7 +24114,8 @@ arm_expand_epilogue (bool really_return) if (IS_NAKED (func_type) || (IS_VOLATILE (func_type) && TARGET_ABORT_NORETURN)) { - emit_jump_insn (simple_return_rtx); + if (really_return) + emit_jump_insn (simple_return_rtx); return; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f345ffb700..28a1f4336cc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-05-02 Greta Yorsh + + PR target/56732 + * gcc.target/arm/pr56732-1.c: New test. + 2013-05-02 Martin Jambor PR middle-end/56988 diff --git a/gcc/testsuite/gcc.target/arm/pr56732-1.c b/gcc/testsuite/gcc.target/arm/pr56732-1.c new file mode 100644 index 00000000000..ac8b8cf6708 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr56732-1.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target naked_functions } */ +/* { dg-options "-O2 -Wall" } */ +extern void bar(); + +void __attribute__((__naked__)) +foo(void) +{ + bar (); +} + +int __attribute__((naked)) +zoo (int a, int b, int c, int d, int e, int f) +{ + bar (); + return e; +} +/* Verify that __attribute__((naked)) produces a naked function that + does not use bx to return. */ +/* { dg-final { scan-assembler-not "\tbx\tlr" } } */ -- 2.30.2