Patchwork Add new debug_bb_range debugging function

login
register
mail settings
Submitter Dodji Seketeli
Date Feb. 16, 2013, 10:08 a.m.
Message ID <874nhca7vu.fsf@redhat.com>
Download mbox | patch
Permalink /patch/220955/
State New
Headers show

Comments

Dodji Seketeli - Feb. 16, 2013, 10:08 a.m.
Jakub Jelinek <jakub@redhat.com> writes:

> On Sat, Feb 16, 2013 at 10:40:43AM +0100, Dodji Seketeli wrote:
>> --- a/gcc/cfg.c
>> +++ b/gcc/cfg.c
>> @@ -663,6 +663,21 @@ debug_bb_n (int n)
>>    return bb;
>>  }
>>  
>> +/* Dumps cfg related information about basic blocks, from number 'S'
>> +   to number E, to stderr.  */
>> +
>> +DEBUG_FUNCTION basic_block
>> +debug_bb_range (int s, int e)
>> +{
>> +  basic_block bb =  NULL;
>> +  for (int i = s; i <= e; ++i)
>> +    {
>> +      bb = BASIC_BLOCK (i);
>> +      debug_bb (bb);
>
> At some points after cfg changes, but before cfg cleanup there might be
> gaps, so I think you want if (bb) debug_bb (bb);, otherwise it could crash
> in that case.

Right.  I have updated the patch below for that and also to ensure that
we don't try to access a basic block with number >= last_basic_block.

Thanks.

gcc/

	* basic-block.h (debug_bb_range): Declare ...
	* cfg.c (debug_bb_range): ... new function.
---
 gcc/basic-block.h |  1 +
 gcc/cfg.c         | 16 ++++++++++++++++
 2 files changed, 17 insertions(+)
Richard Guenther - Feb. 18, 2013, 9:03 a.m.
On Sat, 16 Feb 2013, Dodji Seketeli wrote:

> Jakub Jelinek <jakub@redhat.com> writes:
> 
> > On Sat, Feb 16, 2013 at 10:40:43AM +0100, Dodji Seketeli wrote:
> >> --- a/gcc/cfg.c
> >> +++ b/gcc/cfg.c
> >> @@ -663,6 +663,21 @@ debug_bb_n (int n)
> >>    return bb;
> >>  }
> >>  
> >> +/* Dumps cfg related information about basic blocks, from number 'S'
> >> +   to number E, to stderr.  */
> >> +
> >> +DEBUG_FUNCTION basic_block
> >> +debug_bb_range (int s, int e)
> >> +{
> >> +  basic_block bb =  NULL;
> >> +  for (int i = s; i <= e; ++i)
> >> +    {
> >> +      bb = BASIC_BLOCK (i);
> >> +      debug_bb (bb);
> >
> > At some points after cfg changes, but before cfg cleanup there might be
> > gaps, so I think you want if (bb) debug_bb (bb);, otherwise it could crash
> > in that case.
> 
> Right.  I have updated the patch below for that and also to ensure that
> we don't try to access a basic block with number >= last_basic_block.

Can you try adding a gdb python thingie instead?  Just for my
own education?

;)

Thanks,
Richard.

> Thanks.
> 
> gcc/
> 
> 	* basic-block.h (debug_bb_range): Declare ...
> 	* cfg.c (debug_bb_range): ... new function.
> ---
>  gcc/basic-block.h |  1 +
>  gcc/cfg.c         | 16 ++++++++++++++++
>  2 files changed, 17 insertions(+)
> 
> diff --git a/gcc/basic-block.h b/gcc/basic-block.h
> index 90eb57b..8407c4a 100644
> --- a/gcc/basic-block.h
> +++ b/gcc/basic-block.h
> @@ -752,6 +752,7 @@ extern bool predictable_edge_p (edge);
>  extern void init_flow (struct function *);
>  extern void debug_bb (basic_block);
>  extern basic_block debug_bb_n (int);
> +extern basic_block debug_bb_range (int, int);
>  extern void dump_flow_info (FILE *, int);
>  extern void expunge_block (basic_block);
>  extern void link_block (basic_block, basic_block);
> diff --git a/gcc/cfg.c b/gcc/cfg.c
> index 9e4380c..d72e075 100644
> --- a/gcc/cfg.c
> +++ b/gcc/cfg.c
> @@ -663,6 +663,22 @@ debug_bb_n (int n)
>    return bb;
>  }
>  
> +/* Dumps cfg related information about basic blocks, from number 'S'
> +   to number E, to stderr.  */
> +
> +DEBUG_FUNCTION basic_block
> +debug_bb_range (int s, int e)
> +{
> +  basic_block bb =  NULL;
> +  for (int i = s; i <= e && i < last_basic_block; ++i)
> +    {
> +      bb = BASIC_BLOCK (i);
> +      if (bb)
> +	debug_bb (bb);
> +    }
> +  return bb;
> +}
> +
>  /* Dumps cfg related information about basic block BB to OUTF.
>     If HEADER is true, dump things that appear before the instructions
>     contained in BB.  If FOOTER is true, dump things that appear after.
>

Patch

diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 90eb57b..8407c4a 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -752,6 +752,7 @@  extern bool predictable_edge_p (edge);
 extern void init_flow (struct function *);
 extern void debug_bb (basic_block);
 extern basic_block debug_bb_n (int);
+extern basic_block debug_bb_range (int, int);
 extern void dump_flow_info (FILE *, int);
 extern void expunge_block (basic_block);
 extern void link_block (basic_block, basic_block);
diff --git a/gcc/cfg.c b/gcc/cfg.c
index 9e4380c..d72e075 100644
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -663,6 +663,22 @@  debug_bb_n (int n)
   return bb;
 }
 
+/* Dumps cfg related information about basic blocks, from number 'S'
+   to number E, to stderr.  */
+
+DEBUG_FUNCTION basic_block
+debug_bb_range (int s, int e)
+{
+  basic_block bb =  NULL;
+  for (int i = s; i <= e && i < last_basic_block; ++i)
+    {
+      bb = BASIC_BLOCK (i);
+      if (bb)
+	debug_bb (bb);
+    }
+  return bb;
+}
+
 /* Dumps cfg related information about basic block BB to OUTF.
    If HEADER is true, dump things that appear before the instructions
    contained in BB.  If FOOTER is true, dump things that appear after.