aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoey Ye <joey.ye@intel.com>2008-02-18 23:43:23 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2008-02-18 15:43:23 -0800
commitb2ae828d7a91ec75eeb2da0af8e05992afe9209c (patch)
tree4483353c2c7f7a20740bbd95d2b06188cd9bc909 /gcc
parentbd67275ca9838005ad5856679c1177827f230f4b (diff)
downloadgcc-b2ae828d7a91ec75eeb2da0af8e05992afe9209c.zip
gcc-b2ae828d7a91ec75eeb2da0af8e05992afe9209c.tar.gz
gcc-b2ae828d7a91ec75eeb2da0af8e05992afe9209c.tar.bz2
re PR middle-end/34921 (Misalign stack variable referenced by nested function)
gcc/ 2008-02-18 Joey Ye <joey.ye@intel.com> PR middle-end/34921 * tree-nested.c (insert_field_into_struct): Set type alignment to field alignment if the former is less than the latter. gcc/testsuite/ 2008-02-18 Joey Ye <joey.ye@intel.com> H.J. Lu <hongjiu.lu@intel.com> PR middle-end/34921 * gcc.c-torture/execute/nest-align-1.c: New test case. Co-Authored-By: H.J. Lu <hongjiu.lu@intel.com> From-SVN: r132396
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/nest-align-1.c40
-rw-r--r--gcc/tree-nested.c4
4 files changed, 56 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6030004..3ecc40c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-18 Joey Ye <joey.ye@intel.com>
+
+ PR middle-end/34921
+ * tree-nested.c (insert_field_into_struct): Set type alignment
+ to field alignment if the former is less than the latter.
+
2008-02-18 Jakub Jelinek <jakub@redhat.com>
* BASE-VER: Set to 4.4.0.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7f8b32a..79db2f1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-18 Joey Ye <joey.ye@intel.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+ PR middle-end/34921
+ * gcc.c-torture/execute/nest-align-1.c: New test case.
+
2008-02-17 Richard Guenther <rguenther@suse.de>
PR middle-end/35227
diff --git a/gcc/testsuite/gcc.c-torture/execute/nest-align-1.c b/gcc/testsuite/gcc.c-torture/execute/nest-align-1.c
new file mode 100644
index 0000000..6099a50
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/nest-align-1.c
@@ -0,0 +1,40 @@
+/* Test for alignment handling when a variable is accessed by nested
+ function. */
+/* Origin: Joey Ye <joey.ye@intel.com> */
+
+#include <stddef.h>
+
+typedef int aligned __attribute__((aligned(16)));
+extern void abort (void);
+
+void
+check (int *i)
+{
+ *i = 20;
+ if ((((ptrdiff_t) i) & (__alignof__(aligned) - 1)) != 0)
+ abort ();
+}
+
+void
+foo (void)
+{
+ aligned jj;
+ void bar ()
+ {
+ jj = -20;
+ }
+ jj = 0;
+ bar ();
+ if (jj != -20)
+ abort ();
+ check (&jj);
+ if (jj != 20)
+ abort ();
+}
+
+int
+main()
+{
+ foo ();
+ return 0;
+}
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index a20e320..2c1b919 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -183,6 +183,10 @@ insert_field_into_struct (tree type, tree field)
TREE_CHAIN (field) = *p;
*p = field;
+
+ /* Set correct alignment for frame struct type. */
+ if (TYPE_ALIGN (type) < DECL_ALIGN (field))
+ TYPE_ALIGN (type) = DECL_ALIGN (field);
}
/* Build or return the RECORD_TYPE that describes the frame state that is