Epilogue in RTL (r188743) generated for naked functions adds simple return
jump insn and causes an ICE, as described here:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56732
There is a missing check of really_return argument in arm_expand_epilogue.
This patch adds the missing check and a new test.
No regression on qemu for arm-none-eabi with cortex-a15 arm/thumb.
Bootstrap successful on Cortex-A15 and no regression.
Ok for trunk?
Thanks,
Greta
gcc/ChangeLog
2013-05-02 Greta Yorsh <greta.yo...@arm.com>
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 <greta.yo...@arm.com>
PR target/56732
* gcc.target/arm/pr56732-1.c: New test.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 464d91c..9d4a453 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -24067,7 +24067,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/gcc.target/arm/pr56732-1.c
b/gcc/testsuite/gcc.target/arm/pr56732-1.c
new file mode 100644
index 0000000..ac8b8cf
--- /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" } } */