From 88e18bd5cc520a945793b5cae2561ad3a70633f6 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 17 Jan 2014 15:45:34 +0100 Subject: [PATCH] i386.c (ix86_data_alignment): For compatibility with (incorrect) GCC 4.8 and earlier alignment assumptions... * config/i386/i386.c (ix86_data_alignment): For compatibility with (incorrect) GCC 4.8 and earlier alignment assumptions ensure we align decls to at least the GCC 4.8 used alignments. From-SVN: r206713 --- gcc/ChangeLog | 4 ++++ gcc/config/i386/i386.c | 25 ++++++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d583762712a..5440d4493f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2014-01-17 Jakub Jelinek + * config/i386/i386.c (ix86_data_alignment): For compatibility with + (incorrect) GCC 4.8 and earlier alignment assumptions ensure we align + decls to at least the GCC 4.8 used alignments. + PR fortran/59440 * tree-nested.c (convert_nonlocal_reference_stmt, convert_local_reference_stmt): For NAMELIST_DECLs in gimple_bind_vars diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index df408ae1a2d..d3e4d5f654c 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -26433,6 +26433,15 @@ ix86_constant_alignment (tree exp, int align) int ix86_data_alignment (tree type, int align, bool opt) { + /* GCC 4.8 and earlier used to incorrectly assume this alignment even + for symbols from other compilation units or symbols that don't need + to bind locally. In order to preserve some ABI compatibility with + those compilers, ensure we don't decrease alignment from what we + used to assume. */ + + int max_align_compat + = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT); + /* A data structure, equal or greater than the size of a cache line (64 bytes in the Pentium 4 and other recent Intel processors, including processors based on Intel Core microarchitecture) should be aligned @@ -26447,11 +26456,17 @@ ix86_data_alignment (tree type, int align, bool opt) if (opt && AGGREGATE_TYPE_P (type) && TYPE_SIZE (type) - && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST - && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align - || TREE_INT_CST_HIGH (TYPE_SIZE (type))) - && align < max_align) - align = max_align; + && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST) + { + if ((TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align_compat + || TREE_INT_CST_HIGH (TYPE_SIZE (type))) + && align < max_align_compat) + align = max_align_compat; + if ((TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align + || TREE_INT_CST_HIGH (TYPE_SIZE (type))) + && align < max_align) + align = max_align; + } /* x86-64 ABI requires arrays greater than 16 bytes to be aligned to 16byte boundary. */ -- 2.30.2