rtl_dump_bb: fix segfault when reporting internal error
authorIlya Leoshkevich <iii@linux.ibm.com>
Tue, 24 Nov 2020 21:47:11 +0000 (22:47 +0100)
committerIlya Leoshkevich <iii@linux.ibm.com>
Mon, 30 Nov 2020 10:50:30 +0000 (11:50 +0100)
During ICE reporting, sometimes rtl_dump_bb is called on partially
initialized basic blocks.  This produces another ICE, obscuring the
original problem.

Fix by checking that that basic blocks are initialized before touching
their bb_infos.

gcc/ChangeLog:

2020-11-25  Ilya Leoshkevich  <iii@linux.ibm.com>

* cfgrtl.c (rtl_bb_info_initialized_p): New function.
(rtl_dump_bb): Use rtl_bb_info_initialized_p before accessing bb
insns.

gcc/cfgrtl.c

index 45d84d39b2255fb3f44f7d29cabde99282e731a1..5e909e25882f86759d506be3ee643ec10ccd7f4c 100644 (file)
@@ -97,6 +97,7 @@ static basic_block rtl_split_block (basic_block, void *);
 static void rtl_dump_bb (FILE *, basic_block, int, dump_flags_t);
 static int rtl_verify_flow_info_1 (void);
 static void rtl_make_forwarder_block (edge);
+static bool rtl_bb_info_initialized_p (basic_block bb);
 \f
 /* Return true if NOTE is not one of the ones that must be kept paired,
    so that we may simply delete it.  */
@@ -2149,7 +2150,8 @@ rtl_dump_bb (FILE *outf, basic_block bb, int indent, dump_flags_t flags)
       putc ('\n', outf);
     }
 
-  if (bb->index != ENTRY_BLOCK && bb->index != EXIT_BLOCK)
+  if (bb->index != ENTRY_BLOCK && bb->index != EXIT_BLOCK
+      && rtl_bb_info_initialized_p (bb))
     {
       rtx_insn *last = BB_END (bb);
       if (last)
@@ -5135,6 +5137,12 @@ init_rtl_bb_info (basic_block bb)
   bb->il.x.rtl = ggc_cleared_alloc<rtl_bb_info> ();
 }
 
+static bool
+rtl_bb_info_initialized_p (basic_block bb)
+{
+  return bb->il.x.rtl;
+}
+
 /* Returns true if it is possible to remove edge E by redirecting
    it to the destination of the other edge from E->src.  */