diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-28 13:05:55 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-28 13:05:55 +0000 |
commit | 8485ab244159f99eb96808b6f1ca9d40a4b9e796 (patch) | |
tree | 58a1eb09f3817ec5bf0a3c6762a1c3ff29727f7f /gcc/ada/exp_ch5.adb | |
parent | 2d66f38df682e3b37e9c1151496830e9b707eb3c (diff) | |
download | gcc-8485ab244159f99eb96808b6f1ca9d40a4b9e796.tar.gz |
2008-05-28 Robert Dewar <dewar@adacore.com>
* exp_ch5.adb:
(Expand_Simple_Function_Return): Copy unaligned result into temporary
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136080 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/exp_ch5.adb')
-rw-r--r-- | gcc/ada/exp_ch5.adb | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 8d8a281c7da..18ea8fe44db 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -4032,6 +4032,28 @@ package body Exp_Ch5 is end; end if; + -- If we are returning an object that may not be bit-aligned, then + -- copy the value into a temporary first. This copy may need to expand + -- to a loop of component operations.. + + if Is_Possibly_Unaligned_Slice (Exp) + or else Is_Possibly_Unaligned_Object (Exp) + then + declare + Tnn : constant Entity_Id := + Make_Defining_Identifier (Loc, New_Internal_Name ('T')); + begin + Insert_Action (Exp, + Make_Object_Declaration (Loc, + Defining_Identifier => Tnn, + Constant_Present => True, + Object_Definition => New_Occurrence_Of (R_Type, Loc), + Expression => Relocate_Node (Exp)), + Suppress => All_Checks); + Rewrite (Exp, New_Occurrence_Of (Tnn, Loc)); + end; + end if; + -- Generate call to postcondition checks if they are present if Ekind (Scope_Id) = E_Function @@ -4061,8 +4083,7 @@ package body Exp_Ch5 is else declare Tnn : constant Entity_Id := - Make_Defining_Identifier (Loc, - New_Internal_Name ('T')); + Make_Defining_Identifier (Loc, New_Internal_Name ('T')); begin -- For a complex expression of an elementary type, capture |