[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