Hi!

We say in the documentation only supported body of naked functions
is basic asm, anything else may but might not work.  On the following
testcase we end up with ICE, because the missing epilogue means the first
partition is not separated from the second partition with a barrier and
something before that.

I think easiest is just not to partition such functions, for the really
supported case it shouldn't make a difference anyway.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2018-05-31  Jakub Jelinek  <ja...@redhat.com>

        PR target/85984
        * bb-reorder.c (pass_partition_blocks::gate): Return false for
        functions with naked attribute.

        * gcc.target/i386/pr85984.c: New test.

--- gcc/bb-reorder.c.jj 2018-05-09 20:12:28.399260557 +0200
+++ gcc/bb-reorder.c    2018-05-30 16:01:12.113006870 +0200
@@ -2928,8 +2928,8 @@ pass_partition_blocks::gate (function *f
 {
   /* The optimization to partition hot/cold basic blocks into separate
      sections of the .o file does not work well with linkonce or with
-     user defined section attributes.  Don't call it if either case
-     arises.  */
+     user defined section attributes or with naked attribute.  Don't call
+     it if either case arises.  */
   return (flag_reorder_blocks_and_partition
          && optimize
          /* See pass_reorder_blocks::gate.  We should not partition if
@@ -2937,6 +2937,7 @@ pass_partition_blocks::gate (function *f
          && optimize_function_for_speed_p (fun)
          && !DECL_COMDAT_GROUP (current_function_decl)
          && !lookup_attribute ("section", DECL_ATTRIBUTES (fun->decl))
+         && !lookup_attribute ("naked", DECL_ATTRIBUTES (fun->decl))
          /* Workaround a bug in GDB where read_partial_die doesn't cope
             with DIEs with DW_AT_ranges, see PR81115.  */
          && !(in_lto_p && MAIN_NAME_P (DECL_NAME (fun->decl))));
--- gcc/testsuite/gcc.target/i386/pr85984.c.jj  2018-05-30 16:08:24.951523398 
+0200
+++ gcc/testsuite/gcc.target/i386/pr85984.c     2018-05-30 16:08:12.184508165 
+0200
@@ -0,0 +1,18 @@
+/* PR target/85984 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int foo (void);
+
+void __attribute__((naked))
+bar (void)
+{
+  if (!foo ())
+    __builtin_abort ();
+}
+
+void
+baz (void)
+{
+  bar ();
+}

        Jakub

Reply via email to