[Darwin] fix PR67710 by updating 'as' specs to handle newer assembler versions.
authorIain Sandoe <iain@codesourcery.com>
Sun, 27 Nov 2016 15:07:22 +0000 (15:07 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Sun, 27 Nov 2016 15:07:22 +0000 (15:07 +0000)
A/ Newer versions of ld64 check the min_version command, and newer versions of
   the system assembler inserts this in response to "-mmacosx-version-min=" on
   the assembler line. Unless one makes sensible versions, some object is bound
   to conflict.

B/ Additionally, there's a difference in behaviour between "as" and "ld" when
   presented with xx.yy.zz (ld truncates to xx.yy, as doesn't); net result is
   that one needs to pass a truncated version to "as".

So (if the assembler supports minversion commands)
(a) provide a truncated minversion (as asm_macosx_version_min, which is a
    driver-only var).
(b) pass this to "as"
(c) Update tests to determine 'HAVE_AS_MMACOSX_VERSION_MIN_OPTION'
    (Rainer's patch)
(d) For some reason the testcases are "run" (it's not obvious they need to be,
    they are checking compile-time issues)
  - anyway, to preserve the status quo, I've left them as exec.  However, the
    minimum version that can be code-gened for is target-dependent (there are no
    released x86 versions before 10.4, for example).  To avoid conflicts where
    the "as" is assuming some minimum, I've set the testversion to 10.5 (which
    is supported by all the archs we have)
(e) We need to ensure that libgcc and crts are generated with a sufficiently
    old minversion not to conflict.

gcc/

2016-11-27  Iain Sandoe  <iain@codesourcery.com>
    Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

PR target/67710
* config.in: Regenerate
* config/darwin-driver.c (darwin_driver_init): Emit a version string
for the assembler.
* config/darwin.h(ASM_MMACOSX_VERSION_MIN_SPEC): New, new tests.
* config/darwin.opt(asm_macosx_version_min): New.
* config/i386/darwin.h: Handle ASM_MMACOSX_VERSION_MIN_SPEC.
* configure: Regenerate
* configure.ac: Check for mmacosx-version-min handling.

gcc/testsuite/

2016-11-27  Iain Sandoe  <iain@codesourcery.com>
    Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
    Dominique d'Humieres  <dominiq@lps.ens.fr>

PR target/67710
*  gcc.dg/darwin-minversion-1.c: Update min version check.
*  gcc.dg/darwin-minversion-2.c: Likewise.
*  gcc.dg/darwin-minversion-3.c: Likewise.

libgcc/

2016-11-27  Iain Sandoe  <iain@codesourcery.com>
    Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

PR target/67710
*  config/t-darwin: Default builds to 10.5 codegen.

Co-Authored-By: Dominique d'Humieres <dominiq@lps.ens.fr>
Co-Authored-By: Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
From-SVN: r242898

14 files changed:
gcc/ChangeLog
gcc/config.in
gcc/config/darwin-driver.c
gcc/config/darwin.h
gcc/config/darwin.opt
gcc/config/i386/darwin.h
gcc/configure
gcc/configure.ac
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/darwin-minversion-1.c
gcc/testsuite/gcc.dg/darwin-minversion-2.c
gcc/testsuite/gcc.dg/darwin-minversion-3.c
libgcc/ChangeLog
libgcc/config/t-darwin

index a57eaab8b20e300da75bd9bda1fadf8f280608b6..4cd9332cc325d91c9854fabb8ca9396e1c3d0bb2 100644 (file)
@@ -1,3 +1,16 @@
+2016-11-27  Iain Sandoe  <iain@codesourcery.com>
+           Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR target/67710
+       * config.in: Regenerate
+       * config/darwin-driver.c (darwin_driver_init): Emit a version string
+       for the assembler.
+       * config/darwin.h(ASM_MMACOSX_VERSION_MIN_SPEC): New, new tests.
+       * config/darwin.opt(asm_macosx_version_min): New.
+       * config/i386/darwin.h: Handle ASM_MMACOSX_VERSION_MIN_SPEC.
+       * configure: Regenerate
+       * configure.ac: Check for mmacosx-version-min handling.
+
 2016-11-27  Iain Sandoe  <iain@codesourcery.com>
 
        PR target/57438
index c192638fc94c46e498f53b74cc6e33a9c4c2568d..e02d33e0cdb99c8c1d70eac084edfb2862c5f49b 100644 (file)
 #endif
 
 
+/* Define if your Mac OS X assembler supports the -mmacos-version-min option.
+   */
+#ifndef USED_FOR_TARGET
+#undef HAVE_AS_MMACOSX_VERSION_MIN_OPTION
+#endif
+
+
 /* Define if the assembler understands -mnan=. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_AS_NAN
index db8d72c2a810f616d72a7aec659fc6d4cae2dd0e..f80c9ed2e0f899bb0e0e2136eeb965e58f3caa3c 100644 (file)
@@ -73,7 +73,8 @@ darwin_find_version_from_kernel (void)
      component.  */
   if (major_vers - 4 <= 4)
     /* On 10.4 and earlier, the old linker is used which does not
-       support three-component system versions.  */
+       support three-component system versions.
+       FIXME: we should not assume this - a newer linker could be used.  */
     asprintf (&new_flag, "10.%d", major_vers - 4);
   else
     asprintf (&new_flag, "10.%d.%s", major_vers - 4, minor_vers);
@@ -294,4 +295,29 @@ darwin_driver_init (unsigned int *decoded_options_count,
                          &(*decoded_options)[*decoded_options_count - 1]);
        }
     }
