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