On Sun, Apr 3, 2011 at 12:14 PM, Michael Matz <m...@suse.de> wrote:
> Hi,
>
> On Thu, 31 Mar 2011, Richard Guenther wrote:
>
>> > In the meanwhile, is the below version okay?
>>
>> If it bootstraps & tests ok then yes.  The java parts look obvious.
>
> So, we indeed can't remove the other calls to
> canonicalize_constructor_val, because of local ctors.  And fortran has a
> similar problem with java.  Instead of fixing up all these places of
> resetting cfun (where otherwise the frontends don't deal at all with it,
> it's mostly just set from the various cgraph routines), I decided to
> simply clear this at the appropriate place in
> cgraph_finalize_compilation_unit.
>
> Regstrapping in progress again.  Still okay if that works?

Ok.

Thanks,
Richard.

>
> Ciao,
> Michael.
> --
>        * cgraphbuild.c (record_reference): Canonicalize constructor
>        values.
>        * gimple-fold.c (canonicalize_constructor_val): Accept being called
>        without function context.
>        * cgraphunit.c (cgraph_finalize_compilation_unit): Clear
>        current_function_decl and cfun.
>
> Index: cgraphbuild.c
> ===================================================================
> --- cgraphbuild.c.orig  2011-04-03 11:28:45.000000000 +0200
> +++ cgraphbuild.c       2011-04-03 11:31:21.000000000 +0200
> @@ -53,6 +53,12 @@ record_reference (tree *tp, int *walk_su
>   tree decl;
>   struct record_reference_ctx *ctx = (struct record_reference_ctx *)data;
>
> +  t = canonicalize_constructor_val (t);
> +  if (!t)
> +    t = *tp;
> +  else if (t != *tp)
> +    *tp = t;
> +
>   switch (TREE_CODE (t))
>     {
>     case VAR_DECL:
> Index: gimple-fold.c
> ===================================================================
> --- gimple-fold.c.orig  2011-04-03 11:28:45.000000000 +0200
> +++ gimple-fold.c       2011-04-03 11:31:21.000000000 +0200
> @@ -106,7 +106,7 @@ can_refer_decl_in_current_unit_p (tree d
>   return true;
>  }
>
> -/* CVAL is value taken from DECL_INITIAL of variable.  Try to transorm it 
> into
> +/* CVAL is value taken from DECL_INITIAL of variable.  Try to transform it 
> into
>    acceptable form for is_gimple_min_invariant.   */
>
>  tree
> @@ -131,10 +131,9 @@ canonicalize_constructor_val (tree cval)
>              || TREE_CODE (base) == FUNCTION_DECL)
>          && !can_refer_decl_in_current_unit_p (base))
>        return NULL_TREE;
> -      if (base && TREE_CODE (base) == VAR_DECL)
> +      if (cfun && base && TREE_CODE (base) == VAR_DECL)
>        add_referenced_var (base);
> -      /* We never have the chance to fixup types in global initializers
> -         during gimplification.  Do so here.  */
> +      /* Fixup types in global initializers.  */
>       if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0)))
>        cval = build_fold_addr_expr (TREE_OPERAND (cval, 0));
>     }
> Index: cgraphunit.c
> ===================================================================
> --- cgraphunit.c.orig   2011-04-03 11:41:46.000000000 +0200
> +++ cgraphunit.c        2011-04-03 11:50:01.000000000 +0200
> @@ -1066,6 +1066,11 @@ cgraph_finalize_compilation_unit (void)
>  {
>   timevar_push (TV_CGRAPH);
>
> +  /* If we're here there's no current function anymore.  Some frontends
> +     are lazy in clearing these.  */
> +  current_function_decl = NULL;
> +  set_cfun (NULL);
> +
>   /* Do not skip analyzing the functions if there were errors, we
>      miss diagnostics for following functions otherwise.  */
>
>

Reply via email to