* function.c (assign_parm_setup_reg): Prevent sharing in another case.
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 22 Jun 2016 13:13:22 +0000 (13:13 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 22 Jun 2016 13:13:22 +0000 (13:13 +0000)
From-SVN: r237703

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/guality/param-5.c [new file with mode: 0644]

index 909a7429f86746987f4d647582bb732b7a84c8d9..6ba6728320e93a29e9398275243bc182b1ef7664 100644 (file)
@@ -1,3 +1,7 @@
+2016-06-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * function.c (assign_parm_setup_reg): Prevent sharing in another case.
+
 2016-06-22  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * config/i386/i386.c (print_reg): Emit an error message on attempt to
index c15d47d21033a01ae0ebbf69d78ad5c2fb31d494..abee36404942221ebe55d67e4f8efb4022c48f1e 100644 (file)
@@ -3314,6 +3314,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
          set_mem_attributes (parmreg, parm, 1);
        }
 
+      /* We need to preserve an address based on VIRTUAL_STACK_VARS_REGNUM for
+        the debug info in case it is not legitimate.  */
       if (GET_MODE (parmreg) != GET_MODE (rtl))
        {
          rtx tempreg = gen_reg_rtx (GET_MODE (rtl));
@@ -3323,7 +3325,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
                             all->last_conversion_insn);
          emit_move_insn (tempreg, rtl);
          tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
-         emit_move_insn (parmreg, tempreg);
+         emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg,
+                         tempreg);
          all->first_conversion_insn = get_insns ();
          all->last_conversion_insn = get_last_insn ();
          end_sequence ();
@@ -3331,7 +3334,7 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
          did_conversion = true;
        }
       else
-       emit_move_insn (parmreg, rtl);
+       emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg, rtl);
 
       rtl = parmreg;
 
index b8546af8dbee9c431c75474a10868f9c1e5df6de..62fdac4b381878afcb8d28e668bae36f1d75ea98 100644 (file)
@@ -1,3 +1,7 @@
+2016-06-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/guality/param-5.c: New test.
+
 2016-06-22  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * gcc.target/i386/asm-flag-7.c: New test.
diff --git a/gcc/testsuite/gcc.dg/guality/param-5.c b/gcc/testsuite/gcc.dg/guality/param-5.c
new file mode 100644 (file)
index 0000000..83a5c0e
--- /dev/null
@@ -0,0 +1,38 @@
+/* { dg-do run } */
+/* { dg-options "-g" } */
+/* { dg-skip-if "" { *-*-* }  { "*" } { "-O0" } } */
+
+typedef __UINTPTR_TYPE__ uintptr_t;
+
+typedef struct { uintptr_t pa; uintptr_t pb; } fatp_t
+  __attribute__ ((aligned (2 * __alignof__ (uintptr_t))));
+
+__attribute__((noinline, noclone)) void
+clear_stack (void)
+{
+  char a[128 * 1024 + 128];
+
+  __builtin_memset (a, 0, sizeof (a));
+}
+
+__attribute__((noinline, noclone)) void
+foo (fatp_t str, int count)
+{
+  char a[128 * 1024];
+
+  if (count > 0)
+    foo (str, count - 1);
+  clear_stack ();
+  count--;  /* BREAK */
+}
+
+int
+main (void)
+{
+  fatp_t ptr = { 31415927, 27182818 };
+  foo (ptr, 1);
+  return 0;
+}
+
+/* { dg-final { gdb-test 26 "str.pa" "31415927" } } */
+/* { dg-final { gdb-test 26 "str.pb" "27182818" } } */