]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386.c (ix86_data_alignment): For compatibility with (incorrect) GCC 4.8 and earlier...
authorJakub Jelinek <jakub@redhat.com>
Fri, 17 Jan 2014 14:45:34 +0000 (15:45 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 17 Jan 2014 14:45:34 +0000 (15:45 +0100)
* 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
gcc/config/i386/i386.c

index d583762712a5dafab113ba75a55b7e665d1e0498..5440d4493f3f2a6bc1cbc1c5d6c1a30228cc297a 100644 (file)
@@ -1,5 +1,9 @@
 2014-01-17  Jakub Jelinek  <jakub@redhat.com>
 
+       * 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
index df408ae1a2d6dee5f0169c341b7f09720ed4358b..d3e4d5f654c8a2e9129fb34a9fba5b478488523d 100644 (file)
@@ -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.  */