On Sat, 16 Feb 2013, Dodji Seketeli wrote:
> Jakub Jelinek <[email protected]> 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.
>
--
Richard Biener <[email protected]>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend