public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Iain Sandoe <iain@codesourcery.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>
Cc: Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>,
	Mike Stump	<mikestump@comcast.net>
Subject: [PATCH, Darwin] fix for PR67710 : Update 'as' specs  and inputs to handle newer assembler versions.
Date: Sun, 06 Nov 2016 20:53:00 -0000	[thread overview]
Message-ID: <BD82A89B-BFBD-4DC7-A8C2-B78E5853C9F3@codesourcery.com> (raw)

Hi Folks,

This is an updated solution, but on a patch from Rainer Orth (attached to pr67710).

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 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.

OK for trunk?
OK for open branches?
Iain

gcc/

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

	target/PR67710
	* 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-06  Iain Sandoe  <iain@codesourcery.com>
	Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	target/PR67710
	*  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-06  Iain Sandoe  <iain@codesourcery.com>
	Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	target/PR67710
	*  libgcc/config/t-darwin: Default builds to 10.5 codegen.
	

---
 gcc/config.in                              |  7 ++++++
 gcc/config/darwin-driver.c                 | 28 ++++++++++++++++++++-
 gcc/config/darwin.h                        | 21 ++++++++++++++--
 gcc/config/darwin.opt                      |  3 +++
 gcc/config/i386/darwin.h                   |  5 ++--
 gcc/configure                              | 39 ++++++++++++++++++++++++++++++
 gcc/configure.ac                           | 14 +++++++++++
 gcc/testsuite/gcc.dg/darwin-minversion-1.c |  4 +--
 gcc/testsuite/gcc.dg/darwin-minversion-2.c |  4 +--
 gcc/testsuite/gcc.dg/darwin-minversion-3.c |  4 +--
 libgcc/config/t-darwin                     |  4 +++
 11 files changed, 122 insertions(+), 11 deletions(-)

diff --git a/gcc/config/darwin-driver.c b/gcc/config/darwin-driver.c
index db8d72c..f80c9ed 100644
--- a/gcc/config/darwin-driver.c
+++ b/gcc/config/darwin-driver.c
@@ -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]);
+        }
+    }
 }
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index 79fc506..374034e 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -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.  */
diff --git a/gcc/config/darwin.opt b/gcc/config/darwin.opt
index 7f2e394..25459e0 100644
--- a/gcc/config/darwin.opt
+++ b/gcc/config/darwin.opt
@@ -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)
 
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index c10ceff..705fdf2 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -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
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 1783a39..63b556a 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -3692,6 +3692,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,,
diff --git a/gcc/testsuite/gcc.dg/darwin-minversion-1.c b/gcc/testsuite/gcc.dg/darwin-minversion-1.c
index 6221d61..ee6493a 100644
--- a/gcc/testsuite/gcc.dg/darwin-minversion-1.c
+++ b/gcc/testsuite/gcc.dg/darwin-minversion-1.c
@@ -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;
diff --git a/gcc/testsuite/gcc.dg/darwin-minversion-2.c b/gcc/testsuite/gcc.dg/darwin-minversion-2.c
index 8e18d52..46fab67 100644
--- a/gcc/testsuite/gcc.dg/darwin-minversion-2.c
+++ b/gcc/testsuite/gcc.dg/darwin-minversion-2.c
@@ -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;
diff --git a/gcc/testsuite/gcc.dg/darwin-minversion-3.c b/gcc/testsuite/gcc.dg/darwin-minversion-3.c
index d1795e7..a2be54f 100644
--- a/gcc/testsuite/gcc.dg/darwin-minversion-3.c
+++ b/gcc/testsuite/gcc.dg/darwin-minversion-3.c
@@ -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;
diff --git a/libgcc/config/t-darwin b/libgcc/config/t-darwin
index a69169f..13ca6ed 100644
--- a/libgcc/config/t-darwin
+++ b/libgcc/config/t-darwin
@@ -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 $<
 
-- 
2.8.1


             reply	other threads:[~2016-11-06 20:53 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-06 20:53 Iain Sandoe [this message]
2016-11-07 18:17 ` Mike Stump

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BD82A89B-BFBD-4DC7-A8C2-B78E5853C9F3@codesourcery.com \
    --to=iain@codesourcery.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=mikestump@comcast.net \
    --cc=ro@CeBiTec.Uni-Bielefeld.DE \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).