This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] C++ ABI fix - bitfield layout on IA-32
- From: Jakub Jelinek <jakub at redhat dot com>
- To: rth at redhat dot com, jh at suse dot cz
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 5 Aug 2002 13:37:54 +0200
- Subject: [PATCH] C++ ABI fix - bitfield layout on IA-32
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
The following patch fixes the 2002-06-17 introduced breakage
when BIGGEST_FIELD_ALIGNMENT was killed.
Unfortunately, the testcase still fails on the __alignof__ (x) != 4
check (regression from 3.0.x and earlier) - this was apparently broken
on gcc HEAD already in Nov 2001. Back into debugger.
Concerning __m64, I haven't seen anything done, but don't have icc
to verify. The thread which talks about this is
http://gcc.gnu.org/ml/gcc-patches/2002-06/msg01427.html
2002-08-05 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.c (x86_field_alignment): Don't check
TARGET_ALIGN_DOUBLE for the second time.
Apply min for all MODE_INT and MODE_CLASS_INT modes.
* g++.dg/abi/bitfield3.C: New test.
--- gcc/config/i386/i386.c.jj 2002-07-27 01:31:05.000000000 +0200
+++ gcc/config/i386/i386.c 2002-08-05 13:31:53.000000000 +0200
@@ -12644,10 +12644,9 @@ x86_field_alignment (field, computed)
return computed;
mode = TYPE_MODE (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
? get_inner_array_type (field) : TREE_TYPE (field));
- if ((mode == DFmode || mode == DCmode
- || mode == DImode || mode == CDImode)
- && !TARGET_ALIGN_DOUBLE)
+ if (mode == DFmode || mode == DCmode
+ || GET_MODE_CLASS (mode) == MODE_INT
+ || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
return MIN (32, computed);
return computed;
}
-
--- gcc/testsuite/g++.dg/abi/bitfield3.C.jj 2002-08-05 13:47:02.000000000 +0200
+++ gcc/testsuite/g++.dg/abi/bitfield3.C 2002-08-05 13:44:52.000000000 +0200
@@ -0,0 +1,21 @@
+// Test for oversized bitfield alignment in structs on IA-32
+// { dg-do run { i?86-*-* } }
+// { dg-options "-O2" }
+
+struct A
+{
+ char a;
+ int b : 224; // { dg-warning "exceeds its type" "" }
+ char c;
+} x;
+
+int main (void)
+{
+ if (&x.c - &x.a != 32)
+ return 1;
+ if (sizeof (x) != 36)
+ return 2;
+ if (__alignof__ (x) != 4)
+ return 3;
+ return 0;
+}
Jakub