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. */ > >