[AArch64] Fix behaviour of -mcpu option to match ARM.
authorJames Greenhalgh <james.greenhalgh@arm.com>
Mon, 20 Jan 2014 11:32:32 +0000 (11:32 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Mon, 20 Jan 2014 11:32:32 +0000 (11:32 +0000)
gcc/

* common/config/aarch64/aarch64-common.c
(aarch64_handle_option): Don't handle any option order logic here.
* config/aarch64/aarch64.c (aarch64_parse_arch): Do not override
selected_cpu, warn on architecture version mismatch.
(aarch64_override_options): Fix parsing order for option strings.

From-SVN: r206803

gcc/ChangeLog
gcc/common/config/aarch64/aarch64-common.c
gcc/config/aarch64/aarch64.c

index df6ab69..f3e09e8 100644 (file)
@@ -1,3 +1,11 @@
+2014-01-20  James Greenhalgh  <james.greenhalgh@arm.com>
+
+       * common/config/aarch64/aarch64-common.c
+       (aarch64_handle_option): Don't handle any option order logic here.
+       * config/aarch64/aarch64.c (aarch64_parse_arch): Do not override
+       selected_cpu, warn on architecture version mismatch.
+       (aarch64_override_options): Fix parsing order for option strings.
+
 2014-01-20  Jan-Benedict Glaw  <jbglaw@lug-owl.de>
            Iain Sandoe  <iain@codesourcery.com>
 
index 135a9bc..6107007 100644 (file)
@@ -52,10 +52,10 @@ static const struct default_options aarch_option_optimization_table[] =
 /* Implement TARGET_HANDLE_OPTION.
    This function handles the target specific options for CPU/target selection.
 
-   march wins over mcpu, so when march is defined, mcpu takes the same value,
-   otherwise march remains undefined. mtune can be used with either march or
-   mcpu. If march and mcpu are used together, the rightmost option wins.
-   mtune can be used with either march or mcpu.  */
+   -mcpu=CPU is shorthand for -march=ARCH_FOR_CPU, -mtune=CPU.
+   If either of -march or -mtune is given, they override their
+   respective component of -mcpu.  This logic is implemented
+   in config/aarch64/aarch64.c:aarch64_override_options.  */
 
 static bool
 aarch64_handle_option (struct gcc_options *opts,
@@ -70,12 +70,10 @@ aarch64_handle_option (struct gcc_options *opts,
     {
     case OPT_march_:
       opts->x_aarch64_arch_string = arg;
-      opts->x_aarch64_cpu_string = arg;
       return true;
 
     case OPT_mcpu_:
       opts->x_aarch64_cpu_string = arg;
-      opts->x_aarch64_arch_string = NULL;
       return true;
 
     case OPT_mtune_:
index 96a6d23..7091d3e 100644 (file)
@@ -5101,7 +5101,9 @@ aarch64_parse_arch (void)
        {
          selected_arch = arch;
          aarch64_isa_flags = selected_arch->flags;
-         selected_cpu = &all_cores[selected_arch->core];
+
+         if (!selected_cpu)
+           selected_cpu = &all_cores[selected_arch->core];
 
          if (ext != NULL)
            {
@@ -5109,6 +5111,12 @@ aarch64_parse_arch (void)
              aarch64_parse_extension (ext);
            }
 
+         if (strcmp (selected_arch->arch, selected_cpu->arch))
+           {
+             warning (0, "switch -mcpu=%s conflicts with -march=%s switch",
+                      selected_cpu->name, selected_arch->name);
+           }
+
          return;
        }
     }
@@ -5197,20 +5205,21 @@ aarch64_parse_tune (void)
 static void
 aarch64_override_options (void)
 {
-  /* march wins over mcpu, so when march is defined, mcpu takes the same value,
-     otherwise march remains undefined.  mtune can be used with either march or
-     mcpu.  */
+  /* -mcpu=CPU is shorthand for -march=ARCH_FOR_CPU, -mtune=CPU.
+     If either of -march or -mtune is given, they override their
+     respective component of -mcpu.
 
-  if (aarch64_arch_string)
+     So, first parse AARCH64_CPU_STRING, then the others, be careful
+     with -march as, if -mcpu is not present on the command line, march
+     must set a sensible default CPU.  */
+  if (aarch64_cpu_string)
     {
-      aarch64_parse_arch ();
-      aarch64_cpu_string = NULL;
+      aarch64_parse_cpu ();
     }
 
-  if (aarch64_cpu_string)
+  if (aarch64_arch_string)
     {
-      aarch64_parse_cpu ();
-      selected_arch = NULL;
+      aarch64_parse_arch ();
     }
 
   if (aarch64_tune_string)