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;

Tested on x86_64-pc-linux-gnu, committed on trunk

2019-08-20  Patrick Bernardi  <berna...@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.

Attachment: patch.diff.gz
Description: application/gzip

Reply via email to