Disable string merging with alignment > 1 before Solaris 11.4/SPARC
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Wed, 24 Oct 2018 11:27:35 +0000 (11:27 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Wed, 24 Oct 2018 11:27:35 +0000 (11:27 +0000)
* configure.ac (gcc_cv_ld_aligned_shf_merge): New test.
* configure: Regenerate.
* config.in: Regenerate.
* varasm.c (mergeable_string_section): Use readonly_data_section
if linker doesn't support SHF_MERGE with alignment > 8.
(mergeable_constant_section): Likewise.

From-SVN: r265456

gcc/ChangeLog
gcc/config.in
gcc/configure
gcc/configure.ac
gcc/varasm.c

index 92402775ca4827a3cac93dc85a6fcf8c1448c635..55ac3b99e2c5da9a6fc3d6928ec37e0953662d0a 100644 (file)
@@ -1,3 +1,12 @@
+2018-10-24  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * configure.ac (gcc_cv_ld_aligned_shf_merge): New test.
+       * configure: Regenerate.
+       * config.in: Regenerate.
+       * varasm.c (mergeable_string_section): Use readonly_data_section
+       if linker doesn't support SHF_MERGE with alignment > 8.
+       (mergeable_constant_section): Likewise.
+
 2018-10-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/84013
index b807d49712e56481919794ef002c517be4420b22..7116579c5126a344b104eb7a3977f01eb346c68d 100644 (file)
@@ -55,8 +55,7 @@
 #endif
 
 
-/* Define to larger than zero set to the default stack clash protector size as
-   a power of two in bytes. */
+/* Define to larger than zero set the default stack clash protector size. */
 #ifndef USED_FOR_TARGET
 #undef DEFAULT_STK_CLASH_GUARD_SIZE
 #endif
 #endif
 
 
+/* Define 0/1 if your linker supports the SHF_MERGE flag with section
+   alignment > 1. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_LD_ALIGNED_SHF_MERGE
+#endif
+
+
 /* Define if your linker supports --as-needed/--no-as-needed or equivalent
    options. */
 #ifndef USED_FOR_TARGET
 #endif
 
 
-/* Define if we should link with --large-address-aware by default */
-#ifndef USED_FOR_TARGET
-#undef MINGW_DEFAULT_LARGE_ADDR_AWARE
-#endif
-
-
-/* Define if we should link with --large-address-aware by default */
+/* Define if we should link mingw executables with --large-address-aware */
 #ifndef USED_FOR_TARGET
 #undef MINGW_DEFAULT_LARGE_ADDR_AWARE
 #endif
index fb1c707f6cf0a5a640b4e14ea4e69db06338ca8d..c49b4b264e8389fff5de5502c003f32131d10e97 100755 (executable)
@@ -23739,6 +23739,30 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+gcc_cv_ld_aligned_shf_merge=yes
+case "$target" in
+  # While Solaris 10/SPARC ld isn't affected, disable to avoid problems
+  # relinking on Solaris 11 < 11.4.
+  sparc*-*-solaris2.10*)
+    if test x"$gnu_ld" = xno; then
+      gcc_cv_ld_aligned_shf_merge=no
+    fi
+    ;;
+  # SHF_MERGE support is broken in Solaris ld up to Solaris 11.3/SPARC for
+  # alignment > 1.
+  sparc*-*-solaris2.11*)
+    if test x"$gnu_ld" = xno \
+       && test "$ld_vers_major" -lt 2 && test "$ld_vers_minor" -lt 3159; then
+      gcc_cv_ld_aligned_shf_merge=no
+    fi
+    ;;
+esac
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_LD_ALIGNED_SHF_MERGE `if test $gcc_cv_ld_aligned_shf_merge = yes; then echo 1; else echo 0; fi`
+_ACEOF
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for stabs directive" >&5
 $as_echo_n "checking assembler for stabs directive... " >&6; }
 if test "${gcc_cv_as_stabs_directive+set}" = set; then :
index 3b70d5310a40f3d1fa396f9156f2dfdb4433f4a1..f43af0b8d204aef971d3e5c38fd91af0f8595f98 100644 (file)
@@ -3039,6 +3039,28 @@ AC_DEFINE_UNQUOTED(HAVE_GAS_SHF_MERGE,
   [`if test $gcc_cv_as_shf_merge = yes; then echo 1; else echo 0; fi`],
 [Define 0/1 if your assembler supports marking sections with SHF_MERGE flag.])
 
+gcc_cv_ld_aligned_shf_merge=yes
+case "$target" in
+  # While Solaris 10/SPARC ld isn't affected, disable to avoid problems
+  # relinking on Solaris 11 < 11.4.
+  sparc*-*-solaris2.10*)
+    if test x"$gnu_ld" = xno; then
+      gcc_cv_ld_aligned_shf_merge=no
+    fi
+    ;;
+  # SHF_MERGE support is broken in Solaris ld up to Solaris 11.3/SPARC for
+  # alignment > 1.
+  sparc*-*-solaris2.11*)
+    if test x"$gnu_ld" = xno \
+       && test "$ld_vers_major" -lt 2 && test "$ld_vers_minor" -lt 3159; then
+      gcc_cv_ld_aligned_shf_merge=no
+    fi
+    ;;
+esac
+AC_DEFINE_UNQUOTED(HAVE_LD_ALIGNED_SHF_MERGE,
+  [`if test $gcc_cv_ld_aligned_shf_merge = yes; then echo 1; else echo 0; fi`],
+[Define 0/1 if your linker supports the SHF_MERGE flag with section alignment > 1.])
+
 gcc_GAS_CHECK_FEATURE([stabs directive], gcc_cv_as_stabs_directive, ,,
 [.stabs "gcc2_compiled.",60,0,0,0],,
 [AC_DEFINE(HAVE_AS_STABS_DIRECTIVE, 1,
index 91650eea9f70982fedf5880dede5503d9d3121a1..06f41d002fd120e327c2667a083e622e7b47ba67 100644 (file)
@@ -823,6 +823,9 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
          if (align < modesize)
            align = modesize;
 
+         if (!HAVE_LD_ALIGNED_SHF_MERGE && align > 8)
+           return readonly_data_section;
+
          str = TREE_STRING_POINTER (decl);
          unit = GET_MODE_SIZE (mode);
 
@@ -861,7 +864,8 @@ mergeable_constant_section (machine_mode mode ATTRIBUTE_UNUSED,
       && known_le (GET_MODE_BITSIZE (mode), align)
       && align >= 8
       && align <= 256
-      && (align & (align - 1)) == 0)
+      && (align & (align - 1)) == 0
+      && (HAVE_LD_ALIGNED_SHF_MERGE ? 1 : align == 8))
     {
       const char *prefix = function_mergeable_rodata_prefix ();
       char *name = (char *) alloca (strlen (prefix) + 30);