aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2010-04-25 09:22:35 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2010-04-25 09:22:35 +0000
commit82d6f5327943f851a1c2973055f3e7ed09071dbb (patch)
tree34d9cfc1911359c24046c9c69c0604dc047d3083
parent3d416346cfca32e50fc17feea9ba012b3a2730f5 (diff)
downloadgcc-82d6f5327943f851a1c2973055f3e7ed09071dbb.zip
gcc-82d6f5327943f851a1c2973055f3e7ed09071dbb.tar.gz
gcc-82d6f5327943f851a1c2973055f3e7ed09071dbb.tar.bz2
trans.c (gnat_to_gnu): Do not use memmove if the array type is bit-packed.
* gcc-interface/trans.c (gnat_to_gnu) <N_Assignment_Statement>: Do not use memmove if the array type is bit-packed. From-SVN: r158701
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/trans.c6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/pack15.adb10
-rw-r--r--gcc/testsuite/gnat.dg/pack15.ads22
5 files changed, 45 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 76aa315..51f769c 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-25 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/trans.c (gnat_to_gnu) <N_Assignment_Statement>: Do not
+ use memmove if the array type is bit-packed.
+
2010-04-18 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/misc.c (gnat_init): Remove second argument in call to
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 71c9e86..84fa138 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -4797,10 +4797,12 @@ gnat_to_gnu (Node_Id gnat_node)
gnu_result
= build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_lhs, gnu_rhs);
- /* If the type being assigned is an array type and the two sides
- are not completely disjoint, play safe and use memmove. */
+ /* If the type being assigned is an array type and the two sides are
+ not completely disjoint, play safe and use memmove. But don't do
+ it for a bit-packed array as it might not be byte-aligned. */
if (TREE_CODE (gnu_result) == MODIFY_EXPR
&& Is_Array_Type (Etype (Name (gnat_node)))
+ && !Is_Bit_Packed_Array (Etype (Name (gnat_node)))
&& !(Forwards_OK (gnat_node) && Backwards_OK (gnat_node)))
{
tree to, from, size, to_ptr, from_ptr, t;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dd9da1a..6afd75b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-04-25 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/pack15.ad[sb]: New test.
+
2010-04-25 Paolo Bonzini <bonzini@gnu.org>
* gcc.target/arm/mla-1.c: New test.
diff --git a/gcc/testsuite/gnat.dg/pack15.adb b/gcc/testsuite/gnat.dg/pack15.adb
new file mode 100644
index 0000000..019b2da
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/pack15.adb
@@ -0,0 +1,10 @@
+-- { dg-do compile }
+
+package body Pack15 is
+
+ procedure Transfer is
+ begin
+ O.Status_Flags := Status_Flags;
+ end;
+
+end Pack15;
diff --git a/gcc/testsuite/gnat.dg/pack15.ads b/gcc/testsuite/gnat.dg/pack15.ads
new file mode 100644
index 0000000..94be462
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/pack15.ads
@@ -0,0 +1,22 @@
+package Pack15 is
+
+ type Flags is array (1..2) of Boolean;
+ for Flags'Component_Size use 1;
+
+ type Messages is record
+ Status_Flags : Flags;
+ end record;
+
+ for Messages use record
+ Status_Flags at 0 range 1 .. 2;
+ end record;
+
+ O : Messages;
+
+ Buffer : Integer;
+ Status_Flags : Flags;
+ for Status_Flags'Address use Buffer'Address;
+
+ procedure Transfer;
+
+end Pack15;