2015-03-27 18:23 GMT+03:00 Jan Hubicka <hubi...@ucw.cz>:
> Hi,
> this patch fixes bug in symtab_node::verify_symtab_nodes pointed out by Ilya.
> The loop checking that there all comdats are linked by same_comdat_group was
> completely bogus.  In addition it checked also external symbols that are
> currently not kept in groups.  This bug was in mainline for months but
> apparently bounds checking is first code producing interesting comdat groups 
> to
> trigger it.
>
> Ilya, can you please mind comitting the testcase? I am not quite sure where
> bounds checking should go offhand.
>
> Also concerning linking the comdat groups, currently all non-DECL_EXTERNAL 
> symbols
> are linked and all !DECL_EXTERNAL symbols are non-linked.  Bounds checking 
> should
> follow this scheme.  It may be cleaner to keep links for DECL_EXTERNAL, but 
> lets
> deffer that for next stage1.
>
> Bootstrapped/regtested x86_64-linux. Committed.
>
> Honza
>
> Index: ChangeLog
> ===================================================================
> --- ChangeLog   (revision 221735)
> +++ ChangeLog   (working copy)
> @@ -1,5 +1,11 @@
>  2015-03-27  Jan Hubicka  <hubi...@ucw.cz>
>
> +       PR target/65531
> +       * symtab.c (symtab_node::verify_symtab_nodes): Fix verification of
> +       comdat groups.
> +
> +2015-03-27  Jan Hubicka  <hubi...@ucw.cz>
> +
>         PR ipa/65600
>         * cgraph.c (cgraph_update_edges_for_call_stmt_node): Fix the case
>         of optimized out indirect call.
> Index: symtab.c
> ===================================================================
> --- symtab.c    (revision 221734)
> +++ symtab.c    (working copy)
> @@ -1130,15 +1130,20 @@ symtab_node::verify_symtab_nodes (void)
>                                                   &existed);
>           if (!existed)
>             *entry = node;
> -         else
> -           for (s = (*entry)->same_comdat_group; s != NULL && s != node; s = 
> s->same_comdat_group)
> +         else if (!DECL_EXTERNAL (node->decl))
> +           {
> +             for (s = (*entry)->same_comdat_group; s != NULL && s != node;
> +                  s = s->same_comdat_group)
> +               ;

With no if-statement in the loop body you need an additional exit
condition for a case when you reach the entry.

Thanks,
Ilya

>               if (!s || s == *entry)
>                 {
> -                 error ("Two symbols with same comdat_group are not linked 
> by the same_comdat_group list.");
> +                 error ("Two symbols with same comdat_group are not linked 
> by "
> +                        "the same_comdat_group list.");
>                   (*entry)->debug ();
>                   node->debug ();
>                   internal_error ("symtab_node::verify failed");
>                 }
> +           }
>         }
>      }
>  }

Reply via email to