This avoids segfaulting in the GIMPLE parser on invalid input.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2019-10-28  Richard Biener  <rguent...@suse.de>

        PR c/92249
        * gimple-parser.c (c_parser_parse_gimple_body): Make
        current_bb the entry block initially to easier recover
        from errors.
        (c_parser_gimple_compound_statement): Adjust.

Index: gcc/c/gimple-parser.c
===================================================================
--- gcc/c/gimple-parser.c       (revision 277504)
+++ gcc/c/gimple-parser.c       (working copy)
@@ -235,6 +235,7 @@ c_parser_parse_gimple_body (c_parser *cp
       /* We have at least cdil_gimple_cfg.  */
       gimple_register_cfg_hooks ();
       init_empty_tree_cfg ();
+      parser.current_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
       /* Initialize the bare loop structure - we are going to only
          mark headers and leave the rest to fixup.  */
       set_loops_for_fn (cfun, ggc_cleared_alloc<struct loops> ());
@@ -594,7 +595,7 @@ c_parser_gimple_compound_statement (gimp
              if (last_basic_block_for_fn (cfun) <= index)
                last_basic_block_for_fn (cfun) = index + 1;
              n_basic_blocks_for_fn (cfun)++;
-             if (!parser.current_bb)
+             if (parser.current_bb->index == ENTRY_BLOCK)
                parser.push_edge (ENTRY_BLOCK, bb->index, EDGE_FALLTHRU,
                                  profile_probability::always ());
 

Reply via email to