On May 31, 2018 8:51:59 AM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote:
>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?

Is naked an attribute that is specified for all targets? If so, OK. Otherwise 
we may instead want to add a target hook for whether a function has a 
prologue/epilogue? 

Richard. 

>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