[patch] Fix dangling references in thunks at -O0

Richard Biener richard.guenther@gmail.com
Mon Sep 14 07:53:46 GMT 2020


On Mon, Sep 14, 2020 at 9:46 AM Eric Botcazou <botcazou@adacore.com> wrote:
>
> Hi,
>
> when a thunk cannot be emitted in assembly directly, cgraph_node::expand_thunk
> generates regular GIMPLE code but unconditionally forces a tail call to the
> target of the thunk.  That's theoretically OK because the thunk essentially
> forwards its parameters to the target, but in practice the RTL expander can
> spill parameters passed by reference on the stack, see assign_parm_setup_reg:
>
>   /* If we were passed a pointer but the actual value can safely live
>      in a register, retrieve it and use it directly.  */
>   if (data->arg.pass_by_reference && TYPE_MODE (TREE_TYPE (parm)) != BLKmode)
>     {
>       /* We can't use nominal_mode, because it will have been set to
>          Pmode above.  We must use the actual mode of the parm.  */
>       if (use_register_for_decl (parm))
>         {
>           parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
>           mark_user_reg (parmreg);
>         }
>       else
>         {
>           int align = STACK_SLOT_ALIGNMENT (TREE_TYPE (parm),
>                                     TYPE_MODE (TREE_TYPE (parm)),
>                             TYPE_ALIGN (TREE_TYPE (parm)));
>           parmreg
>             = assign_stack_local (TYPE_MODE (TREE_TYPE (parm)),
>                   GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parm))),
>                                   align);
>           set_mem_attributes (parmreg, parm, 1);
>         }
>
> use_register_for_decl always return false at -O0 so, in this case, the thunk
> will pass an address within its frame to its target, so it cannot use a tail
> call to invoke it.
>
> Tested on x86_64-suse-linux, OK for the mainline?

ISTR the tailcall flag is only a hint and RTL expansion can decide to
not tailcall based on targets.  So to me it looks like a missed disqualification
on the RTL expansion side.  Or do we, besides from this very single spot,
simply never tailcall at -O0 and thus never hit this latent issue?

How does this change the debug experience at -O0 when GIMPLE thunks
are used?

Thanks,
Richard.

>
> 2020-09-14  Eric Botcazou  <ebotcazou@adacore.com>
>
>         * cgraphunit.c (cgraph_node::expand_thunk): Force a tail call only
>         when optimizing.
>
>
> 2020-09-14  Eric Botcazou  <ebotcazou@adacore.com>
>
>         * gnat.dg/thunk1.adb: New test.
>         * gnat.dg/thunk1_pkg1.ads: New helper.
>         * gnat.dg/thunk1_pkg2.ads: Likewise.
>         * gnat.dg/thunk1_pkg2.adb: Likewise.
>
> --
> Eric Botcazou


More information about the Gcc-patches mailing list