public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [COMMITTED] ada: Fix internal error on too large representation clause for small component
@ 2023-10-10 12:14 Marc Poulhiès
  0 siblings, 0 replies; only message in thread
From: Marc Poulhiès @ 2023-10-10 12:14 UTC (permalink / raw)
  To: gcc-patches; +Cc: Eric Botcazou

From: Eric Botcazou <ebotcazou@adacore.com>

This is a small bug present on strict-alignment platforms for questionable
representation clauses.

gcc/ada/

	* gcc-interface/decl.cc (inline_status_for_subprog): Minor tweak.
	(gnat_to_gnu_field): Try harder to get a packable form of the type
	for a bitfield.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/gcc-interface/decl.cc | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc
index 5e16b56217c..20ab185d577 100644
--- a/gcc/ada/gcc-interface/decl.cc
+++ b/gcc/ada/gcc-interface/decl.cc
@@ -5114,7 +5114,7 @@ inline_status_for_subprog (Entity_Id subprog)
       tree gnu_type;
 
       /* This is a kludge to work around a pass ordering issue: for small
-	 record types with many components, i.e. typically bit-fields, the
+	 record types with many components, i.e. typically bitfields, the
 	 initialization routine can contain many assignments that will be
 	 merged by the GIMPLE store merging pass.  But this pass runs very
 	 late in the pipeline, in particular after the inlining decisions
@@ -7702,6 +7702,18 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed,
       gnu_field_type = maybe_pad_type (gnu_field_type, gnu_size, 0, gnat_field,
 				       false, definition, true);
 
+      /* For a bitfield, if the type still has BLKmode, try again to change it
+	 to an integral mode form.  This may be necessary on strict-alignment
+	 platforms with a size clause that is much larger than the field type,
+	 because maybe_pad_type has preserved the alignment of the field type,
+	 which may be too low for the new size.  */
+      if (!needs_strict_alignment
+	  && RECORD_OR_UNION_TYPE_P (gnu_field_type)
+	  && !TYPE_FAT_POINTER_P (gnu_field_type)
+	  && TYPE_MODE (gnu_field_type) == BLKmode
+	  && is_bitfield)
+	gnu_field_type = make_packable_type (gnu_field_type, true, 1);
+
       /* If a padding record was made, declare it now since it will never be
 	 declared otherwise.  This is necessary to ensure that its subtrees
 	 are properly marked.  */
-- 
2.42.0


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-10 12:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-10 12:14 [COMMITTED] ada: Fix internal error on too large representation clause for small component Marc Poulhiès

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).