This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix PR ada/35186


This appears to be sufficient to eliminate the most visible effect (build 
failure) of the implicit assumption made about alignment of DImode on x86
by the Ada compiler.  Testsuites are essentially clean.

Bootstrapped/regtested on i586-suse-linux, applied on the mainline.


2008-03-05  Eric Botcazou  <ebotcazou@adacore.com>

        PR ada/35186
	* decl.c (maybe_pad_type): Avoid padding an integral type when
	bumping its alignment is sufficient.


2008-03-05  Eric Botcazou  <ebotcazou@adacore.com>

        * gnat.dg/specs/pack33.ads: New test.


-- 
Eric Botcazou
Index: decl.c
===================================================================
--- decl.c	(revision 132854)
+++ decl.c	(working copy)
@@ -5301,7 +5301,6 @@ maybe_pad_type (tree type, tree size, un
      off the padding, since we will either be returning the inner type
      or repadding it.  If no size or alignment is specified, use that of
      the original padded type.  */
-
   if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
     {
       if ((!size
@@ -5326,7 +5325,6 @@ maybe_pad_type (tree type, tree size, un
      is not done here (and is only valid for bitfields anyway), show the size
      isn't changing.  Likewise, clear the alignment if it isn't being
      changed.  Then return if we aren't doing anything.  */
-
   if (size
       && (operand_equal_p (size, orig_size, 0)
 	  || (TREE_CODE (orig_size) == INTEGER_CST
@@ -5339,6 +5337,19 @@ maybe_pad_type (tree type, tree size, un
   if (align == 0 && !size)
     return type;
 
+  /* If no size is specified and we have an integral type, and changing
+     the alignment won't change its size, return a copy of the type
+     with the specified alignment.  */
+  if (!size
+      && INTEGRAL_TYPE_P (type)
+      && host_integerp (orig_size, 1)
+      && (TREE_INT_CST_LOW (orig_size) % align) == 0)
+    {
+      type = copy_type (type);
+      TYPE_ALIGN (type) = align;
+      return type;
+    }
+
   /* We used to modify the record in place in some cases, but that could
      generate incorrect debugging information.  So make a new record
      type and name.  */
package Pack33 is

   Bits : constant := 33;

   type Bits_33 is mod 2 ** Bits;
   for Bits_33'Size use Bits;

   type Cluster is record
      E0, E1, E2, E3, E4, E5, E6, E7 : Bits_33;
   end record;

   for Cluster use record
      E0 at 0 range 0 * Bits .. 0 * Bits + Bits - 1;
      E1 at 0 range 1 * Bits .. 1 * Bits + Bits - 1;
      E2 at 0 range 2 * Bits .. 2 * Bits + Bits - 1;
      E3 at 0 range 3 * Bits .. 3 * Bits + Bits - 1;
      E4 at 0 range 4 * Bits .. 4 * Bits + Bits - 1;
      E5 at 0 range 5 * Bits .. 5 * Bits + Bits - 1;
      E6 at 0 range 6 * Bits .. 6 * Bits + Bits - 1;
      E7 at 0 range 7 * Bits .. 7 * Bits + Bits - 1;
   end record;

   for Cluster'Size use Bits * 8;

end Pack33;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]