diff options
author | Patrick Bernardi <bernardi@adacore.com> | 2019-08-20 09:49:41 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-08-20 09:49:41 +0000 |
commit | efc00a8893ffcce505f92e0cb8c540ee1766f8fb (patch) | |
tree | c7053f6938857672a3af3e0dc0c1ca4afc4f9c6e /gcc/ada/exp_aggr.adb | |
parent | 32501d71a9e686c148171671d18e510aa719038c (diff) | |
download | gcc-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.adb | 8 |
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 |