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
This commit is contained in:
Joey Ye 2008-02-18 23:43:23 +00:00 committed by H.J. Lu
parent bd67275ca9
commit b2ae828d7a
4 changed files with 56 additions and 0 deletions

View 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.

View 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

View File

@ -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;
}

View 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