diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 9589cc68c25b5b15bb364fdae56e24dedbe91601..05485833d306cd79c5405543175b63c2e7e62538 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -20868,11 +20868,9 @@ c_parser_parse_rtl_body (c_parser *parser, char *start_with_pass) return; } - /* If a pass name was provided for START_WITH_PASS, run the backend - accordingly now, on the cfun created above, transferring - ownership of START_WITH_PASS. */ - if (start_with_pass) - run_rtl_passes (start_with_pass); + /* Run the backend on the cfun created above, transferring ownership of + START_WITH_PASS. */ + run_rtl_passes (start_with_pass); } #include "gt-c-c-parser.h" diff --git a/gcc/run-rtl-passes.c b/gcc/run-rtl-passes.c index f65c0af6dfd48aa9ca7ec29b63d7cd4108432178..38765ebbc288e7aef35d7c02693efd534c6b2ddc 100644 --- a/gcc/run-rtl-passes.c +++ b/gcc/run-rtl-passes.c @@ -49,24 +49,31 @@ run_rtl_passes (char *initial_pass_name) switch_to_section (text_section); (*debug_hooks->assembly_start) (); - /* Pass "expand" normally sets this up. */ + if (initial_pass_name) + { + /* Pass "expand" normally sets this up. */ #ifdef INSN_SCHEDULING - init_sched_attrs (); + init_sched_attrs (); #endif + bitmap_obstack_initialize (NULL); + bitmap_obstack_initialize (®_obstack); + opt_pass *rest_of_compilation + = g->get_passes ()->get_rest_of_compilation (); + gcc_assert (rest_of_compilation); + execute_pass_list (cfun, rest_of_compilation); - bitmap_obstack_initialize (NULL); - bitmap_obstack_initialize (®_obstack); - - opt_pass *rest_of_compilation - = g->get_passes ()->get_rest_of_compilation (); - gcc_assert (rest_of_compilation); - execute_pass_list (cfun, rest_of_compilation); - - opt_pass *clean_slate = g->get_passes ()->get_clean_slate (); - gcc_assert (clean_slate); - execute_pass_list (cfun, clean_slate); - - bitmap_obstack_release (®_obstack); + opt_pass *clean_slate = g->get_passes ()->get_clean_slate (); + gcc_assert (clean_slate); + execute_pass_list (cfun, clean_slate); + bitmap_obstack_release (®_obstack); + } + else + { + opt_pass *clean_slate = g->get_passes ()->get_clean_slate (); + gcc_assert (clean_slate); + execute_pass_list (cfun, clean_slate); + } cfun->curr_properties |= PROP_rtl; + free (initial_pass_name); } diff --git a/gcc/testsuite/gcc.dg/rtl/aarch64/unspecified-pass-error.c b/gcc/testsuite/gcc.dg/rtl/aarch64/unspecified-pass-error.c new file mode 100644 index 0000000000000000000000000000000000000000..596501e977044132bd3e9a2d0afd0f8b2b789186 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/aarch64/unspecified-pass-error.c @@ -0,0 +1,30 @@ +/* { dg-do compile { target aarch64-*-* } } */ +/* { dg-additional-options "-O0" } */ + +/* + Ensure an __RTL function with an unspecified "startwith" pass doesn't cause + an assertion error on the next function. + */ + +int __RTL () badfoo () +{ +(function "badfoo" + (insn-chain + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 101 (set (reg:DI x19) (reg:DI x0))) + (cinsn 10 (use (reg/i:SI x19))) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain +) ;; function "foo2" +} + +/* Compile a valid C function to test the clean_state pass has been run. */ +int +foo_a () +{ + return 200; +} +