OSDN Git Service

gcc/
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Feb 2008 23:43:23 +0000 (23:43 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Feb 2008 23:43:23 +0000 (23:43 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132396 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/nest-align-1.c [new file with mode: 0644]
gcc/tree-nested.c

index 6030004..3ecc40c 100644 (file)
@@ -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.
index 7f8b32a..79db2f1 100644 (file)
@@ -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 (file)
index 0000000..6099a50
--- /dev/null
@@ -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;
+}
index a20e320..2c1b919 100644 (file)
@@ -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