Patchwork Implement -Wp,-MD compatibility

login
register
mail settings
Submitter Joseph S. Myers
Date Aug. 13, 2010, 11:21 p.m.
Message ID <Pine.LNX.4.64.1008132321170.10746@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/61721/
State New
Headers show

Comments

Joseph S. Myers - Aug. 13, 2010, 11:21 p.m.
This patch, relative to a tree with
<http://gcc.gnu.org/ml/gcc-patches/2010-08/msg00949.html> (pending
Fortran and Java review) applied, arranges for -MD and -MMD to be
supported by both the driver and cc1 with different conventions about
whether those options take an argument, for compatibility with the
"several projects that rely on -Wp,-MD or -Wp,-MMD" mentioned in
<http://gcc.gnu.org/ml/gcc/2010-08/msg00220.html>.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
commit?

2010-08-13  Joseph Myers  <joseph@codesourcery.com>

	* doc/options.texi (NoDriverArg): Document.
	* gcc.c (cpp_unique_options): Generate -MD and -MMD instead of
	-MDX and -MMDX.
	* opt-functions.awk (switch_flags): Handle NoDriverArg.
	* opts-common.c (decode_cmdline_option): Ignore CL_SEPARATE
	marking for CL_NO_DRIVER_ARG options when in the driver.
	* opts.h (CL_NO_DRIVER_ARG): Define.
	(CL_PARAMS, CL_WARNING, CL_OPTIMIZATION, CL_DRIVER, CL_TARGET,
	CL_COMMON): Update values.

c-family:
2010-08-13  Joseph Myers  <joseph@codesourcery.com>

	* c.opt (MDX): Change back to MD.  Mark NoDriverArg instead of
	RejectDriver.
	(MMDX): Change back to MMD.  Mark NoDriverArg instead of
	RejectDriver.
	* c-opts.c (c_common_handle_option): Use OPT_MD and OPT_MMD
	instead of OPT_MDX and OPT_MMDX.

fortran:
2010-08-13  Joseph Myers  <joseph@codesourcery.com>

	* lang.opt (MDX): Change back to MD.  Mark NoDriverArg instead of
	RejectDriver.
	(MMDX): Change back to MMD.  Mark NoDriverArg instead of
	RejectDriver.
	* cpp.c (gfc_cpp_handle_option): Use OPT_MD and OPT_MMD instead of
	OPT_MDX and OPT_MMDX.
Richard Guenther - Aug. 14, 2010, 12:37 p.m.
On Sat, Aug 14, 2010 at 1:21 AM, Joseph S. Myers
<joseph@codesourcery.com> wrote:
> This patch, relative to a tree with
> <http://gcc.gnu.org/ml/gcc-patches/2010-08/msg00949.html> (pending
> Fortran and Java review) applied, arranges for -MD and -MMD to be
> supported by both the driver and cc1 with different conventions about
> whether those options take an argument, for compatibility with the
> "several projects that rely on -Wp,-MD or -Wp,-MMD" mentioned in
> <http://gcc.gnu.org/ml/gcc/2010-08/msg00220.html>.
>
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
> commit?

Ok.

Thanks,
Richard.

