[Ada] Conditional expansion for large static aggregates.

Arnaud Charlet charlet@adacore.com
Thu Apr 10 07:28:00 GMT 2008


Tested on i686-linux, committed on trunk

When possible, we replace the initialization procedure for a composite type
that has static components by a static constant, in order to prevent the
generation of elaboration code. This expansion was done unconditionally, which
could result in very large static expressions that can exhaust memory. The
expansion is now conditional on an upper bound that depends on whether the
restrictions No_Elaboration_Code or No_Implicit_Loops are in effect. This is
identical to what is done for the expansion of aggregates in other contexts.

See gnat.dg/specs/aggr1.ads

2008-04-08  Ed Schonberg  <schonberg@adacore.com>

	* exp_aggr.adb (Static_Array_Aggregate): Use Max_Aggr_Size to determine
	whether an array aggregate with static bounds and scalar components
	should be expanded into a static constant.

-------------- next part --------------
Index: exp_aggr.adb
===================================================================
--- exp_aggr.adb	(revision 133957)
+++ exp_aggr.adb	(working copy)
@@ -300,7 +300,7 @@ package body Exp_Aggr is
       Hiv  : Uint;
 
       --  The following constant determines the maximum size of an
-      --  aggregate produced by converting named to positional
+      --  array aggregate produced by converting named to positional
       --  notation (e.g. from others clauses). This avoids running
       --  away with attempts to convert huge aggregates, which hit
       --  memory limits in the backend.
@@ -1170,9 +1170,9 @@ package body Exp_Aggr is
             --  If the component is itself an array of controlled types, whose
             --  value is given by a sub-aggregate, then the attach calls have
             --  been generated when individual subcomponent are assigned, and
-            --  and must not be done again to prevent malformed finalization
-            --  chains (see comments above, concerning the creation of a block
-            --  to hold inner finalization actions).
+            --  must not be done again to prevent malformed finalization chains
+            --  (see comments above, concerning the creation of a block to hold
+            --  inner finalization actions).
 
             if Present (Comp_Type)
               and then Controlled_Type (Comp_Type)
@@ -1677,10 +1677,6 @@ package body Exp_Aggr is
    -- Build_Record_Aggr_Code --
    ----------------------------
 
-   ----------------------------
-   -- Build_Record_Aggr_Code --
-   ----------------------------
-
    function Build_Record_Aggr_Code
      (N                             : Node_Id;
       Typ                           : Entity_Id;
@@ -6350,7 +6346,8 @@ package body Exp_Aggr is
             else
                --  The aggregate is static if all components are literals, or
                --  else all its components are static aggregates for the
-               --  component type.
+               --  component type. We also limit the size of a static aggregate
+               --  to prevent runaway static expressions.
 
                if Is_Array_Type (Comp_Type)
                  or else Is_Record_Type (Comp_Type)
@@ -6364,6 +6361,9 @@ package body Exp_Aggr is
 
                elsif Nkind (Expression (Expr)) /= N_Integer_Literal then
                   return False;
+
+               elsif not Aggr_Size_OK (Typ) then
+                  return False;
                end if;
 
                --  Create a positional aggregate with the right number of


More information about the Gcc-patches mailing list