diff mbox

PATCH: PR driver/42445: LTO performance: -march=native isn't saved in COLLECT_GCC_OPTIONS

Message ID 20110106211432.GA19504@intel.com
State New
Headers show

Commit Message

H.J. Lu Jan. 6, 2011, 9:14 p.m. UTC
Hi,

This patch adds "%>" so that we can keep march=native in COLLECT_GCC_OPTIONS
for LTO.  OK to install?

Thanks.


H.J.
---
2011-01-06  H.J. Lu  <hongjiu.lu@intel.com>

	PR driver/42445
	* gcc.c (%>S): New.
	(SWITCH_KEEP_FOR_GCC): Likewise.
	(set_collect_gcc_options): Check SWITCH_KEEP_FOR_GCC.
	(do_spec_1): Handle "%>".

	* config/i386/i386.h (CC1_CPU_SPEC): Replace "%<" with "%>".

Comments

Richard Biener Jan. 7, 2011, 6 p.m. UTC | #1
On Thu, Jan 6, 2011 at 10:14 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Hi,
>
> This patch adds "%>" so that we can keep march=native in COLLECT_GCC_OPTIONS
> for LTO.  OK to install?

Ok if bootstrap and testing passes.

Thanks,
Richard.

> Thanks.
>
>
> H.J.
> ---
> 2011-01-06  H.J. Lu  <hongjiu.lu@intel.com>
>
>        PR driver/42445
>        * gcc.c (%>S): New.
>        (SWITCH_KEEP_FOR_GCC): Likewise.
>        (set_collect_gcc_options): Check SWITCH_KEEP_FOR_GCC.
>        (do_spec_1): Handle "%>".
>
>        * config/i386/i386.h (CC1_CPU_SPEC): Replace "%<" with "%>".
>
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index 0653ef4..b69ce65 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -565,9 +565,9 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
>  #define CC1_CPU_SPEC CC1_CPU_SPEC_1
>  #else
>  #define CC1_CPU_SPEC CC1_CPU_SPEC_1 \
> -"%{march=native:%<march=native %:local_cpu_detect(arch) \
> -  %{!mtune=*:%<mtune=native %:local_cpu_detect(tune)}} \
> -%{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
> +"%{march=native:%>march=native %:local_cpu_detect(arch) \
> +  %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} \
> +%{mtune=native:%>mtune=native %:local_cpu_detect(tune)}"
>  #endif
>  #endif
>
> diff --git a/gcc/gcc.c b/gcc/gcc.c
> index 9ec7d4e..2aebcef 100644
> --- a/gcc/gcc.c
> +++ b/gcc/gcc.c
> @@ -390,6 +390,7 @@ or with constant text in a single argument.
>         Note - this command is position dependent.  % commands in the
>         spec string before this one will see -S, % commands in the
>         spec string after this one will not.
> + %>S   Similar to "%<S", but keep it in the GCC command line.
>  %<S*  remove all occurrences of all switches beginning with -S from the
>         command line.
>  %:function(args)
> @@ -2743,10 +2744,11 @@ execute (void)
>    The `validated' field is nonzero if any spec has looked at this switch;
>    if it remains zero at the end of the run, it must be meaningless.  */
>
> -#define SWITCH_LIVE                            0x1
> -#define SWITCH_FALSE                           0x2
> -#define SWITCH_IGNORE                  0x4
> -#define SWITCH_IGNORE_PERMANENTLY      0x8
> +#define SWITCH_LIVE                            (1 << 0)
> +#define SWITCH_FALSE                           (1 << 1)
> +#define SWITCH_IGNORE                  (1 << 2)
> +#define SWITCH_IGNORE_PERMANENTLY      (1 << 3)
> +#define SWITCH_KEEP_FOR_GCC            (1 << 4)
>
>  struct switchstr
>  {
> @@ -3926,7 +3928,9 @@ set_collect_gcc_options (void)
>       first_time = FALSE;
>
>       /* Ignore elided switches.  */
> -      if ((switches[i].live_cond & SWITCH_IGNORE) != 0)
> +      if ((switches[i].live_cond
> +          & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
> +         == SWITCH_IGNORE)
>        continue;
>
>       obstack_grow (&collect_obstack, "'-", 2);
> @@ -5091,10 +5095,17 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
>           /* Henceforth ignore the option(s) matching the pattern
>              after the %<.  */
>          case '<':
> +         case '>':
>            {
>              unsigned len = 0;
>              int have_wildcard = 0;
>              int i;
> +             int switch_option;
> +
> +             if (c == '>')
> +               switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
> +             else
> +               switch_option = SWITCH_IGNORE;
>
>              while (p[len] && p[len] != ' ' && p[len] != '\t')
>                len++;
> @@ -5106,7 +5117,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
>                if (!strncmp (switches[i].part1, p, len - have_wildcard)
>                    && (have_wildcard || switches[i].part1[len] == '\0'))
>                  {
> -                   switches[i].live_cond |= SWITCH_IGNORE;
> +                   switches[i].live_cond |= switch_option;
>                    switches[i].validated = 1;
>                  }
>
>
diff mbox

Patch

diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 0653ef4..b69ce65 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -565,9 +565,9 @@  extern const char *host_detect_local_cpu (int argc, const char **argv);
 #define CC1_CPU_SPEC CC1_CPU_SPEC_1
 #else
 #define CC1_CPU_SPEC CC1_CPU_SPEC_1 \
-"%{march=native:%<march=native %:local_cpu_detect(arch) \
-  %{!mtune=*:%<mtune=native %:local_cpu_detect(tune)}} \
-%{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
+"%{march=native:%>march=native %:local_cpu_detect(arch) \
+  %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} \
+%{mtune=native:%>mtune=native %:local_cpu_detect(tune)}"
 #endif
 #endif
 
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 9ec7d4e..2aebcef 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -390,6 +390,7 @@  or with constant text in a single argument.
         Note - this command is position dependent.  % commands in the
         spec string before this one will see -S, % commands in the
         spec string after this one will not.
+ %>S	Similar to "%<S", but keep it in the GCC command line.
  %<S*	remove all occurrences of all switches beginning with -S from the
         command line.
  %:function(args)
@@ -2743,10 +2744,11 @@  execute (void)
    The `validated' field is nonzero if any spec has looked at this switch;
    if it remains zero at the end of the run, it must be meaningless.  */
 
