[PATCH] For -O0 avoid putting user vars with methods in its type into registers (PR debug/39485)

Richard Guenther richard.guenther@gmail.com
Wed Mar 18 15:23:00 GMT 2009


On Wed, Mar 18, 2009 at 4:18 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> On the gdb testcase g++ 4.4 regresses from 4.3, as it puts a register
> variable into a register even at -O0, which makes it impossible to call
> methods on it from the debugger.  The following patch just disregards
> the register keyword in that case in use_register_for_decl.  Vars with types
> without methods will still be put into registers sometimes.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2009-03-18  Jakub Jelinek  <jakub@redhat.com>
>
>        PR debug/39485
>        * function.c (use_register_for_decl): When not optimizing, disregard
>        register keyword for variables with types containing methods.
>
> --- gcc/function.c.jj   2009-03-17 16:32:43.000000000 +0100
> +++ gcc/function.c      2009-03-18 09:46:46.000000000 +0100
> @@ -1942,7 +1942,28 @@ use_register_for_decl (const_tree decl)
>   if (DECL_IGNORED_P (decl))
>     return true;
>
> -  return (optimize || DECL_REGISTER (decl));
> +  if (optimize)
> +    return true;
> +
> +  if (!DECL_REGISTER (decl))
> +    return false;
> +
> +  switch (TREE_CODE (TREE_TYPE (decl)))
> +    {
> +    case RECORD_TYPE:
> +    case UNION_TYPE:
> +    case QUAL_UNION_TYPE:
> +      /* When not optimizing, disregard register keyword for variables with
> +        types containing methods, otherwise the methods won't be callable
> +        from the debugger.  */
> +      if (TYPE_METHODS (TREE_TYPE (decl)))
> +       return false;
> +      break;
> +    default:
> +      break;
> +    }
> +
> +  return true;
>  }
>
>  /* Return true if TYPE should be passed by invisible reference.  */
>
>        Jakub
>



More information about the Gcc-patches mailing list