[Ada] Fix problem returning unaligned object

Arnaud Charlet charlet@adacore.com
Wed May 28 13:37:00 GMT 2008


A compile time crash could result
from returning an array object which was not aligned to the alignment of the
array type, e.g. when a component clause was present. This patch fixes the
error by copying such results into a temporary first.

See gnat.dg/frunaligned.adb

Tested on i686-pc-linux-gnu, committed on trunk

2008-05-28  Robert Dewar  <dewar@adacore.com>

	* exp_ch5.adb:
	(Expand_Simple_Function_Return): Copy unaligned result into temporary

-------------- next part --------------
Index: exp_ch5.adb
===================================================================
--- exp_ch5.adb	(revision 136071)
+++ exp_ch5.adb	(working copy)
@@ -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


More information about the Gcc-patches mailing list