From a713e7bb72617e88e9b2b64cecaffae7499146fb Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 9 Sep 2017 12:48:41 +0000 Subject: [PATCH] decl.c (components_to_record): Do not reorder in non- packed record types if... * gcc-interface/decl.c (components_to_record): Do not reorder in non- packed record types if pragma Optimize_Alignment (Space) is enabled. From-SVN: r251936 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/decl.c | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 804a79e1c1b..e929eff15fa 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2017-09-09 Eric Botcazou + + * gcc-interface/decl.c (components_to_record): Do not reorder in non- + packed record types if pragma Optimize_Alignment (Space) is enabled. + 2017-09-09 Eric Botcazou * gcc-interface/trans.c (Subprogram_Body_to_gnu): Disregard inlining diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index f8752c8ae61..569e64db626 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -7683,7 +7683,9 @@ components_to_record (Node_Id gnat_component_list, Entity_Id gnat_record_type, of a byte, so that they don't cause the regular fields to be either at self-referential/variable offset or misaligned. Note, in the latter case, that this can only happen in packed record types so the alignment - is effectively capped to the byte for the whole record. + is effectively capped to the byte for the whole record. But we don't + do it for non-packed record types if pragma Optimize_Alignment (Space) + is specified because this can prevent alignment gaps from being filled. Optionally, if the layout warning is enabled, keep track of the above 4 different kinds of fields and issue a warning if some of them would be @@ -7694,6 +7696,8 @@ components_to_record (Node_Id gnat_component_list, Entity_Id gnat_record_type, const bool do_reorder = (Convention (gnat_record_type) == Convention_Ada && !No_Reordering (gnat_record_type) + && (!Optimize_Alignment_Space (gnat_record_type) + || Is_Packed (gnat_record_type)) && !debug__debug_flag_dot_r); const bool w_reorder = (Convention (gnat_record_type) == Convention_Ada -- 2.30.2