]> git.ipfire.org Git - thirdparty/gcc.git/commit
[Ada] New pragma Aggregate_Individually_Assign
authorpmderodat <pmderodat@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Aug 2019 09:49:41 +0000 (09:49 +0000)
committerpmderodat <pmderodat@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Aug 2019 09:49:41 +0000 (09:49 +0000)
commit6b0b9e72e65174332399db15c438de5eb0de5aa0
treec7053f6938857672a3af3e0dc0c1ca4afc4f9c6e
parentc1af2733e5f4e2d3d76705635f734872b98abff5
[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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@274730 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ada/ChangeLog
gcc/ada/doc/gnat_rm/implementation_defined_pragmas.rst
gcc/ada/exp_aggr.adb
gcc/ada/gnat_rm.texi
gcc/ada/opt.ads
gcc/ada/par-prag.adb
gcc/ada/sem_prag.adb
gcc/ada/snames.ads-tmpl