aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/exp_aggr.adb
diff options
context:
space:
mode:
authorPatrick Bernardi <bernardi@adacore.com>2019-08-20 09:49:41 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-08-20 09:49:41 +0000
commitefc00a8893ffcce505f92e0cb8c540ee1766f8fb (patch)
treec7053f6938857672a3af3e0dc0c1ca4afc4f9c6e /gcc/ada/exp_aggr.adb
parent32501d71a9e686c148171671d18e510aa719038c (diff)
downloadgcc-efc00a8893ffcce505f92e0cb8c540ee1766f8fb.zip
gcc-efc00a8893ffcce505f92e0cb8c540ee1766f8fb.tar.gz
gcc-efc00a8893ffcce505f92e0cb8c540ee1766f8fb.tar.bz2
[Ada] New pragma Aggregate_Individually_Assign
Where possible GNAT will store the binary representation of a record aggregate in memory for space and performance reasons. This configuration pragma changes this behaviour so that record aggregates are instead always converted into individual assignment statements. The following package pack.ads: -- pack.ads pragma Aggregate_Individually_Assign; pragma Restrictions (No_Multiple_Elaboration); package Pack is type A_Rec is record A, B, C, D : Boolean; end record; A : A_Rec := (True, False, True, True); end Pack; when compiled with gcc -c -gnatdg pack.ads should produce the following output: Source recreated from tree for Pack (spec) ------------------------------------------ pragma aggregate_individually_assign; pragma restrictions (no_multiple_elaboration); package pack is type pack__a_rec is record a : boolean; b : boolean; c : boolean; d : boolean; end record; freeze pack__a_rec [ procedure pack__a_recIP (_init : out pack__a_rec) is begin %push_constraint_error_label () %push_program_error_label () %push_storage_error_label () null; %pop_constraint_error_label %pop_program_error_label %pop_storage_error_label return; end pack__a_recIP; ] pack__a : pack__a_rec := ( a => true, b => false, c => true, d => true); pack__a.a := true; pack__a.b := false; pack__a.c := true; pack__a.d := true; null; end pack; 2019-08-20 Patrick Bernardi <bernardi@adacore.com> gcc/ada/ * exp_aggr.adb (Expand_Record_Aggregate): Always convert a record Aggregate to assignment statements if the option Aggregate_Individually_Assign is set. * opt.ads (Aggregate_Individually_Assign): New option. * par-prag.adb (Prag): Add Pragma_Aggregate_Individually_Assign. * sem_prag.adb (Analyze_Pragma): Likewise. * snames.ads-tmpl: Add Pragma_Aggregate_Individually_Assign and Name_Aggregate_Individually_Assign. * doc/gnat_rm/implementation_defined_pragmas.rst: Document pragma Aggregate_Individually_Assign. * gnat_rm.texi: Regenerate. From-SVN: r274730
Diffstat (limited to 'gcc/ada/exp_aggr.adb')
-rw-r--r--gcc/ada/exp_aggr.adb8
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb
index 6a756fd..d720820 100644
--- a/gcc/ada/exp_aggr.adb
+++ b/gcc/ada/exp_aggr.adb
@@ -7478,6 +7478,12 @@ package body Exp_Aggr is
return;
end if;
+ -- If the pramga Aggregate_Individually_Assign is set always convert to
+ -- assignments.
+
+ if Aggregate_Individually_Assign then
+ Convert_To_Assignments (N, Typ);
+
-- Ada 2005 (AI-318-2): We need to convert to assignments if components
-- are build-in-place function calls. The assignments will each turn
-- into a build-in-place function call. If components are all static,
@@ -7486,7 +7492,7 @@ package body Exp_Aggr is
-- Extension aggregates, aggregates in extended return statements, and
-- aggregates for C++ imported types must be expanded.
- if Ada_Version >= Ada_2005 and then Is_Limited_View (Typ) then
+ elsif Ada_Version >= Ada_2005 and then Is_Limited_View (Typ) then
if not Nkind_In (Parent (N), N_Component_Association,
N_Object_Declaration)
then