Patchwork Fix nonlocalized vars regression caused by vec changes (PR debug/55665)

login
register
mail settings
Submitter Jakub Jelinek
Date Dec. 12, 2012, 7:58 p.m.
Message ID <20121212195846.GG2315@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/205637/
State New
Headers show

Comments

Jakub Jelinek - Dec. 12, 2012, 7:58 p.m.
Hi!

Before http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=193595
aka the big vec.h changes, nonlocalized_list parameter to remap_decls
used to be **, but the changes changed it to *.  That is a problem,
because then there is no difference between the case where we don't
want to push anything to nonlocalized_list (caller passes NULL) and
calling it with BLOCK_NONLOCALIZED_VARS, which is empty.
That resulted in vec_safe_push not being called, because nonlocalized_list
test was false.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2012-12-12  Jakub Jelinek  <jakub@redhat.com>

	PR debug/55665
	* tree-inline.c (remap_decls): Change nonlocalized_list
	to pointer to pointer to vector from pointer to vector.
	(remap_block): Pass address of BLOCK_NONLOCALIZED_VARS.

	* g++.dg/guality/pr55665.C: New test.


	Jakub
Diego Novillo - Dec. 12, 2012, 11:17 p.m.
On Wed, Dec 12, 2012 at 2:58 PM, Jakub Jelinek <jakub@redhat.com> wrote:

> 2012-12-12  Jakub Jelinek  <jakub@redhat.com>
>
>         PR debug/55665
>         * tree-inline.c (remap_decls): Change nonlocalized_list
>         to pointer to pointer to vector from pointer to vector.
>         (remap_block): Pass address of BLOCK_NONLOCALIZED_VARS.
>
>         * g++.dg/guality/pr55665.C: New test.

OK.


Diego.
Richard Guenther - Dec. 13, 2012, 10:14 a.m.
On Wed, Dec 12, 2012 at 8:58 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> Before http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=193595
> aka the big vec.h changes, nonlocalized_list parameter to remap_decls
> used to be **, but the changes changed it to *.  That is a problem,
> because then there is no difference between the case where we don't
> want to push anything to nonlocalized_list (caller passes NULL) and
> calling it with BLOCK_NONLOCALIZED_VARS, which is empty.
> That resulted in vec_safe_push not being called, because nonlocalized_list
> test was false.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?

Ok.

Thanks,
Richard.

