aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@st.com>2005-08-23 12:27:53 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2005-08-23 13:27:53 +0100
commit39d67d5bd4adfe3af3e581dc4309f1a5319f8f21 (patch)
treeefb0232bd620d3f2ac48704c6333162375b44560 /gcc
parent9191d641185448ad719c02beefd994fc7c5dacbf (diff)
downloadgcc-39d67d5bd4adfe3af3e581dc4309f1a5319f8f21.zip
gcc-39d67d5bd4adfe3af3e581dc4309f1a5319f8f21.tar.gz
gcc-39d67d5bd4adfe3af3e581dc4309f1a5319f8f21.tar.bz2
re PR middle-end/23467 (alignment of member doesn't always carry over to alignment of struct.)
gcc: PR middle-end/23467 * stor-layout.c (finalize_type_size): Dont override existing alignment with a smaller alignment from the mode. testsuite: PR middle-end/23467 * gcc.c-torture/execute/pr23467.c: New test. From-SVN: r103394
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/stor-layout.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr23467.c18
4 files changed, 38 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a9275fa..407f6f5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-08-23 J"orn Rennecke <joern.rennecke@st.com>
+
+ PR middle-end/23467
+ * stor-layout.c (finalize_type_size): Dont override
+ existing alignment with a smaller alignment from the mode.
+
2005-08-23 Sebastian Pop <pop@cri.ensmp.fr>
* lambda-code.c (lambda_vector_lexico_pos): Moved...
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 321a4d2..0ec818d 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -1407,8 +1407,15 @@ finalize_type_size (tree type)
&& TREE_CODE (type) != QUAL_UNION_TYPE
&& TREE_CODE (type) != ARRAY_TYPE)))
{
- TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type));
- TYPE_USER_ALIGN (type) = 0;
+ unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type));
+
+ /* Don't override a larger alignment requirement coming from a user
+ alignment of one of the fields. */
+ if (mode_align >= TYPE_ALIGN (type))
+ {
+ TYPE_ALIGN (type) = mode_align;
+ TYPE_USER_ALIGN (type) = 0;
+ }
}
/* Do machine-dependent extra alignment. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 42002e9..fe03c79 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-08-23 J"orn Rennecke <joern.rennecke@st.com>
+
+ PR middle-end/23467
+ * gcc.c-torture/execute/pr23467.c: New test.
+
2005-08-23 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/22043
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr23467.c b/gcc/testsuite/gcc.c-torture/execute/pr23467.c
new file mode 100644
index 0000000..71ec3da
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr23467.c
@@ -0,0 +1,18 @@
+struct s1
+{
+ int __attribute__ ((aligned (8))) a;
+};
+
+struct
+{
+ char c;
+ struct s1 m;
+} v;
+
+int
+main (void)
+{
+ if ((int)&v.m & 7)
+ abort ();
+ exit (0);
+}