[PATCH] Track VLA bounds in VTA (PR debug/43150)
Richard Guenther
richard.guenther@gmail.com
Wed Feb 24 10:39:00 GMT 2010
On Tue, Feb 23, 2010 at 11:47 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> Now that we have VLA debuginfo at -O0 fixed again, I think
> it wouldn't hurt to have at least in most cases proper debug info
> also for VLAs at -O1 and above. Thanks to VTA this is achievable,
> we just need to tell var-tracking that it should track such vars,
> and gimplifier to clear DECL_IGNORED_P on the artificial vars not
> just at -O0, but always. It doesn't change generated optimized code,
> just allows debug info to be emitted.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
I suppose it might not work with -fno-var-tracking-assignments but
won't cause any problems there as well?
Ok.
Thanks,
Richard.
> 2010-02-23 Jakub Jelinek <jakub@redhat.com>
>
> PR debug/43150
> * gimplify.c (gimplify_type_sizes): Clear DECL_IGNORED_P for VLA
> bounds even for -O+.
> * var-tracking.c (track_expr_p): If !need_rtl, don't mandate
> expr needs to have DECL_NAME set.
>
> * gcc.dg/guality/vla-1.c: New test.
>
> --- gcc/gimplify.c.jj 2010-02-23 12:15:50.000000000 +0100
> +++ gcc/gimplify.c 2010-02-23 14:00:53.000000000 +0100
> @@ -7367,9 +7367,10 @@ gimplify_type_sizes (tree type, gimple_s
> /* These types may not have declarations, so handle them here. */
> gimplify_type_sizes (TREE_TYPE (type), list_p);
> gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
> - /* When not optimizing, ensure VLA bounds aren't removed. */
> - if (!optimize
> - && TYPE_DOMAIN (type)
> + /* Ensure VLA bounds aren't removed, for -O0 they should be variables
> + with assigned stack slots, for -O1+ -g they should be tracked
> + by VTA. */
> + if (TYPE_DOMAIN (type)
> && INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
> {
> t = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
> --- gcc/var-tracking.c.jj 2010-02-23 12:15:38.000000000 +0100
> +++ gcc/var-tracking.c 2010-02-23 13:56:42.000000000 +0100
> @@ -4150,7 +4150,7 @@ track_expr_p (tree expr, bool need_rtl)
> return 0;
>
> /* It also must have a name... */
> - if (!DECL_NAME (expr))
> + if (!DECL_NAME (expr) && need_rtl)
> return 0;
>
> /* ... and a RTL assigned to it. */
> --- gcc/testsuite/gcc.dg/guality/vla-1.c.jj 2010-02-23 14:26:01.000000000 +0100
> +++ gcc/testsuite/gcc.dg/guality/vla-1.c 2010-02-23 14:16:47.000000000 +0100
> @@ -0,0 +1,36 @@
> +/* PR debug/43150 */
> +/* { dg-do run } */
> +/* { dg-options "-g" } */
> +
> +void __attribute__((noinline))
> +bar (short *p)
> +{
> + __builtin_memset (p, '\0', 17 * sizeof (*p));
> + asm volatile ("" : : "r" (p) : "memory");
> +}
> +
> +int __attribute__((noinline))
> +f1 (int i)
> +{
> + char a[i + 1];
> + a[0] = 5; /* { dg-final { gdb-test 17 "i" "5" } } */
> + return a[0]; /* { dg-final { gdb-test 17 "sizeof (a)" "6" } } */
> +}
> +
> +int __attribute__((noinline))
> +f2 (int i)
> +{
> + short a[i * 2 + 7]; /* { dg-final { gdb-test 24 "i" "5" } } */
> + bar (a); /* { dg-final { gdb-test 24 "sizeof (a)" "17 * sizeof (short)" } } */
> + return a[i + 4];
> +}
> +
> +int
> +main ()
> +{
> + int i = 5;
> + asm volatile ("" : "=r" (i) : "0" (i));
> + f1 (i);
> + f2 (i);
> + return 0;
> +}
>
> Jakub
>
More information about the Gcc-patches
mailing list