+  /* Create and push the major version for assemblers that need it.  */
+  if (vers_string != NULL)
+    {
+      char *asm_major = NULL;
+      char *first_period = strchr(vers_string, '.');
+      if (first_period != NULL)
+       {
+         char *second_period = strchr(first_period+1, '.');
+         if (second_period  != NULL)
+           asm_major = xstrndup (vers_string, second_period-vers_string);
+         else
+           asm_major = xstrdup (vers_string);
+        }
+      /* Else we appear to have a weird macosx version with no major number.
+         Punt on this for now.  */
+      if (asm_major != NULL)
+        {
+         ++*decoded_options_count;
+         *decoded_options = XRESIZEVEC (struct cl_decoded_option,
+                                        *decoded_options,
+                                        *decoded_options_count);
+         generate_option (OPT_asm_macosx_version_min_, asm_major, 1, CL_DRIVER,
+                         &(*decoded_options)[*decoded_options_count - 1]);
+        }
+    }
 }
index 79fc50637e367f67594a9829622c0a72e310d5d3..374034e3f0d9fe721b3ac6f0234f69833cc21048 100644 (file)
@@ -399,10 +399,27 @@ extern GTY(()) int darwin_ms_struct;
    %:version-compare(>< 10.6 10.8 mmacosx-version-min= -lcrt1.10.6.o)  \
    %{fgnu-tm: -lcrttms.o}"
 
-/* Default Darwin ASM_SPEC, very simple.  */
+#ifdef HAVE_AS_MMACOSX_VERSION_MIN_OPTION
+/* Emit macosx version (but only major).  */
+#define ASM_MMACOSX_VERSION_MIN_SPEC \
+  " %{asm_macosx_version_min=*: -mmacosx-version-min=%*} %<asm_macosx_version_min=*"
+#else
+#define ASM_MMACOSX_VERSION_MIN_SPEC " %<asm_macosx_version_min=*"
+#endif
+
+/* When we detect that we're cctools or llvm as, we need to insert the right
+   additional options.  */
+#if HAVE_GNU_AS
+#define ASM_OPTIONS ""
+#else
+#define ASM_OPTIONS "%{v} %{w:-W} %{I*}"
+#endif
+
+/* Default Darwin ASM_SPEC, very simple. */
 #define ASM_SPEC "-arch %(darwin_arch) \
