diff mbox

[1/2] cfgrtl: Don't crash in rtl_dump_bb if BB_END(bb) is NULL

Message ID ba0333cf3b7a6482dc31799b59f492a6d00ae25f.1500903892.git.segher@kernel.crashing.org
State New
Headers show

Commit Message

Segher Boessenkool July 24, 2017, 1:54 p.m. UTC
Currently rtl_dump_bb crashes if BB_END(bb) is NULL, like it can be
during expand (rtl_dump_bb can be called at any time, by the emergency
dump added recently for example).

This fixes it.


Segher


2017-07-24  Segher Boessenkool  <segher@kernel.crashing.org>

	* gcc/cfgrtl.c (rtl_dump_bb): Don't call NEXT_INSN on NULL.

---
 gcc/cfgrtl.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

Comments

Richard Biener July 24, 2017, 6:26 p.m. UTC | #1
On July 24, 2017 3:54:05 PM GMT+02:00, Segher Boessenkool <segher@kernel.crashing.org> wrote:
>Currently rtl_dump_bb crashes if BB_END(bb) is NULL, like it can be
>during expand (rtl_dump_bb can be called at any time, by the emergency
>dump added recently for example).

Ick.

>This fixes it.

OK.

Richard.

>
>Segher
>
>
>2017-07-24  Segher Boessenkool  <segher@kernel.crashing.org>
>
>	* gcc/cfgrtl.c (rtl_dump_bb): Don't call NEXT_INSN on NULL.
>
>---
> gcc/cfgrtl.c | 30 ++++++++++++++++--------------
> 1 file changed, 16 insertions(+), 14 deletions(-)
>
>diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
>index 58d87fe..6ef47b7 100644
>--- a/gcc/cfgrtl.c
>+++ b/gcc/cfgrtl.c
>@@ -2109,8 +2109,6 @@ commit_edge_insertions (void)
> static void
>rtl_dump_bb (FILE *outf, basic_block bb, int indent, dump_flags_t
>flags)
> {
>-  rtx_insn *insn;
>-  rtx_insn *last;
>   char *s_indent;
> 
>   s_indent = (char *) alloca ((size_t) indent + 1);
>@@ -2124,18 +2122,22 @@ rtl_dump_bb (FILE *outf, basic_block bb, int
>indent, dump_flags_t flags)
>     }
> 
>   if (bb->index != ENTRY_BLOCK && bb->index != EXIT_BLOCK)
>-    for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn !=
>last;
>-	 insn = NEXT_INSN (insn))
>-      {
>-	if (flags & TDF_DETAILS)
>-	  df_dump_insn_top (insn, outf);
>-	if (! (flags & TDF_SLIM))
>-	  print_rtl_single (outf, insn);
>-	else
>-	  dump_insn_slim (outf, insn);
>-	if (flags & TDF_DETAILS)
>-	  df_dump_insn_bottom (insn, outf);
>-      }
>+    {
>+      rtx_insn *last = BB_END (bb);
>+      if (last)
>+	last = NEXT_INSN (last);
>+      for (rtx_insn *insn = BB_HEAD (bb); insn != last; insn =
>NEXT_INSN (insn))
>+	{
>+	  if (flags & TDF_DETAILS)
>+	    df_dump_insn_top (insn, outf);
>+	  if (! (flags & TDF_SLIM))
>+	    print_rtl_single (outf, insn);
>+	  else
>+	    dump_insn_slim (outf, insn);
>+	  if (flags & TDF_DETAILS)
>+	    df_dump_insn_bottom (insn, outf);
>+	}
>+    }
> 
>   if (df && (flags & TDF_DETAILS))
>     {
diff mbox

Patch

diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 58d87fe..6ef47b7 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -2109,8 +2109,6 @@  commit_edge_insertions (void)
 static void
 rtl_dump_bb (FILE *outf, basic_block bb, int indent, dump_flags_t flags)
 {
-  rtx_insn *insn;
-  rtx_insn *last;
   char *s_indent;
 
   s_indent = (char *) alloca ((size_t) indent + 1);
@@ -2124,18 +2122,22 @@  rtl_dump_bb (FILE *outf, basic_block bb, int indent, dump_flags_t flags)
     }
 
   if (bb->index != ENTRY_BLOCK && bb->index != EXIT_BLOCK)
-    for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
-	 insn = NEXT_INSN (insn))
-      {
-	if (flags & TDF_DETAILS)
-	  df_dump_insn_top (insn, outf);
-	if (! (flags & TDF_SLIM))
-	  print_rtl_single (outf, insn);
-	else
-	  dump_insn_slim (outf, insn);
-	if (flags & TDF_DETAILS)
-	  df_dump_insn_bottom (insn, outf);
-      }
+    {
+      rtx_insn *last = BB_END (bb);
+      if (last)
+	last = NEXT_INSN (last);
+      for (rtx_insn *insn = BB_HEAD (bb); insn != last; insn = NEXT_INSN (insn))
+	{
+	  if (flags & TDF_DETAILS)
+	    df_dump_insn_top (insn, outf);
+	  if (! (flags & TDF_SLIM))
+	    print_rtl_single (outf, insn);
+	  else
+	    dump_insn_slim (outf, insn);
+	  if (flags & TDF_DETAILS)
+	    df_dump_insn_bottom (insn, outf);
+	}
+    }
 
   if (df && (flags & TDF_DETAILS))
     {