On Wed, Mar 11, 2020 at 8:56 AM Eric Botcazou <ebotca...@adacore.com> wrote: > > Hi, > > this is a GIMPLE verification failure in LTO mode on Ada code: > > /vol/gcc/src/hg/master/local/gcc/testsuite/gnat.dg/lto24_pkg1.ads:9:8: error: > type mismatch in 'component_ref' > lto24_pkg1__rec___b___XVN > > lto24_pkg1__rec___b___XVN > > The __XVN fields are the fields with QUAL_UNION_TYPE in Ada, which is the only > language using this type. The issue is that tree_is_indexable doesn't return > the same result for a FIELD_DECL with QUAL_UNION_TYPE and the QUAL_UNION_TYPE, > resulting in two instances of the QUAL_UNION_TYPE in the bytecode. The result > for the type is the correct one (false, since it is variably modified) while > the result for the field is falsely true because: > > else if (TREE_CODE (t) == FIELD_DECL > && lto_variably_modified_type_p (DECL_CONTEXT (t))) > return false; > > is not satisfied. The reason for this is that the DECL_QUALIFIER of fields of > a QUAL_UNION_TYPE depends on a discriminant in Ada, which means that the size > of the type does too (CONTAINS_PLACEHOLDER_P), which in turn means that it is > reset to a mere PLACEHOLDER_EXPR by free_lang_data, which finally means that > the size of DECL_CONTEXT is too, so RETURN_TRUE_IF_VAR is false. > > In other words, the CONTAINS_PLACEHOLDER_P property of the DECL_QUALIFIER of > fields of a QUAL_UNION_TYPE hides the variably_modified_type_p property of > these fields, if you look from the outside. > > This was clearly overlooked (by me) when the handling of PLACEHOLDER_EXPR was > added to LTO a decade ago, but I think that it's now too late to fundamentally > change how this is done, so I propose the attached fix. > > Tested on SPARC/Solaris and x86-64/Linux, OK for the mainline? It's not a > regression, but the fix is a no-op except for Ada and we have been using it > internally for some time without any issue so far.
OK. Note I wondered for some time whether we can pre-compute (and LTO stream) whether a type is variably modified during type layout? Thanks, Richard. > > 2020-03-11 Eric Botcazou <ebotca...@adacore.com> > > PR middle-end/93961 > * tree.c (variably_modified_type_p) <RECORD_TYPE>: Recurse into fields > whose type is a qualified union. > > -- > Eric Botcazou