diff mbox

[Darwin,Driver/specs] A bit more TLC, factor version-min code, lose some dead specs.

Message ID B38FD27A-D7A5-4E7B-A210-6FB64678D94E@codesourcery.com
State New
Headers show

Commit Message

Iain Sandoe Sept. 12, 2015, 2:33 p.m. UTC
Hi,

This is a clean-up and code re-factoring patch; NFC intended.

a) The arcane version specs that attempted to figure out a version-min on the basis of inspecting other c/l flags have been dead for some time (since the driver started inserting a default); so let's lose those.

b) We'll need access to the version-min at the outer level in the darwin-specific driver code in order to use that to figure out where to find sysroots, so let's factor the code to do that and shorten it at the same time.

c) In the absence of any other information, the best choice we can make for version-min is 10.5, since that's the only version that (fully) supports all of our archs...

d) ... however, we normally do have a version-min default, to let's make sure we provide that as the init.

e) If a user elects to call a compiler (cc1*, f951, etc.) without a version-min, the init provided in (d) will kick in, and stop the compiler from segv-ing.  However, we should warn the User that a default was used, because it's very likely not what was intended.

OK for trunk?
Iain

gcc/
	* config/darwin-driver.c (darwin_default_min_version): Refactor code.
	(darwin_driver_init): Note a version-min when provided on the c/l.
	* config/darwin.c (darwin_override_options): Warn the user if the compiler is
	invoked without a version-min.
	* config/darwin.h (%darwin_minversion): Remove.
	* config/i386/darwin.h: Likewise.
	* config/rs6000/darwin.h: Likewise.
	* config/darwin.opt (mmacosx-version-min=): Use the configured default, rather than
	an arbitrary constant.
From 04cfd2ea513fdaa48826891dbc87615f97270950 Mon Sep 17 00:00:00 2001
From: Iain Sandoe <iain@codesourcery.com>
Date: Mon, 7 Sep 2015 09:59:45 +0100
Subject: [PATCH] [Darwin, driver] Revise and clean up system version
 detection.

This re-factors the system version detection and makes the version
string available to the darwin_driver_init() routine, when it is
available.  We also delete all the "darwin_minversion" spec stuff
which is unused and redundant.  The default value for compilers is
now set to match the configured default.  If compilers are invoked
directly without an explicit system version, a warning is given.
---
 gcc/config/darwin-driver.c | 109 +++++++++++++++++++--------------------------
 gcc/config/darwin.c        |   8 ++++
 gcc/config/darwin.h        |  10 ++---
 gcc/config/darwin.opt      |   5 +--
 gcc/config/darwin12.h      |   3 ++
 gcc/config/i386/darwin.h   |  10 -----
 gcc/config/rs6000/darwin.h |  12 -----
 7 files changed, 65 insertions(+), 92 deletions(-)

Comments

Mike Stump Sept. 13, 2015, 8:25 p.m. UTC | #1
On Sep 12, 2015, at 7:33 AM, Iain Sandoe <iain@codesourcery.com> wrote:
> e) If a user elects to call a compiler (cc1*, f951, etc.) without a version-min, the init provided in (d) will kick in, and stop the compiler from segv-ing.  However, we should warn the User that a default was used, because it's very likely not what was intended.

So, I don’t find value in the warning.  We should engineer a nice sane default and be proud of it.  Two people call cc1 without using the driver.  You, and I.  What value do you find in the warning?  If none, I’d just drop it.

It is like a warning, “we are compiling C code”.  This is true, but what value is it?

Ok with or without the warning.
diff mbox

Patch

diff --git a/gcc/config/darwin-driver.c b/gcc/config/darwin-driver.c
index 727ea53..4042a68 100644
--- a/gcc/config/darwin-driver.c
+++ b/gcc/config/darwin-driver.c
@@ -96,73 +96,36 @@  darwin_find_version_from_kernel (void)
    included in tm.h).  This may be overidden by setting the flag explicitly
    (or by the MACOSX_DEPLOYMENT_TARGET environment).  */
 
