[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