From: Jakub Jelinek Date: Fri, 17 Jan 2014 14:45:34 +0000 (+0100) Subject: i386.c (ix86_data_alignment): For compatibility with (incorrect) GCC 4.8 and earlier... X-Git-Tag: releases/gcc-4.9.0~1609 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=88e18bd5cc520a945793b5cae2561ad3a70633f6;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d583762712a5..5440d4493f3f 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 df408ae1a2d6..d3e4d5f654c8 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. */