This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] [PR79542][Ada] Fix ICE in dwarf2out.c with nested func. inlining


On Tue, Aug 15, 2017 at 1:16 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Sat, Aug 12, 2017 at 11:09 AM, Pierre-Marie de Rodat
> <derodat@adacore.com> wrote:
>> On 08/11/2017 11:29 PM, Jason Merrill wrote:
>>>
>>> OK.
>>
>>
>> Committed. Thank you for your sustained review effort, Jason. :-)
>
> The way you use decl_ultimate_origin conflicts with the early LTO
> debug patches which
> make dwarf2out_abstract_function call set_decl_origin_self and thus the assert
> in gen_typedef_die triggers (and the rest probably misbehaves).
>
> Now I wonder whether we at any point need that self-origin?
>
> Currently it's set via
>
> static dw_die_ref
> gen_decl_die (tree decl, tree origin, struct vlr_context *ctx,
>               dw_die_ref context_die)
> {
> ...
>     case FUNCTION_DECL:
> #if 0
>       /* FIXME */
>       /* This doesn't work because the C frontend sets DECL_ABSTRACT_ORIGIN
>          on local redeclarations of global functions.  That seems broken.  */
>       if (current_function_decl != decl)
>         /* This is only a declaration.  */;
> #endif
>
>       /* If we're emitting a clone, emit info for the abstract instance.  */
>       if (origin || DECL_ORIGIN (decl) != decl)
>         dwarf2out_abstract_function (origin
>                                      ? DECL_ORIGIN (origin)
>                                      : DECL_ABSTRACT_ORIGIN (decl));
>
>       /* If we're emitting an out-of-line copy of an inline function,
>          emit info for the abstract instance and set up to refer to it.  */
>       else if (cgraph_function_possibly_inlined_p (decl)
>                && ! DECL_ABSTRACT_P (decl)
>                && ! class_or_namespace_scope_p (context_die)
>                /* dwarf2out_abstract_function won't emit a die if this is just
>                   a declaration.  We must avoid setting DECL_ABSTRACT_ORIGIN in
>                   that case, because that works only if we have a die.  */
>                && DECL_INITIAL (decl) != NULL_TREE)
>         {
>           dwarf2out_abstract_function (decl);
>           set_decl_origin_self (decl);
>         }
>
> ok, not doing this at all doesn't work, doing it only in the above case neither.
>
> Bah.
>
> Can anyone explain to me why we do the set_decl_origin_self dance?

Ok, so I need the following incremental patch to fix the fallout.

This allows Ada LTO bootstrap to succeed with the early LTO debug patches.

I assume this change is ok ontop of the LTO debug patches unless I
hear otherwise
til Monday (when I then finally will commit the series).

Full bootstrap/testing running now.

Thanks,
Richard.

2017-08-18  Richard Biener  <rguenther@suse.de>

        * dwarf2out.c (modified_type_die): Check for self origin before
        recursing.
        (gen_type_die_with_usage): Likewise.
        (gen_typedef_die): Allow self origin.
        * tree.c (variably_modified_type_p): Guard against Ada recursive
        pointer types.

Attachment: p
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]