-static void
-darwin_default_min_version (unsigned int *decoded_options_count,
-			    struct cl_decoded_option **decoded_options)
+static const char *
+darwin_default_min_version (void)
 {
-  const unsigned int argc = *decoded_options_count;
-  struct cl_decoded_option *const argv = *decoded_options;
-  unsigned int i;
-  const char *new_flag;
-
-  /* If the command-line is empty, just return.  */
-  if (argc <= 1)
-    return;
-  
-  /* Don't do this if the user specified -mmacosx-version-min= or
-     -mno-macosx-version-min.  */
-  for (i = 1; i < argc; i++)
-    if (argv[i].opt_index == OPT_mmacosx_version_min_)
-      return;
-
-  /* Retrieve the deployment target from the environment and insert
-     it as a flag.  */
-  {
-    const char * macosx_deployment_target;
-    macosx_deployment_target = getenv ("MACOSX_DEPLOYMENT_TARGET");
-    if (macosx_deployment_target
-	/* Apparently, an empty string for MACOSX_DEPLOYMENT_TARGET means
-	   "use the default".  Or, possibly "use 10.1".  We choose
-	   to ignore the environment variable, as if it was never set.  */
-	&& macosx_deployment_target[0])
-      {
-	++*decoded_options_count;
-	*decoded_options = XNEWVEC (struct cl_decoded_option,
-				    *decoded_options_count);
-	(*decoded_options)[0] = argv[0];
-	generate_option (OPT_mmacosx_version_min_, macosx_deployment_target,
-			 1, CL_DRIVER, &(*decoded_options)[1]);
-	memcpy (*decoded_options + 2, argv + 1,
-		(argc - 1) * sizeof (struct cl_decoded_option));
-	return;
-      }
-  }
+  /* Try to retrieve the deployment target from the environment.  */
+  const char *new_flag = getenv ("MACOSX_DEPLOYMENT_TARGET");
 
+  /* Apparently, an empty string for MACOSX_DEPLOYMENT_TARGET means
+     "use the default".  Or, possibly "use 10.1".  We choose
+     to ignore the environment variable, as if it was never set.  */
+  if (new_flag == NULL || new_flag[0] == 0)
 #ifndef CROSS_DIRECTORY_STRUCTURE
-
-  /* Try to find the version from the kernel, if we fail - we print a message 
-     and give up.  */
-  new_flag = darwin_find_version_from_kernel ();
-  if (!new_flag)
-    return;
-
+    /* Try to find the version from the kernel, if we fail - we print a
+       message and give up.  */
+    new_flag = darwin_find_version_from_kernel ();
 #else
-
-  /* For cross-compilers, default to the target OS version. */
-  new_flag = DEF_MIN_OSX_VERSION;
-
+    /* For cross-compilers, default to a minimum version determined by
+       the configuration. */
+    new_flag = DEF_MIN_OSX_VERSION;
 #endif /* CROSS_DIRECTORY_STRUCTURE */
 
-  /* Add the new flag.  */
-  ++*decoded_options_count;
-  *decoded_options = XNEWVEC (struct cl_decoded_option,
-			      *decoded_options_count);
-  (*decoded_options)[0] = argv[0];
-  generate_option (OPT_mmacosx_version_min_, new_flag,
-		   1, CL_DRIVER, &(*decoded_options)[1]);
-  memcpy (*decoded_options + 2, argv + 1,
-	  (argc - 1) * sizeof (struct cl_decoded_option));
-  return;
+  if (new_flag != NULL)
+    {
+      size_t len = strlen (new_flag);
+      if (len > 128) { /* Arbitrary limit, number should be like xx.yy.zz */
+	warning (0, "couldn%'t understand version %s\n", new_flag);
+	return NULL;
+      }
+      new_flag = strndup (new_flag, len);
+    }
+  return new_flag;
 }
 
 /* Translate -filelist and -framework options in *DECODED_OPTIONS
@@ -187,6 +150,8 @@  darwin_driver_init (unsigned int *decoded_options_count,
   bool seenM64 = false;
   bool appendM32 = false;
   bool appendM64 = false;
+  const char *vers_string = NULL;
+  bool seen_version_min = false;
 
   for (i = 1; i < *decoded_options_count; i++)
     {
@@ -246,12 +211,15 @@  darwin_driver_init (unsigned int *decoded_options_count,
 			   CL_DRIVER, &(*decoded_options)[i]);
 	  break;
 
+	case OPT_mmacosx_version_min_:
+	  seen_version_min = true;
+	  vers_string = strndup ((*decoded_options)[i].arg, 32);
+
 	default:
 	  break;
 	}
     }
 
-  darwin_default_min_version (decoded_options_count, decoded_options);
   /* Turn -arch xxxx into the appropriate -m32/-m64 flag.
      If the User tried to specify multiple arch flags (which is possible with
      some Darwin compilers) warn that this mode is not supported by this
@@ -308,4 +276,21 @@  darwin_driver_init (unsigned int *decoded_options_count,
 		       &(*decoded_options)[*decoded_options_count - 1]);
     }
 
+  /* We will need to know the OS X version we're trying to build for here
+     so that we can figure out the mechanism and source for the sysroot to
+     be used.  */
+  if (! seen_version_min && *decoded_options_count > 1)
+    {
+      /* Not set by the User, try to figure it out.  */
+      vers_string = darwin_default_min_version ();
+      if (vers_string != NULL)
+	{
+	  ++*decoded_options_count;
+	  *decoded_options = XRESIZEVEC (struct cl_decoded_option,
+					 *decoded_options,
+					 *decoded_options_count);
+	  generate_option (OPT_mmacosx_version_min_, vers_string, 1, CL_DRIVER,
+			  &(*decoded_options)[*decoded_options_count - 1]);
+	}
+    }
 }
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index b6effec..7f3c915 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -3064,6 +3064,14 @@  darwin_kextabi_p (void) {
 void
 darwin_override_options (void)
 {
+  /* If a compiler is called directly, rather than via the driver, but
+     without a target system version specified, warn the user that a
+     default is in use.  */
+  if (!global_options_set.x_darwin_macosx_version_min)
+    warning_at (UNKNOWN_LOCATION, 0,
+		"%<-mmacosx-version-min%> is not set; using %<%s%>",
+		darwin_macosx_version_min);
+
   /* Keep track of which (major) version we're generating code for.  */
   if (darwin_macosx_version_min)
     {
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index 9a31952..bb4451a 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -271,7 +271,6 @@  extern GTY(()) int darwin_ms_struct;
    %{headerpad_max_install_names} \
    %{Zimage_base*:-image_base %*} \
    %{Zinit*:-init %*} \
-   %{!mmacosx-version-min=*:-macosx_version_min %(darwin_minversion)} \
    %{mmacosx-version-min=*:-macosx_version_min %*} \
    %{nomultidefs} \
    %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \
@@ -370,8 +369,7 @@  extern GTY(()) int darwin_ms_struct;
 
 #define DARWIN_EXTRA_SPECS						\
   { "darwin_crt1", DARWIN_CRT1_SPEC },					\
-  { "darwin_dylib1", DARWIN_DYLIB1_SPEC },				\
-  { "darwin_minversion", DARWIN_MINVERSION_SPEC },
+  { "darwin_dylib1", DARWIN_DYLIB1_SPEC },
 
 #define DARWIN_DYLIB1_SPEC						\
   "%:version-compare(!> 10.5 mmacosx-version-min= -ldylib1.o)		\
@@ -916,7 +914,9 @@  extern void darwin_driver_init (unsigned int *,struct cl_decoded_option **);
 #define SUPPORTS_INIT_PRIORITY 0
 
 /* When building cross-compilers (and native crosses) we shall default to 
-   providing an osx-version-min of this unless overridden by the User.  */
-#define DEF_MIN_OSX_VERSION "10.4"
+   providing an osx-version-min of this unless overridden by the User.
+   10.5 is the only version that fully supports all our archs so that's the
+   fall-back default.  */
+#define DEF_MIN_OSX_VERSION "10.5"
 
 #endif /* CONFIG_DARWIN_H */
diff --git a/gcc/config/darwin.opt b/gcc/config/darwin.opt
index 5ab0e5c..eb1afe7 100644
--- a/gcc/config/darwin.opt
+++ b/gcc/config/darwin.opt
@@ -226,10 +226,9 @@  Generate code suitable for fast turn around debugging
 ; The Init here is for the convenience of GCC developers, so that cc1
 ; and cc1plus don't crash if no -mmacosx-version-min is passed.  The
 ; driver will always pass a -mmacosx-version-min, so in normal use the
-; Init is never used.  Useful for setting the OS on which people
-; usually debug.
+; Init is never used.
 mmacosx-version-min=
-Target Joined Report Var(darwin_macosx_version_min) Init("10.6")
+Target Joined Report Var(darwin_macosx_version_min) Init(DEF_MIN_OSX_VERSION)
 The earliest MacOS X version on which this program will run
 
 mone-byte-bool
diff --git a/gcc/config/darwin12.h b/gcc/config/darwin12.h
index fdc1d0d..506364a 100644
--- a/gcc/config/darwin12.h
+++ b/gcc/config/darwin12.h
@@ -25,3 +25,6 @@  along with GCC; see the file COPYING3.  If not see
       %:version-compare(>= 10.6 mmacosx-version-min= -lSystem) } } \
    %{fno-pic|fno-PIC|fno-pie|fno-PIE|fapple-kext|mkernel|static|mdynamic-no-pic: \
       %:version-compare(>= 10.7 mmacosx-version-min= -no_pie) } %G %L"
+
+#undef DEF_MIN_OSX_VERSION
+#define DEF_MIN_OSX_VERSION "10.8"
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index 6a2471a..2006a75 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -108,7 +108,6 @@  extern int darwin_emit_branch_islands;
 #undef CC1_SPEC
 #define CC1_SPEC "%(cc1_cpu) \
   %{!mkernel:%{!static:%{!mdynamic-no-pic:-fPIC}}} \
-  %{!mmacosx-version-min=*:-mmacosx-version-min=%(darwin_minversion)} \
   %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} " \
   DARWIN_CC1_SPEC
 