+  " ASM_OPTIONS " \
   %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \
-  %{static}"
+  %{static}" ASM_MMACOSX_VERSION_MIN_SPEC
 
 /* Default ASM_DEBUG_SPEC.  Darwin's as cannot currently produce dwarf
    debugging data.  */
index 7f2e394ae79cd44b870bbfb090676c631be265fb..25459e0728851205ab6271e3fef9a3e561d62e1e 100644 (file)
@@ -37,6 +37,9 @@ Driver RejectNegative Separate
 arch_errors_fatal
 Driver Alias(Zarch_errors_fatal)
 
+asm_macosx_version_min=
+Driver RejectNegative Joined
+
 bind_at_load
 Driver Alias(Zbind_at_load)
 
index c10ceff0cc235320eba8bc5a4ca5ff571428ba11..705fdf2696d682a867fd911bd086944b76f112c6 100644 (file)
@@ -112,8 +112,9 @@ extern int darwin_emit_branch_islands;
   DARWIN_CC1_SPEC
 
 #undef ASM_SPEC
-#define ASM_SPEC "-arch %(darwin_arch) -force_cpusubtype_ALL \
-  %{static}"
+#define ASM_SPEC "-arch %(darwin_arch) \
+  " ASM_OPTIONS " -force_cpusubtype_ALL \
+  %{static}" ASM_MMACOSX_VERSION_MIN_SPEC
 
 #define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}"
 #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
index aa961b77acd5ed9a7dcd49f8d1435dd07bf3af00..90f9e8977fd7862f368f3dd3b4ed0ba85c835c91 100755 (executable)
@@ -24476,6 +24476,45 @@ _ACEOF
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_lto_plugin" >&5
 $as_echo "$gcc_cv_lto_plugin" >&6; }
 
