> Hi,
> 
> PR 49495 is actually a bug in the verifier that does not look through
> aliases at one point.  Fixed wit the patch below (created a special
> function, otherwise I just wasn't able to fit the 80 column limit).
> Bootstrapped and tested on x86_64-linux.  OK for trunk?
> 
> Thanks,
> 
> Martin
> 
> 
> 2011-07-02  Martin Jambor  <mjam...@suse.cz>
> 
>       PR middle-end/49495
>       * cgraphunit.c (verify_edge_corresponds_to_fndecl): New function.
>       (verify_cgraph_node): Some functinality moved to
>       verify_edge_corresponds_to_fndecl, call it.

This is OK.
> 
> 
> Index: src/gcc/cgraphunit.c
> ===================================================================
> --- src.orig/gcc/cgraphunit.c
> +++ src/gcc/cgraphunit.c
> @@ -450,6 +450,34 @@ cgraph_debug_gimple_stmt (struct functio
>    debug_gimple_stmt (stmt);
>  }
>  
> +/* Verify that call graph edge E corresponds to DECL from the associated
> +   statement.  Return true if the verification should fail.  */
> +
> +static bool
> +verify_edge_corresponds_to_fndecl (struct cgraph_edge *e, tree decl)
> +{
> +  if (!e->callee->global.inlined_to
> +      && decl
> +      && cgraph_get_node (decl)
> +      && (e->callee->former_clone_of
> +       != cgraph_function_or_thunk_node (cgraph_get_node (decl), NULL)->decl)
> +      /* IPA-CP sometimes redirect edge to clone and then back to the former
> +      function.  This ping-pong has to go, eventaully.  */
> +      && (cgraph_function_or_thunk_node (cgraph_get_node (decl), NULL)
> +       != cgraph_function_or_thunk_node (e->callee, NULL))
> +      && !clone_of_p (cgraph_get_node (decl),
> +                   e->callee))
> +    {
> +      error ("edge points to wrong declaration:");
> +      debug_tree (e->callee->decl);
> +      fprintf (stderr," Instead of:");
> +      debug_tree (decl);
> +      return true;
> +    }
> +  else
> +    return false;
> +}
> +
>  /* Verify cgraph nodes of given cgraph node.  */
>  DEBUG_FUNCTION void
>  verify_cgraph_node (struct cgraph_node *node)
> @@ -702,24 +730,8 @@ verify_cgraph_node (struct cgraph_node *
>                         }
>                       if (!e->indirect_unknown_callee)
>                         {
> -                         if (!e->callee->global.inlined_to
> -                             && decl
> -                             && cgraph_get_node (decl)
> -                             && (e->callee->former_clone_of
> -                                 != cgraph_get_node (decl)->decl)
> -                             /* IPA-CP sometimes redirect edge to clone and 
> then back to the former
> -                                function.  This ping-pong has to go, 
> eventaully.  */
> -                             && (cgraph_function_or_thunk_node 
> (cgraph_get_node (decl), NULL)
> -                                 != cgraph_function_or_thunk_node 
> (e->callee, NULL))
> -                             && !clone_of_p (cgraph_get_node (decl),
> -                                             e->callee))
> -                           {
> -                             error ("edge points to wrong declaration:");
> -                             debug_tree (e->callee->decl);
> -                             fprintf (stderr," Instead of:");
> -                             debug_tree (decl);
> -                             error_found = true;
> -                           }
> +                         if (verify_edge_corresponds_to_fndecl (e, decl))
> +                           error_found = true;
Could you please move the error output here, somehow I like it better when all
the diagnostic is output at single place...

Honza
>                         }
>                       else if (decl)
>                         {

Reply via email to