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