From: ebotcazou Date: Sun, 25 Apr 2010 09:22:35 +0000 (+0000) Subject: * gcc-interface/trans.c (gnat_to_gnu) : Do not X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4c043c94a3b753b1577f2b4dd9223a0e7cfb11d5;p=thirdparty%2Fgcc.git * gcc-interface/trans.c (gnat_to_gnu) : Do not use memmove if the array type is bit-packed. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158701 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 76aa31591c13..51f769cbd8db 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2010-04-25 Eric Botcazou + + * gcc-interface/trans.c (gnat_to_gnu) : Do not + use memmove if the array type is bit-packed. + 2010-04-18 Eric Botcazou * 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 71c9e862aba6..84fa13878707 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 dd9da1aa4ec6..6afd75b1c433 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-04-25 Eric Botcazou + + * gnat.dg/pack15.ad[sb]: New test. + 2010-04-25 Paolo Bonzini * 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 000000000000..019b2da0f787 --- /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 000000000000..94be462c084d --- /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;