aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield3.C80
4 files changed, 93 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ade9711..f609be3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2002-08-06 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.
+
+2002-08-06 Jakub Jelinek <jakub@redhat.com>
+
* config.gcc (*-*-linux*): Default to --enable-threads=posix if no
--{enable,disable}-threads is given to configure.
(alpha*-*-linux*, hppa*-*-linux*, i[34567]86-*-linux*,
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index f2e33c6..ae2fe99 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -13822,7 +13822,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)
+ if (mode == DFmode || mode == DCmode
+ || GET_MODE_CLASS (mode) == MODE_INT
+ || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
return MIN (32, computed);
return computed;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b9de8f5..016152a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-08-06 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.dg/abi/bitfield3.C: New test.
+
2002-08-05 Nathan Sidwell <nathan@codesourcery.com>
* lib/gcov.exp: Tweak expected line formats.
diff --git a/gcc/testsuite/g++.dg/abi/bitfield3.C b/gcc/testsuite/g++.dg/abi/bitfield3.C
new file mode 100644
index 0000000..1e59935
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield3.C
@@ -0,0 +1,80 @@
+// Test for oversized bitfield alignment in structs on IA-32
+// { dg-do run { target i?86-*-* } }
+// { dg-options "-O2" }
+
+struct A
+{
+ char a;
+ int b : 224; // { dg-warning "exceeds its type" "" }
+ char c;
+} a, a4[4];
+
+struct B
+{
+ char d;
+ A e;
+ char f;
+} b;
+
+struct C
+{
+ char g;
+ long long h : 64;
+ char i;
+} c, c4[4];
+
+struct D
+{
+ char j;
+ C k;
+ char l;
+} d;
+
+struct E
+{
+ char m;
+ long long n : 160; // { dg-warning "exceeds its type" "" }
+ char o;
+} e, e4[4];
+
+struct F
+{
+ char p;
+ E q;
+ char r;
+} f;
+
+int main (void)
+{
+ if (&a.c - &a.a != 32)
+ return 1;
+ if (sizeof (a) != 36)
+ return 2;
+ if (sizeof (a4) != 4 * 36)
+ return 3;
+ if (sizeof (b) != 2 * 4 + 36)
+ return 4;
+ if (__alignof__ (b.e) != 4)
+ return 5;
+ if (&c.i - &c.g != 16)
+ return 6;
+ if (sizeof (c) != 24)
+ return 7;
+ if (sizeof (c4) != 4 * 24)
+ return 8;
+ if (sizeof (d) != 2 * 8 + 24)
+ return 9;
+ if (__alignof__ (d.k) != 8)
+ return 10;
+ if (&e.o - &e.m != 28)
+ return 11;
+ if (sizeof (e) != 32)
+ return 12;
+ if (sizeof (e4) != 4 * 32)
+ return 13;
+ if (sizeof (f) != 2 * 8 + 32)
+ return 14;
+ if (__alignof__ (f.q) != 8)
+ return 15;
+ return 0;
+}