diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2016-06-22 13:13:22 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2016-06-22 13:13:22 +0000 |
commit | 951d8c8a23f37136cd377f8069ddeb5be8a67183 (patch) | |
tree | 51a5686c1558c4e5b1825085f9a18364c4ade0b0 /gcc | |
parent | b60fc3bdf81ecc19693a5e8bab1ab079fa8f085d (diff) | |
download | gcc-951d8c8a23f37136cd377f8069ddeb5be8a67183.zip gcc-951d8c8a23f37136cd377f8069ddeb5be8a67183.tar.gz gcc-951d8c8a23f37136cd377f8069ddeb5be8a67183.tar.bz2 |
* function.c (assign_parm_setup_reg): Prevent sharing in another case.
From-SVN: r237703
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/function.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/guality/param-5.c | 38 |
4 files changed, 51 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 909a742..6ba672832 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/function.c b/gcc/function.c index c15d47d..abee364 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b8546af..62fdac4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..83a5c0e --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/param-5.c @@ -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" } } */ |