[PATCH] Fix debug info for parameters passed by invisible parameters (PR debug/41238)

Richard Guenther richard.guenther@gmail.com
Thu Sep 3 16:10:00 GMT 2009


On Thu, Sep 3, 2009 at 6:04 PM, Jakub Jelinek<jakub@redhat.com> wrote:
> Hi!
>
> Arguments passed by invisible reference (not using DECL_BY_REFERENCE though)
> have DECL_INCOMING_RTL set with set_decl_incoming_rtl (..., true) and don't
> have a REG_EXPR (or shouldn't have a MEM_EXPR), given that the parameter
> isn't in the DECL_INCOMING_RTL REG (or MEM), but in what it points to.
>
> This patch teaches var-tracking.c about those (this bug existed before VTA
> merge, but there was no assert later on which would make it obvious), and
> also prevents stack slots with the pointers to the memory from having bogus
> MEM_ATTRS).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, Uros said it allowed
> him to at least get past stage1 on alpha-linux, where it previously ICEd
> during libgcc stage1 build.  Ok for trunk?

Looks good to me.  Can we trigger this on x86 and add a testcase?

Thanks,
Richard.

> 2009-09-03  Jakub Jelinek  <jakub@redhat.com>
>
>        PR debug/41238
>        * function.c (assign_parm_find_stack_rtl): Don't set mem attributes on
>        the stack slot if it is passed by invisible reference.
>        * var-tracking.c (vt_add_function_parameters): Handle arguments passed by
>        invisible reference.
>
> --- gcc/function.c.jj   2009-09-03 09:59:36.000000000 +0200
> +++ gcc/function.c      2009-09-03 13:31:30.000000000 +0200
> @@ -2433,20 +2433,25 @@ assign_parm_find_stack_rtl (tree parm, s
>     stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
>   stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
>
> -  set_mem_attributes (stack_parm, parm, 1);
> -  /* set_mem_attributes could set MEM_SIZE to the passed mode's size,
> -     while promoted mode's size is needed.  */
> -  if (data->promoted_mode != BLKmode
> -      && data->promoted_mode != DECL_MODE (parm))
> -    {
> -      set_mem_size (stack_parm, GEN_INT (GET_MODE_SIZE (data->promoted_mode)));
> -      if (MEM_EXPR (stack_parm) && MEM_OFFSET (stack_parm))
> -       {
> -         int offset = subreg_lowpart_offset (DECL_MODE (parm),
> -                                             data->promoted_mode);
> -         if (offset)
> -           set_mem_offset (stack_parm,
> -                           plus_constant (MEM_OFFSET (stack_parm), -offset));
> +  if (!data->passed_pointer)
> +    {
> +      set_mem_attributes (stack_parm, parm, 1);
> +      /* set_mem_attributes could set MEM_SIZE to the passed mode's size,
> +        while promoted mode's size is needed.  */
> +      if (data->promoted_mode != BLKmode
> +         && data->promoted_mode != DECL_MODE (parm))
> +       {
> +         set_mem_size (stack_parm,
> +                       GEN_INT (GET_MODE_SIZE (data->promoted_mode)));
> +         if (MEM_EXPR (stack_parm) && MEM_OFFSET (stack_parm))
> +           {
> +             int offset = subreg_lowpart_offset (DECL_MODE (parm),
> +                                                 data->promoted_mode);
> +             if (offset)
> +               set_mem_offset (stack_parm,
> +                               plus_constant (MEM_OFFSET (stack_parm),
> +                                              -offset));
> +           }
>        }
>     }
>
> --- gcc/var-tracking.c.jj       2009-09-03 09:59:40.000000000 +0200
> +++ gcc/var-tracking.c  2009-09-03 13:45:27.000000000 +0200
> @@ -7058,10 +7058,20 @@ vt_add_function_parameters (void)
>
>       if (!vt_get_decl_and_offset (incoming, &decl, &offset))
>        {
> -         if (!vt_get_decl_and_offset (decl_rtl, &decl, &offset))
> -           continue;
> -         offset += byte_lowpart_offset (GET_MODE (incoming),
> -                                        GET_MODE (decl_rtl));
> +         if (REG_P (incoming) || MEM_P (incoming))
> +           {
> +             /* This means argument is passed by invisible reference.  */
> +             offset = 0;
> +             decl = parm;
> +             incoming = gen_rtx_MEM (GET_MODE (decl_rtl), incoming);
> +           }
> +         else
> +           {
> +             if (!vt_get_decl_and_offset (decl_rtl, &decl, &offset))
> +               continue;
> +             offset += byte_lowpart_offset (GET_MODE (incoming),
> +                                            GET_MODE (decl_rtl));
> +           }
>        }
>
>       if (!decl)
>
>        Jakub
>



More information about the Gcc-patches mailing list