[patch] Fix middle-end/93961

Richard Biener richard.guenther@gmail.com
Wed Mar 11 08:30:27 GMT 2020


On Wed, Mar 11, 2020 at 8:56 AM Eric Botcazou <ebotcazou@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  <ebotcazou@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


More information about the Gcc-patches mailing list