diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2008-03-11 13:47:29 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2008-03-11 13:47:29 +0100 |
commit | ab669042dc81955b888dd05ab9ff23a4b7e8c8ba (patch) | |
tree | fe483073f489cc1b9f984754f2e837a153f051b4 | |
parent | 2d3ca8b7219003d4504d49aec0bff1566391a69a (diff) | |
download | gcc-ab669042dc81955b888dd05ab9ff23a4b7e8c8ba.zip gcc-ab669042dc81955b888dd05ab9ff23a4b7e8c8ba.tar.gz gcc-ab669042dc81955b888dd05ab9ff23a4b7e8c8ba.tar.bz2 |
re PR c/35526 (ICE on memcpy)
PR middle-end/35526
* expr.c (store_expr): Call emit_block_move if the mode
of "temp" RTX is BLKmode.
testsuite/ChangeLog:
PR middle-end/35526
* g++.dg/torture/pr35526.C: New test.
From-SVN: r133106
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/expr.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr35526.C | 18 |
4 files changed, 34 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3dae5cd..a2e4e20 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ +2008-03-11 Uros Bizjak <ubizjak@gmail.com> + + PR middle-end/35526 + * expr.c (store_expr): Call emit_block_move if the mode + of "temp" RTX is BLKmode. + 2008-03-11 Andrew Pinski <andrew_pinski@playstation.sony.com> - Richard Guenther <rguenther@suse.de> + Richard Guenther <rguenther@suse.de> PR tree-optimization/31358 * tree-ssa-loop-manip.c (create_iv): Call force_gimple_operand for @@ -63,7 +69,7 @@ to avoid conflicts. 2008-03-10 Paul Brook <paul@codesourcery.com> - Mark Shinwell <shinwell@codesourcery.com> + Mark Shinwell <shinwell@codesourcery.com> * config/arm/cortex-r4.md: New. * config/arm/thumb2.md (divsi3, udivsi3): Annotate with @@ -578,7 +584,7 @@ __absvsi2, __absvDI2): Use unsigned arithmetic. 2008-03-02 Andi Kleen <ak@suse.de> - Richard Guenther <rguenther@suse.de> + Richard Guenther <rguenther@suse.de> * struct-equiv.c: Remove file. * cfg_cleanup.c (condjump_equiv_p): Remove. @@ -4654,7 +4654,8 @@ store_expr (tree exp, rtx target, int call_param_p, bool nontemporal) temp = convert_to_mode (GET_MODE (target), temp, unsignedp); emit_move_insn (target, temp); } - else if (GET_MODE (target) == BLKmode) + else if (GET_MODE (target) == BLKmode + || GET_MODE (temp) == BLKmode) emit_block_move (target, temp, expr_size (exp), (call_param_p ? BLOCK_OP_CALL_PARM diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ad3523e..9d17b5b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-03-11 Uros Bizjak <ubizjak@gmail.com> + + PR middle-end/35526 + * g++.dg/torture/pr35526.C: New test. + 2008-03-10 Jakub Jelinek <jakub@redhat.com> PR c++/35328 diff --git a/gcc/testsuite/g++.dg/torture/pr35526.C b/gcc/testsuite/g++.dg/torture/pr35526.C new file mode 100644 index 0000000..d0a8e6d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr35526.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +extern void *memcpy (void *__dest, __const void *__src, __SIZE_TYPE__ __n); + +char internal_crash_read_ip[] = { 0xb8 }; + +struct u_internal_crash_read_t +{ + char ip[sizeof (internal_crash_read_ip)]; +} +u_internal_crash_read; + +void +gSignalHandler (int psignalNr, int pinfo, int pctx) +{ + memcpy (u_internal_crash_read.ip, internal_crash_read_ip, + sizeof (internal_crash_read_ip)); +} |