On Wed, 13 Dec 2017, Jakub Jelinek wrote:

> Hi!
> 
> PR83391/PR83396 failed because debug bind stmts were put before labels.
> Alex said that is undesirable, and that right now we want to allow
> just debug begin stmt markers before or intermixed with labels.
> 
> This patch ensures that through verification, which is what defines
> what is and isn't valid GIMPLE.  If we ever reconsider it, either allow
> further stmts or disallow even debug begin stmt markers, we can easily also
> tweak the verifier.  The patch has been successfully bootstrapped/regtested as
> part of the:
> 
> https://gcc.gnu.org/ml/gcc-patches/2017-12/msg00811.html                      
>                                                                      
> https://gcc.gnu.org/ml/gcc-patches/2017-12/msg00808.html                      
>                                                                      
> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42861                          
>                                                                      
> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42866                          
>                                                                      
> https://gcc.gnu.org/ml/gcc-patches/2017-12/msg00794.html                      
>                                                                      
> 
> patchset, without the msg00811.html patch it of course doesn't survive
> bootstrap, as we insert debug bind stmts before labels in those cases.
> 
> Ok for trunk once the msg00811.html patch or something similar is committed?

Ok.

Richard.

> 2017-12-13  Jakub Jelinek  <ja...@redhat.com>
> 
>       * tree-cfg.c (verify_gimple_in_cfg): Verify no non-label stmts
>       with the exception of debug begin stmt markers appear before
>       labels.
> 
> --- gcc/tree-cfg.c.jj 2017-12-12 21:24:23.000000000 +0100
> +++ gcc/tree-cfg.c    2017-12-13 07:44:15.622790922 +0100
> @@ -5380,6 +5380,7 @@ verify_gimple_in_cfg (struct function *f
>         err |= err2;
>       }
>  
> +      bool label_allowed = true;
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>       {
>         gimple *stmt = gsi_stmt (gsi);
> @@ -5396,6 +5397,19 @@ verify_gimple_in_cfg (struct function *f
>             err2 = true;
>           }
>  
> +       /* Labels may be preceded only by debug markers, not debug bind
> +          or source bind or any other statements.  */
> +       if (gimple_code (stmt) == GIMPLE_LABEL)
> +         {
> +           if (!label_allowed)
> +             {
> +               error ("gimple label in the middle of a basic block");
> +               err2 = true;
> +             }
> +         }
> +       else if (!gimple_debug_begin_stmt_p (stmt))
> +         label_allowed = false;
> +
>         err2 |= verify_gimple_stmt (stmt);
>         err2 |= verify_location (&blocks, gimple_location (stmt));
>  
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to