Le 18/06/2015 13:35, Jakub Jelinek a écrit :
> On Thu, Jun 18, 2015 at 01:18:18PM +0200, Mikael Morin wrote:
>> I'm proposing here a fix for an OpenMP ICE regression introduced by me
>> at http://gcc.gnu.org/r221586
>>
>> That revision changed the order in which procedures are resolved, making
>> it possible for a procedure to be resolved from within an OpenMP
>> construct body.  As the OpenMP constructs set some global state, the
>> procedure's do loop were registered as OpenMP-managed loops.
>>
>> The attached patch clears the OpenMP state upon gfc_resolve entry
>> and restores it upon return.  I don't know the OpenMP code very well,
>> but it seems reasonable to me to do that.
>>
>> Regression-tested on x86_64-linux.  OK for trunk/5 ?
> 
> I just wonder, the resolve_global_procedure code didn't save just
> OpenMP state, but also e.g. gfc_derived_types.  Isn't that a problem
> too with wherever you are now calling gfc_resolve from within resolving
> of some other procedure?
> 
Hmm, for gfc_derived_types at least, I would say no.
gfc_derived_types seems to be a per root namespace global, in other
words shared between contained procedures, so it should not be
saved/restored upon resolution of sibling or internal procedures.
And I don't think it's possible to escape one root namespace;
use-associated symbols are not shared with the corresponding module
symbols for example.
So we are (quite) safe here, I think.

To be honest, I'm not at ease with these globals,  both openmp and
derived_types, and I'm not fond of starting resolution of a different
procedure in the middle of nowhere.  I can try to produce a patch that
walks the procedure code to pick the needed information instead of doing
full procedure resolutions at arbitrary places, if that seems worth it.
 Or try to remove gfc_derived_types.  But IMHO the patch proposed here
makes sense in any case.

Mikael

Reply via email to