> 2012-12-12  Jakub Jelinek  <jakub@redhat.com>
>
>         PR debug/55665
>         * tree-inline.c (remap_decls): Change nonlocalized_list
>         to pointer to pointer to vector from pointer to vector.
>         (remap_block): Pass address of BLOCK_NONLOCALIZED_VARS.
>
>         * g++.dg/guality/pr55665.C: New test.
>
> --- gcc/tree-inline.c.jj        2012-11-19 14:41:26.000000000 +0100
> +++ gcc/tree-inline.c   2012-12-12 18:23:31.937008538 +0100
> @@ -536,7 +536,7 @@ can_be_nonlocal (tree decl, copy_body_da
>  }
>
>  static tree
> -remap_decls (tree decls, vec<tree, va_gc> *nonlocalized_list,
> +remap_decls (tree decls, vec<tree, va_gc> **nonlocalized_list,
>              copy_body_data *id)
>  {
>    tree old_var;
> @@ -557,7 +557,7 @@ remap_decls (tree decls, vec<tree, va_gc
>           if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
>               && !DECL_IGNORED_P (old_var)
>               && nonlocalized_list)
> -           vec_safe_push (nonlocalized_list, old_var);
> +           vec_safe_push (*nonlocalized_list, old_var);
>           continue;
>         }
>
> @@ -575,7 +575,7 @@ remap_decls (tree decls, vec<tree, va_gc
>           if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
>               && !DECL_IGNORED_P (old_var)
>               && nonlocalized_list)
> -           vec_safe_push (nonlocalized_list, old_var);
> +           vec_safe_push (*nonlocalized_list, old_var);
>         }
>        else
>         {
> @@ -622,7 +622,7 @@ remap_block (tree *block, copy_body_data
>
>    /* Remap its variables.  */
>    BLOCK_VARS (new_block) = remap_decls (BLOCK_VARS (old_block),
> -                                       BLOCK_NONLOCALIZED_VARS (new_block),
> +                                       &BLOCK_NONLOCALIZED_VARS (new_block),
>                                         id);
>
>    if (id->transform_lang_insert_block)
> --- gcc/testsuite/g++.dg/guality/pr55665.C.jj   2012-12-12 18:37:11.829241332 +0100
> +++ gcc/testsuite/g++.dg/guality/pr55665.C      2012-12-12 18:34:59.000000000 +0100
> @@ -0,0 +1,33 @@
> +// PR debug/55655
> +// { dg-do run }
> +// { dg-options "-g" }
> +
> +extern "C" void abort ();
> +struct A { A (int); int a; };
> +
> +__attribute__((noinline, noclone)) int
> +bar (void)
> +{
> +  return 40;
> +}
> +
> +__attribute__((noinline, noclone)) void
> +foo (int x)
> +{
> +  __asm volatile ("" : : "r" (x) : "memory");
> +}
> +
> +A::A (int x)
> +{
> +  static int p = bar ();
> +  foo (p);             // { dg-final { gdb-test 23 "p" "40" } }
> +  a = ++p;
> +}
> +
> +int
> +main ()
> +{
> +  A a (42);
> +  if (a.a != 41)
> +    abort ();
> +}
>
>         Jakub

Patch

--- gcc/tree-inline.c.jj	2012-11-19 14:41:26.000000000 +0100
+++ gcc/tree-inline.c	2012-12-12 18:23:31.937008538 +0100
@@ -536,7 +536,7 @@  can_be_nonlocal (tree decl, copy_body_da
 }
 
 static tree
-remap_decls (tree decls, vec<tree, va_gc> *nonlocalized_list,
+remap_decls (tree decls, vec<tree, va_gc> **nonlocalized_list,
 	     copy_body_data *id)
 {
   tree old_var;
@@ -557,7 +557,7 @@  remap_decls (tree decls, vec<tree, va_gc
 	  if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
 	      && !DECL_IGNORED_P (old_var)
 	      && nonlocalized_list)
-	    vec_safe_push (nonlocalized_list, old_var);
+	    vec_safe_push (*nonlocalized_list, old_var);
 	  continue;
 	}
 
@@ -575,7 +575,7 @@  remap_decls (tree decls, vec<tree, va_gc
 	  if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
 	      && !DECL_IGNORED_P (old_var)
 	      && nonlocalized_list)
-	    vec_safe_push (nonlocalized_list, old_var);
+	    vec_safe_push (*nonlocalized_list, old_var);
 	}
       else
 	{
@@ -622,7 +622,7 @@  remap_block (tree *block, copy_body_data
 
   /* Remap its variables.  */
   BLOCK_VARS (new_block) = remap_decls (BLOCK_VARS (old_block),
-  					BLOCK_NONLOCALIZED_VARS (new_block),
+  					&BLOCK_NONLOCALIZED_VARS (new_block),
 					id);
 
   if (id->transform_lang_insert_block)
--- gcc/testsuite/g++.dg/guality/pr55665.C.jj	2012-12-12 18:37:11.829241332 +0100
+++ gcc/testsuite/g++.dg/guality/pr55665.C	2012-12-12 18:34:59.000000000 +0100
@@ -0,0 +1,33 @@ 
+// PR debug/55655
+// { dg-do run }
+// { dg-options "-g" }
+
+extern "C" void abort ();
+struct A { A (int); int a; };
+
+__attribute__((noinline, noclone)) int
+bar (void)
+{
+  return 40;
+}
+
+__attribute__((noinline, noclone)) void
+foo (int x)
+{
+  __asm volatile ("" : : "r" (x) : "memory");
+}
+
+A::A (int x)
+{
+  static int p = bar ();
+  foo (p);		// { dg-final { gdb-test 23 "p" "40" } }
+  a = ++p;
+}
+
+int
+main ()
+{
+  A a (42);
+  if (a.a != 41)
+    abort ();
+}