-#define SWITCH_LIVE    			0x1
-#define SWITCH_FALSE   			0x2
-#define SWITCH_IGNORE			0x4
-#define SWITCH_IGNORE_PERMANENTLY	0x8
+#define SWITCH_LIVE    			(1 << 0)
+#define SWITCH_FALSE   			(1 << 1)
+#define SWITCH_IGNORE			(1 << 2)
+#define SWITCH_IGNORE_PERMANENTLY	(1 << 3)
+#define SWITCH_KEEP_FOR_GCC		(1 << 4)
 
 struct switchstr
 {
@@ -3926,7 +3928,9 @@  set_collect_gcc_options (void)
       first_time = FALSE;
 
       /* Ignore elided switches.  */
-      if ((switches[i].live_cond & SWITCH_IGNORE) != 0)
+      if ((switches[i].live_cond
+	   & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
+	  == SWITCH_IGNORE)
 	continue;
 
       obstack_grow (&collect_obstack, "'-", 2);
@@ -5091,10 +5095,17 @@  do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
 	   /* Henceforth ignore the option(s) matching the pattern
 	      after the %<.  */
 	  case '<':
+	  case '>':
 	    {
 	      unsigned len = 0;
 	      int have_wildcard = 0;
 	      int i;
+	      int switch_option;
+
+	      if (c == '>')
+		switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
+	      else
+		switch_option = SWITCH_IGNORE;
 
 	      while (p[len] && p[len] != ' ' && p[len] != '\t')
 		len++;
@@ -5106,7 +5117,7 @@  do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
 		if (!strncmp (switches[i].part1, p, len - have_wildcard)
 		    && (have_wildcard || switches[i].part1[len] == '\0'))
 		  {
-		    switches[i].live_cond |= SWITCH_IGNORE;
+		    switches[i].live_cond |= switch_option;
 		    switches[i].validated = 1;
 		  }