+# Target OS-specific assembler checks.
+
+case "$target_os" in
+  darwin*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for -mmacosx-version-min option" >&5
+$as_echo_n "checking assembler for -mmacosx-version-min option... " >&6; }
+if test "${gcc_cv_as_mmacosx_version_min+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  gcc_cv_as_mmacosx_version_min=no
+  if test x$gcc_cv_as != x; then
+    $as_echo '.text' > conftest.s
+    if { ac_try='$gcc_cv_as $gcc_cv_as_flags -mmacosx-version-min=10.1 -o conftest.o conftest.s >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+    then
+       gcc_cv_as_mmacosx_version_min=yes
+    else
+      echo "configure: failed program was" >&5
+      cat conftest.s >&5
+    fi
+    rm -f conftest.o conftest.s
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_mmacosx_version_min" >&5
+$as_echo "$gcc_cv_as_mmacosx_version_min" >&6; }
+if test $gcc_cv_as_mmacosx_version_min = yes; then
+
+$as_echo "#define HAVE_AS_MMACOSX_VERSION_MIN_OPTION 1" >>confdefs.h
+
+fi
+    ;;
+esac
+
+# Target CPU-specific assembler checks.
+
 case "$target" in
   aarch64*-*-*)
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for -mabi option" >&5
index 998499ed82d77a3d838d92123e0b5a3a9db68838..b2798e78db71cf2e5c739858c419a9f273b68724 100644 (file)
@@ -3689,6 +3689,20 @@ AC_DEFINE_UNQUOTED(HAVE_LTO_PLUGIN, $gcc_cv_lto_plugin,
   [Define to the level of your linker's plugin support.])
 AC_MSG_RESULT($gcc_cv_lto_plugin)
 
+# Target OS-specific assembler checks.
+
+case "$target_os" in
+  darwin*)
+    gcc_GAS_CHECK_FEATURE([-mmacosx-version-min option],
+      gcc_cv_as_mmacosx_version_min,,
+      [-mmacosx-version-min=10.1], [.text],,
+      [AC_DEFINE(HAVE_AS_MMACOSX_VERSION_MIN_OPTION, 1,
+       [Define if your Mac OS X assembler supports the -mmacos-version-min option.])])
+    ;;
+esac
+
+# Target CPU-specific assembler checks.
+
 case "$target" in
   aarch64*-*-*)
     gcc_GAS_CHECK_FEATURE([-mabi option], gcc_cv_as_aarch64_mabi,,
index d7eacc3543e12647f1890108b2accd4086bd1586..579dd10b14b1d3fdd546a9878bad88c6598eed04 100644 (file)
@@ -1,3 +1,12 @@
+2016-11-27  Iain Sandoe  <iain@codesourcery.com>
+           Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+           Dominique d'Humieres  <dominiq@lps.ens.fr>
+
+       PR target/67710
+       *  gcc.dg/darwin-minversion-1.c: Update min version check.
+       *  gcc.dg/darwin-minversion-2.c: Likewise.
+       *  gcc.dg/darwin-minversion-3.c: Likewise.
+
 2016-11-27  Iain Sandoe  <iain@codesourcery.com>
 
        PR target/57438
index 6221d617b2e5d8d80eeaa7a743a320d0d3061509..ee6493a3119bdbf8364020ec26f2ff98f4b849ea 100644 (file)
@@ -1,11 +1,11 @@
 /* Basic test for -mmacosx-version-min switch on Darwin.  */
-/* { dg-options "-mmacosx-version-min=10.1" } */
+/* { dg-options "-mmacosx-version-min=10.5" } */
 /* { dg-do run { target *-*-darwin* } } */
 
 int
 main ()
 {
-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1010
+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1050
   fail me;
 #endif
   return 0;
index 8e18d5273a6b539e035929507846c3f293ae9c1f..46fab671b953c7637c786cd5f154a83ba58654ad 100644 (file)
@@ -1,11 +1,11 @@
 /* Basic test for -mmacosx-version-min switch on Darwin.  */
-/* { dg-options "-mmacosx-version-min=10.1 -mmacosx-version-min=10.3" } */
+/* { dg-options "-mmacosx-version-min=10.1 -mmacosx-version-min=10.5" } */
 /* { dg-do run { target *-*-darwin* } } */
 
 int
 main ()
 {
-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1030
+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1050
   fail me;
 #endif
   return 0;
index d1795e74a692410db42266c1ba2bb7fbcc950102..a2be54f490a35c82aa161232cbdf1c43182cdb1b 100644 (file)
@@ -1,11 +1,11 @@
 /* Test that most minor versions less than 10 work.  */
-/* { dg-options "-mmacosx-version-min=10.4.1" } */
+/* { dg-options "-mmacosx-version-min=10.5.8" } */
 /* { dg-do compile { target *-*-darwin* } } */
 
 int
 main ()
 {
-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1041
+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1058
   fail me;
 #endif
   return 0;
index 592fd3a245c0d2d28eb3dd3194d20eab5f7e2bc6..e65c71da3a4c2c5b7322553ab8c26fb9516e0f55 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-27  Iain Sandoe  <iain@codesourcery.com>
+           Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR target/67710
+       *  config/t-darwin: Default builds to 10.5 codegen.
+
 2016-11-24  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/sfp-machine.h (_FP_NANFRAC_H): Define.
index a69169fa610036aa71f0747c265c237d0c681ef6..13ca6ed99d3f58df474c5f2cd0dd1d04385feab9 100644 (file)
@@ -1,3 +1,7 @@
+# Set this as a minimum (unless overriden by arch t-files) since it's a
+# reasonable lowest common denominator that works for all our archs.
+HOST_LIBGCC2_CFLAGS += -mmacosx-version-min=10.5
+
 crt3.o: $(srcdir)/config/darwin-crt3.c
        $(crt_compile) $(DARWIN_EXTRA_CRT_BUILD_CFLAGS) -c $<