@@ -119,15 +118,6 @@  extern int darwin_emit_branch_islands;
 #define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}"
 #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
 
-/* Determine a minimum version based on compiler options.  */
-#define DARWIN_MINVERSION_SPEC				\
- "%{!m64|fgnu-runtime:10.4;				\
-    ,objective-c|,objc-cpp-output:10.5;			\
-    ,objective-c-header:10.5;				\
-    ,objective-c++|,objective-c++-cpp-output:10.5;	\
-    ,objective-c++-header|,objc++-cpp-output:10.5;	\
-    :10.4}"
-
 #undef ENDFILE_SPEC
 #define ENDFILE_SPEC \
   "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h
index 14d5477..82fcad2 100644
--- a/gcc/config/rs6000/darwin.h
+++ b/gcc/config/rs6000/darwin.h
@@ -93,7 +93,6 @@  extern int darwin_emit_branch_islands;
   %(cc1_cpu) \
   %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} \
   %{static: %{Zdynamic: %e conflicting code gen style switches are used}}\
-  %{!mmacosx-version-min=*:-mmacosx-version-min=%(darwin_minversion)} \
   %{!mkernel:%{!static:%{!mdynamic-no-pic:-fPIC}}} \
   %{faltivec:-maltivec -include altivec.h} %{fno-altivec:-mno-altivec} \
   %<faltivec %<fno-altivec " \
@@ -124,17 +123,6 @@  extern int darwin_emit_branch_islands;
 #define DARWIN_CRT2_SPEC \
   "%{!m64:%:version-compare(!> 10.4 mmacosx-version-min= crt2.o%s)}"
 
-/* Determine a minimum version based on compiler options.  */
-#define DARWIN_MINVERSION_SPEC					\
-  "%{m64:%{fgnu-runtime:10.4;					\
-	   ,objective-c|,objc-cpp-output:10.5;			\
-	   ,objective-c-header:10.5;				\
-	   ,objective-c++|,objective-c++-cpp-output:10.5;	\
-	   ,objective-c++-header|,objc++-cpp-output:10.5;	\
-	   :10.4};						\
-     shared-libgcc:10.3;					\
-     :10.1}"
-
 #undef SUBTARGET_EXTRA_SPECS
 #define SUBTARGET_EXTRA_SPECS			\
   DARWIN_EXTRA_SPECS                            \