> 2010-08-13  Joseph Myers  <joseph@codesourcery.com>
>
>        * doc/options.texi (NoDriverArg): Document.
>        * gcc.c (cpp_unique_options): Generate -MD and -MMD instead of
>        -MDX and -MMDX.
>        * opt-functions.awk (switch_flags): Handle NoDriverArg.
>        * opts-common.c (decode_cmdline_option): Ignore CL_SEPARATE
>        marking for CL_NO_DRIVER_ARG options when in the driver.
>        * opts.h (CL_NO_DRIVER_ARG): Define.
>        (CL_PARAMS, CL_WARNING, CL_OPTIMIZATION, CL_DRIVER, CL_TARGET,
>        CL_COMMON): Update values.
>
> c-family:
> 2010-08-13  Joseph Myers  <joseph@codesourcery.com>
>
>        * c.opt (MDX): Change back to MD.  Mark NoDriverArg instead of
>        RejectDriver.
>        (MMDX): Change back to MMD.  Mark NoDriverArg instead of
>        RejectDriver.
>        * c-opts.c (c_common_handle_option): Use OPT_MD and OPT_MMD
>        instead of OPT_MDX and OPT_MMDX.
>
> fortran:
> 2010-08-13  Joseph Myers  <joseph@codesourcery.com>
>
>        * lang.opt (MDX): Change back to MD.  Mark NoDriverArg instead of
>        RejectDriver.
>        (MMDX): Change back to MMD.  Mark NoDriverArg instead of
>        RejectDriver.
>        * cpp.c (gfc_cpp_handle_option): Use OPT_MD and OPT_MMD instead of
>        OPT_MDX and OPT_MMDX.
>
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/c-family/c-opts.c gcc-mainline/gcc/c-family/c-opts.c
> --- gcc-mainline-driveropts/gcc/c-family/c-opts.c       2010-08-12 15:57:01.000000000 -0700
> +++ gcc-mainline/gcc/c-family/c-opts.c  2010-08-13 13:22:33.000000000 -0700
> @@ -398,9 +398,9 @@ c_common_handle_option (size_t scode, co
>       flag_no_output = 1;
>       break;
>
> -    case OPT_MDX:
> -    case OPT_MMDX:
> -      cpp_opts->deps.style = (code == OPT_MDX ? DEPS_SYSTEM: DEPS_USER);
> +    case OPT_MD:
> +    case OPT_MMD:
> +      cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
>       cpp_opts->deps.need_preprocessor_output = true;
>       deps_file = arg;
>       break;
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/c-family/c.opt gcc-mainline/gcc/c-family/c.opt
> --- gcc-mainline-driveropts/gcc/c-family/c.opt  2010-08-12 15:57:56.000000000 -0700
> +++ gcc-mainline/gcc/c-family/c.opt     2010-08-13 13:22:58.000000000 -0700
> @@ -72,9 +72,9 @@ M
>  C ObjC C++ ObjC++
>  Generate make dependencies
>
> -MDX
> -C ObjC C++ ObjC++ RejectDriver Separate MissingArgError(missing filename after %qs)
> --MD    Generate make dependencies and compile
> +MD
> +C ObjC C++ ObjC++ NoDriverArg Separate MissingArgError(missing filename after %qs)
> +Generate make dependencies and compile
>
>  MF
>  C ObjC C++ ObjC++ Joined Separate MissingArgError(missing filename after %qs)
> @@ -88,9 +88,9 @@ MM
>  C ObjC C++ ObjC++
>  Like -M but ignore system header files
>
> -MMDX
> -C ObjC C++ ObjC++ RejectDriver Separate MissingArgError(missing filename after %qs)
> --MMD   Like -MD but ignore system header files
> +MMD
> +C ObjC C++ ObjC++ NoDriverArg Separate MissingArgError(missing filename after %qs)
> +Like -MD but ignore system header files
>
>  MP
>  C ObjC C++ ObjC++
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/doc/options.texi gcc-mainline/gcc/doc/options.texi
> --- gcc-mainline-driveropts/gcc/doc/options.texi        2010-08-12 15:57:56.000000000 -0700
> +++ gcc-mainline/gcc/doc/options.texi   2010-08-13 13:25:47.000000000 -0700
> @@ -159,6 +159,12 @@ option handler.  @code{UInteger} should
>  @code{-falign-loops}=@var{n} are supported to make sure the saved
>  options are given a full integer.
>
> +@item NoDriverArg
> +For an option marked @code{Separate}, the option only takes an
> +argument in the compiler proper, not in the driver.  This is for
> +compatibility with existing options that are used both directly and
> +via @option{-Wp,}; new options should not have this property.
> +
>  @item Var(@var{var})
>  The state of this option should be stored in variable @var{var}.
>  The way that the state is stored depends on the type of option:
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/fortran/cpp.c gcc-mainline/gcc/fortran/cpp.c
> --- gcc-mainline-driveropts/gcc/fortran/cpp.c   2010-08-12 15:57:11.000000000 -0700
> +++ gcc-mainline/gcc/fortran/cpp.c      2010-08-13 13:21:52.000000000 -0700
> @@ -456,11 +456,11 @@ gfc_cpp_handle_option (size_t scode, con
>       gfc_cpp_option.deps = 1;
>       break;
>
> -    case OPT_MMDX:
> +    case OPT_MMD:
>       gfc_cpp_option.deps_skip_system = 1;
>       /* fall through */
>
> -    case OPT_MDX:
> +    case OPT_MD:
>       gfc_cpp_option.deps = 1;
>       gfc_cpp_option.deps_filename = arg;
>       break;
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/fortran/lang.opt gcc-mainline/gcc/fortran/lang.opt
> --- gcc-mainline-driveropts/gcc/fortran/lang.opt        2010-08-12 15:57:56.000000000 -0700
> +++ gcc-mainline/gcc/fortran/lang.opt   2010-08-13 13:21:25.000000000 -0700
> @@ -60,8 +60,8 @@ M
>  Fortran
>  ; Documented in C
>
> -MDX
> -Fortran Separate RejectDriver
> +MD
> +Fortran Separate NoArgDriver
>  ; Documented in C
>
>  MF
> @@ -76,8 +76,8 @@ MM
>  Fortran
>  ; Documented in C
>
> -MMDX
> -Fortran Separate RejectDriver
> +MMD
> +Fortran Separate NoArgDriver
>  ; Documented in C
>
>  MP
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/gcc.c gcc-mainline/gcc/gcc.c
> --- gcc-mainline-driveropts/gcc/gcc.c   2010-08-12 15:57:56.000000000 -0700
> +++ gcc-mainline/gcc/gcc.c      2010-08-13 13:22:41.000000000 -0700
> @@ -767,8 +767,8 @@ static const char *trad_capable_cpp =
>    file that happens to exist is up-to-date.  */
>  static const char *cpp_unique_options =
>  "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
> - %{MD:-MDX %{!o:%b.d}%{o*:%.d%*}}\
> - %{MMD:-MMDX %{!o:%b.d}%{o*:%.d%*}}\
> + %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
> + %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
>  %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
>  %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
>  %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/opt-functions.awk gcc-mainline/gcc/opt-functions.awk
> --- gcc-mainline-driveropts/gcc/opt-functions.awk       2010-08-12 15:57:56.000000000 -0700
> +++ gcc-mainline/gcc/opt-functions.awk  2010-08-13 13:23:45.000000000 -0700
> @@ -80,6 +80,7 @@ function switch_flags (flags)
>          test_flag("Target", flags, " | CL_TARGET") \
>          test_flag("Driver", flags, " | CL_DRIVER") \
>          test_flag("RejectDriver", flags, " | CL_REJECT_DRIVER") \
> +         test_flag("NoDriverArg", flags, " | CL_NO_DRIVER_ARG") \
>          test_flag("Save", flags, " | CL_SAVE") \
>          test_flag("Joined", flags, " | CL_JOINED") \
>          test_flag("JoinedOrMissing", flags, " | CL_JOINED | CL_MISSING_OK") \
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/opts-common.c gcc-mainline/gcc/opts-common.c
> --- gcc-mainline-driveropts/gcc/opts-common.c   2010-08-12 15:57:56.000000000 -0700
> +++ gcc-mainline/gcc/opts-common.c      2010-08-13 13:49:26.000000000 -0700
> @@ -145,6 +145,8 @@ decode_cmdline_option (const char **argv
>   char *p;
>   const struct cl_option *option;
>   int errors = 0;
> +  bool separate_arg_flag;
> +  bool joined_arg_flag;
>
>   opt = argv[0];
>
> @@ -186,8 +188,15 @@ decode_cmdline_option (const char **argv
>   if (option->flags & CL_DISABLED)
>     errors |= CL_ERR_DISABLED;
>
> +  /* Determine whether there may be a separate argument based on
> +     whether this option is being processed for the driver.  */
> +  separate_arg_flag = ((option->flags & CL_SEPARATE)
> +                      && !((option->flags & CL_NO_DRIVER_ARG)
> +                           && (lang_mask & CL_DRIVER)));
> +  joined_arg_flag = (option->flags & CL_JOINED) != 0;
> +
>   /* Sort out any argument the switch takes.  */
> -  if (option->flags & CL_JOINED)
> +  if (joined_arg_flag)
>     {
>       /* Have arg point to the original switch.  This is because
>         some code, such as disable_builtin_function, expects its
> @@ -198,7 +207,7 @@ decode_cmdline_option (const char **argv
>
>       if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
>        {
> -         if (option->flags & CL_SEPARATE)
> +         if (separate_arg_flag)
>            {
>              arg = argv[1];
>              result = 2;
> @@ -210,7 +219,7 @@ decode_cmdline_option (const char **argv
>            arg = NULL;
>        }
>     }
> -  else if (option->flags & CL_SEPARATE)
> +  else if (separate_arg_flag)
>     {
>       arg = argv[1];
>       result = 2;
> @@ -228,7 +237,7 @@ decode_cmdline_option (const char **argv
>        are specified.  */
>       errors |= CL_ERR_WRONG_LANG;
>
> -  if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
> +  if (arg == NULL && (separate_arg_flag || joined_arg_flag))
>     errors |= CL_ERR_MISSING_ARG;
>
>   /* If the switch takes an integer, convert it.  */
> diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/opts.h gcc-mainline/gcc/opts.h
> --- gcc-mainline-driveropts/gcc/opts.h  2010-08-12 15:57:56.000000000 -0700
> +++ gcc-mainline/gcc/opts.h     2010-08-13 13:30:01.000000000 -0700
> @@ -67,12 +67,12 @@ extern const unsigned int cl_options_cou
>  extern const char *const lang_names[];
>  extern const unsigned int cl_lang_count;
>
> -#define CL_PARAMS               (1 << 15) /* Fake entry.  Used to display --param info with --help.  */
> -#define CL_WARNING             (1 << 16) /* Enables an (optional) warning message.  */
> -#define CL_OPTIMIZATION                (1 << 17) /* Enables an (optional) optimization.  */
> -#define CL_DRIVER              (1 << 18) /* Driver option.  */
> -#define CL_TARGET              (1 << 19) /* Target-specific option.  */
> -#define CL_COMMON              (1 << 20) /* Language-independent.  */
> +#define CL_PARAMS               (1 << 14) /* Fake entry.  Used to display --param info with --help.  */
> +#define CL_WARNING             (1 << 15) /* Enables an (optional) warning message.  */
> +#define CL_OPTIMIZATION                (1 << 16) /* Enables an (optional) optimization.  */
> +#define CL_DRIVER              (1 << 17) /* Driver option.  */
> +#define CL_TARGET              (1 << 18) /* Target-specific option.  */
> +#define CL_COMMON              (1 << 19) /* Language-independent.  */
>
>  #define CL_MIN_OPTION_CLASS    CL_PARAMS
>  #define CL_MAX_OPTION_CLASS    CL_COMMON
> @@ -82,6 +82,7 @@ extern const unsigned int cl_lang_count;
>    This distinction is important because --help will not list options
>    which only have these higher bits set.  */
>
> +#define CL_NO_DRIVER_ARG       (1 << 20) /* Option takes no argument in the driver.  */
>  #define CL_REJECT_DRIVER       (1 << 21) /* Reject this option in the driver.  */
>  #define CL_SAVE                        (1 << 22) /* Target-specific option for attribute.  */
>  #define CL_DISABLED            (1 << 23) /* Disabled in this configuration.  */
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
>
Andrew Haley - Aug. 16, 2010, 9:20 a.m.
On 08/14/2010 01:37 PM, Richard Guenther wrote:
> On Sat, Aug 14, 2010 at 1:21 AM, Joseph S. Myers
> <joseph@codesourcery.com> wrote:
>> This patch, relative to a tree with
>> <http://gcc.gnu.org/ml/gcc-patches/2010-08/msg00949.html> (pending
>> Fortran and Java review) applied,

The Java part of that patch is OK.

Andrew.
Tobias Burnus - Aug. 16, 2010, 9:41 a.m.
On 08/14/2010 01:21 AM, Joseph S. Myers wrote:
> This patch, relative to a tree with
> <http://gcc.gnu.org/ml/gcc-patches/2010-08/msg00949.html>  (pending
> Fortran and Java review) applied, arranges for -MD and -MMD to be
> supported by both the driver and cc1 with different conventions about
> whether those options take an argument, for compatibility with the
> "several projects that rely on -Wp,-MD or -Wp,-MMD" mentioned in
> <http://gcc.gnu.org/ml/gcc/2010-08/msg00220.html>.
>
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
> commit?
>
> fortran:
> 2010-08-13  Joseph Myers<joseph@codesourcery.com>
>
> 	* lang.opt (MDX): Change back to MD.  Mark NoDriverArg instead of
> 	RejectDriver.
> 	(MMDX): Change back to MMD.  Mark NoDriverArg instead of
> 	RejectDriver.
> 	* cpp.c (gfc_cpp_handle_option): Use OPT_MD and OPT_MMD instead of
> 	OPT_MDX and OPT_MMDX.


That part is OK - thanks for the patch and for taking user concerns into 
account.

Tobias

PS: Please CC fortran@ if you request Fortran reviews, it increases the 
chance of faster review.

Patch

diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/c-family/c-opts.c gcc-mainline/gcc/c-family/c-opts.c
--- gcc-mainline-driveropts/gcc/c-family/c-opts.c	2010-08-12 15:57:01.000000000 -0700
+++ gcc-mainline/gcc/c-family/c-opts.c	2010-08-13 13:22:33.000000000 -0700
@@ -398,9 +398,9 @@  c_common_handle_option (size_t scode, co
       flag_no_output = 1;
       break;
 
-    case OPT_MDX:
-    case OPT_MMDX:
-      cpp_opts->deps.style = (code == OPT_MDX ? DEPS_SYSTEM: DEPS_USER);
+    case OPT_MD:
+    case OPT_MMD:
+      cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
       cpp_opts->deps.need_preprocessor_output = true;
       deps_file = arg;
       break;
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/c-family/c.opt gcc-mainline/gcc/c-family/c.opt
--- gcc-mainline-driveropts/gcc/c-family/c.opt	2010-08-12 15:57:56.000000000 -0700
+++ gcc-mainline/gcc/c-family/c.opt	2010-08-13 13:22:58.000000000 -0700
@@ -72,9 +72,9 @@  M
 C ObjC C++ ObjC++
 Generate make dependencies
 
-MDX
-C ObjC C++ ObjC++ RejectDriver Separate MissingArgError(missing filename after %qs)
--MD	Generate make dependencies and compile
+MD
+C ObjC C++ ObjC++ NoDriverArg Separate MissingArgError(missing filename after %qs)
+Generate make dependencies and compile
 
 MF
 C ObjC C++ ObjC++ Joined Separate MissingArgError(missing filename after %qs)
@@ -88,9 +88,9 @@  MM
 C ObjC C++ ObjC++
 Like -M but ignore system header files
 
-MMDX
-C ObjC C++ ObjC++ RejectDriver Separate MissingArgError(missing filename after %qs)
--MMD	Like -MD but ignore system header files
+MMD
+C ObjC C++ ObjC++ NoDriverArg Separate MissingArgError(missing filename after %qs)
+Like -MD but ignore system header files
 
 MP
 C ObjC C++ ObjC++
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/doc/options.texi gcc-mainline/gcc/doc/options.texi
--- gcc-mainline-driveropts/gcc/doc/options.texi	2010-08-12 15:57:56.000000000 -0700
+++ gcc-mainline/gcc/doc/options.texi	2010-08-13 13:25:47.000000000 -0700
@@ -159,6 +159,12 @@  option handler.  @code{UInteger} should 
 @code{-falign-loops}=@var{n} are supported to make sure the saved
 options are given a full integer.
 
+@item NoDriverArg
+For an option marked @code{Separate}, the option only takes an
+argument in the compiler proper, not in the driver.  This is for
+compatibility with existing options that are used both directly and
+via @option{-Wp,}; new options should not have this property.
+
 @item Var(@var{var})
 The state of this option should be stored in variable @var{var}.
 The way that the state is stored depends on the type of option:
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/fortran/cpp.c gcc-mainline/gcc/fortran/cpp.c
--- gcc-mainline-driveropts/gcc/fortran/cpp.c	2010-08-12 15:57:11.000000000 -0700
+++ gcc-mainline/gcc/fortran/cpp.c	2010-08-13 13:21:52.000000000 -0700
@@ -456,11 +456,11 @@  gfc_cpp_handle_option (size_t scode, con
       gfc_cpp_option.deps = 1;
       break;
 
-    case OPT_MMDX:
+    case OPT_MMD:
       gfc_cpp_option.deps_skip_system = 1;
       /* fall through */
 
-    case OPT_MDX:
+    case OPT_MD:
       gfc_cpp_option.deps = 1;
       gfc_cpp_option.deps_filename = arg;
       break;
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/fortran/lang.opt gcc-mainline/gcc/fortran/lang.opt
--- gcc-mainline-driveropts/gcc/fortran/lang.opt	2010-08-12 15:57:56.000000000 -0700
+++ gcc-mainline/gcc/fortran/lang.opt	2010-08-13 13:21:25.000000000 -0700
@@ -60,8 +60,8 @@  M
 Fortran
 ; Documented in C
 
-MDX
-Fortran Separate RejectDriver
+MD
+Fortran Separate NoArgDriver
 ; Documented in C
 
 MF
@@ -76,8 +76,8 @@  MM
 Fortran
 ; Documented in C
 
-MMDX
-Fortran Separate RejectDriver
+MMD
+Fortran Separate NoArgDriver
 ; Documented in C
 
 MP
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/gcc.c gcc-mainline/gcc/gcc.c
--- gcc-mainline-driveropts/gcc/gcc.c	2010-08-12 15:57:56.000000000 -0700
+++ gcc-mainline/gcc/gcc.c	2010-08-13 13:22:41.000000000 -0700
@@ -767,8 +767,8 @@  static const char *trad_capable_cpp =
    file that happens to exist is up-to-date.  */
 static const char *cpp_unique_options =
 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
- %{MD:-MDX %{!o:%b.d}%{o*:%.d%*}}\
- %{MMD:-MMDX %{!o:%b.d}%{o*:%.d%*}}\
+ %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
+ %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
  %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
  %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
  %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/opt-functions.awk gcc-mainline/gcc/opt-functions.awk
--- gcc-mainline-driveropts/gcc/opt-functions.awk	2010-08-12 15:57:56.000000000 -0700
+++ gcc-mainline/gcc/opt-functions.awk	2010-08-13 13:23:45.000000000 -0700
@@ -80,6 +80,7 @@  function switch_flags (flags)
 	  test_flag("Target", flags, " | CL_TARGET") \
 	  test_flag("Driver", flags, " | CL_DRIVER") \
 	  test_flag("RejectDriver", flags, " | CL_REJECT_DRIVER") \
+	  test_flag("NoDriverArg", flags, " | CL_NO_DRIVER_ARG") \
 	  test_flag("Save", flags, " | CL_SAVE") \
 	  test_flag("Joined", flags, " | CL_JOINED") \
 	  test_flag("JoinedOrMissing", flags, " | CL_JOINED | CL_MISSING_OK") \
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/opts-common.c gcc-mainline/gcc/opts-common.c
--- gcc-mainline-driveropts/gcc/opts-common.c	2010-08-12 15:57:56.000000000 -0700
+++ gcc-mainline/gcc/opts-common.c	2010-08-13 13:49:26.000000000 -0700
@@ -145,6 +145,8 @@  decode_cmdline_option (const char **argv
   char *p;
   const struct cl_option *option;
   int errors = 0;
+  bool separate_arg_flag;
+  bool joined_arg_flag;
 
   opt = argv[0];
 
@@ -186,8 +188,15 @@  decode_cmdline_option (const char **argv
   if (option->flags & CL_DISABLED)
     errors |= CL_ERR_DISABLED;
 
+  /* Determine whether there may be a separate argument based on
+     whether this option is being processed for the driver.  */
+  separate_arg_flag = ((option->flags & CL_SEPARATE)
+		       && !((option->flags & CL_NO_DRIVER_ARG)
+			    && (lang_mask & CL_DRIVER)));
+  joined_arg_flag = (option->flags & CL_JOINED) != 0;
+
   /* Sort out any argument the switch takes.  */
-  if (option->flags & CL_JOINED)
+  if (joined_arg_flag)
     {
       /* Have arg point to the original switch.  This is because
 	 some code, such as disable_builtin_function, expects its
@@ -198,7 +207,7 @@  decode_cmdline_option (const char **argv
 
       if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
 	{
-	  if (option->flags & CL_SEPARATE)
+	  if (separate_arg_flag)
 	    {
 	      arg = argv[1];
 	      result = 2;
@@ -210,7 +219,7 @@  decode_cmdline_option (const char **argv
 	    arg = NULL;
 	}
     }
-  else if (option->flags & CL_SEPARATE)
+  else if (separate_arg_flag)
     {
       arg = argv[1];
       result = 2;
@@ -228,7 +237,7 @@  decode_cmdline_option (const char **argv
        are specified.  */
       errors |= CL_ERR_WRONG_LANG;
 
-  if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
+  if (arg == NULL && (separate_arg_flag || joined_arg_flag))
     errors |= CL_ERR_MISSING_ARG;
 
   /* If the switch takes an integer, convert it.  */
diff -rupN --exclude=.svn gcc-mainline-driveropts/gcc/opts.h gcc-mainline/gcc/opts.h
--- gcc-mainline-driveropts/gcc/opts.h	2010-08-12 15:57:56.000000000 -0700
+++ gcc-mainline/gcc/opts.h	2010-08-13 13:30:01.000000000 -0700
@@ -67,12 +67,12 @@  extern const unsigned int cl_options_cou
 extern const char *const lang_names[];
 extern const unsigned int cl_lang_count;
 
-#define CL_PARAMS               (1 << 15) /* Fake entry.  Used to display --param info with --help.  */
-#define CL_WARNING		(1 << 16) /* Enables an (optional) warning message.  */
-#define CL_OPTIMIZATION		(1 << 17) /* Enables an (optional) optimization.  */
-#define CL_DRIVER		(1 << 18) /* Driver option.  */
-#define CL_TARGET		(1 << 19) /* Target-specific option.  */
-#define CL_COMMON		(1 << 20) /* Language-independent.  */
+#define CL_PARAMS               (1 << 14) /* Fake entry.  Used to display --param info with --help.  */
+#define CL_WARNING		(1 << 15) /* Enables an (optional) warning message.  */
+#define CL_OPTIMIZATION		(1 << 16) /* Enables an (optional) optimization.  */
+#define CL_DRIVER		(1 << 17) /* Driver option.  */
+#define CL_TARGET		(1 << 18) /* Target-specific option.  */
+#define CL_COMMON		(1 << 19) /* Language-independent.  */
 
 #define CL_MIN_OPTION_CLASS	CL_PARAMS
 #define CL_MAX_OPTION_CLASS	CL_COMMON
@@ -82,6 +82,7 @@  extern const unsigned int cl_lang_count;
    This distinction is important because --help will not list options
    which only have these higher bits set.  */
 
+#define CL_NO_DRIVER_ARG	(1 << 20) /* Option takes no argument in the driver.  */
 #define CL_REJECT_DRIVER	(1 << 21) /* Reject this option in the driver.  */
 #define CL_SAVE			(1 << 22) /* Target-specific option for attribute.  */
 #define CL_DISABLED		(1 << 23) /* Disabled in this configuration.  */