Index: gcc/doc/options.texi
===================================================================
--- gcc/doc/options.texi	(revision 163669)
+++ gcc/doc/options.texi	(working copy)
@@ -247,6 +247,32 @@ The main purpose of this property is to 
 The first option should use @samp{Mask(@var{name})} and the others
 should use @samp{Mask(@var{name}) MaskExists}.
 
+@item Alias(@var{opt})
+@itemx Alias(@var{opt}, @var{arg})
+@itemx Alias(@var{opt}, @var{posarg}, @var{negarg})
+The option is an alias for @option{-@var{opt}}.  In the first form,
+any argument passed to the alias is considered to be passed to
+@option{-@var{opt}}, and @option{-@var{opt}} is considered to be
+negated if the alias is used in negated form.  In the second form, the
+alias may not be negated or have an argument, and @var{posarg} is
+considered to be passed as an argument to @option{-@var{opt}}.  In the
+third form, the alias may not have an argument, if the alias is used
+in the positive form then @var{posarg} is considered to be passed to
+@option{-@var{opt}}, and if the alias is used in the negative form
+then @var{negarg} is considered to be passed to @option{-@var{opt}}.
+
+Aliases should not specify @code{Var} or @code{Mask} or
+@code{UInteger}.  Aliases should normally specify the same languages
+as the target of the alias; the flags on the target will be used to
+determine any diagnostic for use of an option for the wrong language,
+while those on the alias will be used to identify what command-line
+text is the option and what text is any argument to that option.
+
+When an @code{Alias} definition is used for an option, driver specs do
+not need to handle it and no @samp{OPT_} enumeration value is defined
+for it; only the canonical form of the option will be seen in those
+places.
+
 @item Report
 The state of the option should be printed by @option{-fverbose-asm}.
 
Index: gcc/opts-common.c
===================================================================
--- gcc/opts-common.c	(revision 163669)
+++ gcc/opts-common.c	(working copy)
@@ -144,6 +144,58 @@ option_ok_for_language (const struct cl_
   return true;
 }
 
+
+/* Fill in the canonical option part of *DECODED with an option
+   described by OPT_INDEX, ARG and VALUE.  */
+
+static void
+generate_canonical_option (size_t opt_index, const char *arg, int value,
+			   struct cl_decoded_option *decoded)
+{
+  const struct cl_option *option = &cl_options[opt_index];
+  const char *opt_text = option->opt_text;
+
+  if (value == 0
+      && !(option->flags & CL_REJECT_NEGATIVE)
+      && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm'))
+    {
+      char *t = XNEWVEC (char, option->opt_len + 5);
+      t[0] = '-';
+      t[1] = opt_text[1];
+      t[2] = 'n';
+      t[3] = 'o';
+      t[4] = '-';
+      memcpy (t + 5, opt_text + 2, option->opt_len);
+      opt_text = t;
+    }
+
+  decoded->canonical_option[2] = NULL;
+  decoded->canonical_option[3] = NULL;
+
+  if (arg)
+    {
+      if (option->flags & CL_SEPARATE)
+	{
+	  decoded->canonical_option[0] = opt_text;
+	  decoded->canonical_option[1] = arg;
+	  decoded->canonical_option_num_elements = 2;
+	}
+      else
+	{
+	  gcc_assert (option->flags & CL_JOINED);
+	  decoded->canonical_option[0] = concat (opt_text, arg, NULL);
+	  decoded->canonical_option[1] = NULL;
+	  decoded->canonical_option_num_elements = 1;
+	}
+    }
+  else
+    {
+      decoded->canonical_option[0] = opt_text;
+      decoded->canonical_option[1] = NULL;
+      decoded->canonical_option_num_elements = 1;
+    }
+}
+
 /* Decode the switch beginning at ARGV for the language indicated by
    LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
    the structure *DECODED.  Returns the number of switches
@@ -245,13 +297,64 @@ decode_cmdline_option (const char **argv
 	result = 1;
     }
 
+  if (arg == NULL && (separate_arg_flag || joined_arg_flag))
+    errors |= CL_ERR_MISSING_ARG;
+
+  /* Is this option an alias?  */
+  if (option->alias_target != N_OPTS)
+    {
+      size_t new_opt_index = option->alias_target;
+      const struct cl_option *new_option = &cl_options[new_opt_index];
+
+      /* The new option must not be an alias itself.  */
+      gcc_assert (new_option->alias_target == N_OPTS);
+
+      if (option->neg_alias_arg)
+	{
+	  gcc_assert (option->alias_arg != NULL);
+	  gcc_assert (arg == NULL);
+	  if (value)
+	    arg = option->alias_arg;
+	  else
+	    arg = option->neg_alias_arg;
+	  value = 1;
+	}
+      else if (option->alias_arg)
+	{
+	  gcc_assert (value == 1);
+	  gcc_assert (arg == NULL);
+	  arg = option->alias_arg;
+	}
+
+      opt_index = new_opt_index;
+      option = new_option;
+
+      if (value == 0)
+	gcc_assert (!(option->flags & CL_REJECT_NEGATIVE));
+
+      /* Recompute what arguments are allowed.  */
+      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;
+
+      if (!(errors & CL_ERR_MISSING_ARG))
+	{
+	  if (separate_arg_flag || joined_arg_flag)
+	    gcc_assert (arg != NULL);
+	  else
+	    gcc_assert (arg == NULL);
+	}
+
+      /* Recheck for disabled options.  */
+      if (option->flags & CL_DISABLED)
+	errors |= CL_ERR_DISABLED;
+    }
+
   /* Check if this is a switch for a different front end.  */
   if (!option_ok_for_language (option, lang_mask))
     errors |= CL_ERR_WRONG_LANG;
 
-  if (arg == NULL && (separate_arg_flag || joined_arg_flag))
-    errors |= CL_ERR_MISSING_ARG;
-
   /* If the switch takes an integer, convert it.  */
   if (arg && (option->flags & CL_UINTEGER))
     {
@@ -296,12 +399,17 @@ decode_cmdline_option (const char **argv
     {
       if (i < result)
 	{
-	  decoded->canonical_option[i] = argv[i];
+	  if (opt_index == OPT_SPECIAL_unknown)
+	    decoded->canonical_option[i] = argv[i];
+	  else
+	    decoded->canonical_option[i] = NULL;
 	  total_len += strlen (argv[i]) + 1;
 	}
       else
 	decoded->canonical_option[i] = NULL;
     }
+  if (opt_index != OPT_SPECIAL_unknown)
+    generate_canonical_option (opt_index, arg, value, decoded);
   decoded->orig_option_with_args_text = p = XNEWVEC (char, total_len);
   for (i = 0; i < result; i++)
     {
@@ -571,39 +679,26 @@ generate_option (size_t opt_index, const
 
   decoded->opt_index = opt_index;
   decoded->arg = arg;
-  decoded->canonical_option[2] = NULL;
-  decoded->canonical_option[3] = NULL;
   decoded->value = value;
   decoded->errors = (option_ok_for_language (option, lang_mask)
 		     ? 0
 		     : CL_ERR_WRONG_LANG);
 
-  if (arg)
+  generate_canonical_option (opt_index, arg, value, decoded);
+  switch (decoded->canonical_option_num_elements)
     {
-      if (option->flags & CL_SEPARATE)
-	{
-	  decoded->orig_option_with_args_text = concat (option->opt_text, " ",
-							arg, NULL);
-	  decoded->canonical_option[0] = option->opt_text;
-	  decoded->canonical_option[1] = arg;
-	  decoded->canonical_option_num_elements = 2;
-	}
-      else
-	{
-	  gcc_assert (option->flags & CL_JOINED);
-	  decoded->orig_option_with_args_text = concat (option->opt_text, arg,
-							NULL);
-	  decoded->canonical_option[0] = decoded->orig_option_with_args_text;
-	  decoded->canonical_option[1] = NULL;
-	  decoded->canonical_option_num_elements = 1;
-	}
-    }
-  else
-    {
-      decoded->orig_option_with_args_text = option->opt_text;
-      decoded->canonical_option[0] = option->opt_text;
-      decoded->canonical_option[1] = NULL;
-      decoded->canonical_option_num_elements = 1;
+    case 1:
+      decoded->orig_option_with_args_text = decoded->canonical_option[0];
+      break;
+
+    case 2:
+      decoded->orig_option_with_args_text
+	= concat (decoded->canonical_option[0], " ",
+		  decoded->canonical_option[1], NULL);
+      break;
+
+    default:
+      gcc_unreachable ();
     }
 }
 
Index: gcc/c-family/c.opt
===================================================================
--- gcc/c-family/c.opt	(revision 163669)
+++ gcc/c-family/c.opt	(working copy)
@@ -164,7 +164,7 @@ C ObjC C++ ObjC++ Warning
 Warn about possibly nested block comments, and C++ comments spanning more than one physical line
 
 Wcomments
-C ObjC C++ ObjC++ Warning
+C ObjC C++ ObjC++ Warning Alias(Wcomment)
 Synonym for -Wcomment
 
 Wconversion
@@ -216,7 +216,7 @@ C ObjC C++ ObjC++
 ; Documented in common.opt
 
 Werror-implicit-function-declaration
-C ObjC RejectNegative Warning
+C ObjC RejectNegative Warning Alias(Werror=, implicit-function-declaration)
 This switch is deprecated; use -Werror=implicit-function-declaration instead
 
 Wfloat-equal
@@ -804,7 +804,7 @@ C ObjC C++ ObjC++ Joined RejectNegative 
 -ftabstop=<number>	Distance between tab stops for column reporting
 
 ftemplate-depth-
-C++ ObjC++ Joined RejectNegative UInteger Undocumented
+C++ ObjC++ Joined RejectNegative Undocumented Alias(ftemplate-depth=)
 
 ftemplate-depth=
 C++ ObjC++ Joined RejectNegative UInteger
@@ -972,7 +972,7 @@ C ObjC
 Conform to the ISO 201X C standard draft (experimental and incomplete support)
 
 std=c89
-C ObjC
+C ObjC Alias(std=c90)
 Conform to the ISO 1990 C standard
 
 std=c90
@@ -984,7 +984,7 @@ C ObjC
 Conform to the ISO 1999 C standard
 
 std=c9x
-C ObjC
+C ObjC Alias(std=c99)
 Deprecated in favor of -std=c99
 
 std=gnu++98
@@ -1003,7 +1003,7 @@ C ObjC
 Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)
 
 std=gnu89
-C ObjC
+C ObjC Alias(std=gnu90)
 Conform to the ISO 1990 C standard with GNU extensions
 
 std=gnu90
@@ -1015,11 +1015,11 @@ C ObjC
 Conform to the ISO 1999 C standard with GNU extensions
 
 std=gnu9x
-C ObjC
+C ObjC Alias(std=gnu99)
 Deprecated in favor of -std=gnu99
 
 std=iso9899:1990
-C ObjC
+C ObjC Alias(std=c90)
 Conform to the ISO 1990 C standard
 
 std=iso9899:199409
@@ -1027,11 +1027,11 @@ C ObjC
 Conform to the ISO 1990 C standard as amended in 1994
 
 std=iso9899:1999
-C ObjC
+C ObjC Alias(std=c99)
 Conform to the ISO 1999 C standard
 
 std=iso9899:199x
-C ObjC
+C ObjC Alias(std=c99)
 Deprecated in favor of -std=iso9899:1999
 
 traditional-cpp
Index: gcc/c-family/c-opts.c
===================================================================
--- gcc/c-family/c-opts.c	(revision 163669)
+++ gcc/c-family/c-opts.c	(working copy)
@@ -161,7 +161,6 @@ warning_as_error_callback (int option_in
 	break;
 
       case OPT_Wcomment:
-      case OPT_Wcomments:
 	cpp_opts->warn_comments = 1;
 	break;
 
@@ -493,7 +492,6 @@ c_common_handle_option (size_t scode, co
       break;
 
     case OPT_Wcomment:
-    case OPT_Wcomments:
       cpp_opts->warn_comments = value;
       break;
 
@@ -521,13 +519,6 @@ c_common_handle_option (size_t scode, co
       global_dc->warning_as_error_requested = value;
       break;
 
-    case OPT_Werror_implicit_function_declaration:
-      /* For backward compatibility, this is the same as
-	 -Werror=implicit-function-declaration.  */
-      enable_warning_as_error ("implicit-function-declaration", value,
-			       CL_C | CL_ObjC, handlers);
-      break;
-
     case OPT_Wformat:
       set_Wformat (value);
       break;
@@ -752,8 +743,6 @@ c_common_handle_option (size_t scode, co
       break;
 
     case OPT_ftemplate_depth_:
-      /* Kept for backwards compatibility.  */
-    case OPT_ftemplate_depth_eq:
       max_tinst_depth = value;
       break;
 
@@ -865,30 +854,23 @@ c_common_handle_option (size_t scode, co
 	set_std_cxx0x (code == OPT_std_c__0x /* ISO */);
       break;
 
-    case OPT_std_c89:
     case OPT_std_c90:
-    case OPT_std_iso9899_1990:
     case OPT_std_iso9899_199409:
       if (!preprocessing_asm_p)
 	set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
       break;
 
-    case OPT_std_gnu89:
     case OPT_std_gnu90:
       if (!preprocessing_asm_p)
 	set_std_c89 (false /* c94 */, false /* ISO */);
       break;
 
     case OPT_std_c99:
-    case OPT_std_c9x:
-    case OPT_std_iso9899_1999:
-    case OPT_std_iso9899_199x:
       if (!preprocessing_asm_p)
 	set_std_c99 (true /* ISO */);
       break;
 
     case OPT_std_gnu99:
-    case OPT_std_gnu9x:
       if (!preprocessing_asm_p)
 	set_std_c99 (false /* ISO */);
       break;
Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c	(revision 163669)
+++ gcc/c-family/c-common.c	(working copy)
@@ -8150,7 +8150,7 @@ struct reason_option_codes_t
 
 static const struct reason_option_codes_t option_codes[] = {
   {CPP_W_DEPRECATED,			OPT_Wdeprecated},
-  {CPP_W_COMMENTS,			OPT_Wcomments},
+  {CPP_W_COMMENTS,			OPT_Wcomment},
   {CPP_W_TRIGRAPHS,			OPT_Wtrigraphs},
   {CPP_W_MULTICHAR,			OPT_Wmultichar},
   {CPP_W_TRADITIONAL,			OPT_Wtraditional},
Index: gcc/java/jvspec.c
===================================================================
--- gcc/java/jvspec.c	(revision 163669)
+++ gcc/java/jvspec.c	(working copy)
@@ -69,7 +69,7 @@ static const char jvgenmain_spec[] =
 		   %<fuse-boehm-gc %<fhash-synchronization %<fjni\
 		   %<findirect-dispatch %<fnew-verifier\
 		   %<fno-store-check %<foutput-class-dir\
-		   %<fclasspath* %<fCLASSPATH* %<fbootclasspath*\
+		   %<fclasspath* %<fbootclasspath*\
 		   %<fextdirs*\
 		   %<fuse-divide-subroutine %<fno-use-divide-subroutine\
 		   %<fuse-atomic-builtins %<fno-use-atomic-builtins\
@@ -299,10 +299,8 @@ lang_specific_driver (struct cl_decoded_
 	  saw_o = 1;
 	  break;
 
-	case OPT_classpath:
-	case OPT_bootclasspath:
-	case OPT_CLASSPATH:
-	case OPT_encoding:
+	case OPT_fclasspath_:
+	case OPT_fbootclasspath_:
 	case OPT_extdirs:
 	  added -= 1;
 	  break;
@@ -514,15 +512,11 @@ lang_specific_driver (struct cl_decoded_
 	  --j;
 	  continue;
 
-	case OPT_classpath:
-	case OPT_CLASSPATH:
-	case OPT_fCLASSPATH_:
 	case OPT_fclasspath_:
 	  jcf_path_classpath_arg (decoded_options[i].arg);
 	  --j;
 	  continue;
 
-	case OPT_bootclasspath:
 	case OPT_fbootclasspath_:
 	  jcf_path_bootclasspath_arg (decoded_options[i].arg);
 	  --j;
@@ -533,11 +527,6 @@ lang_specific_driver (struct cl_decoded_
 	  --j;
 	  continue;
 
-	case OPT_encoding:
-	  generate_option (OPT_fencoding_, decoded_options[i].arg, 1,
-			   CL_DRIVER, &new_decoded_options[j]);
-	  continue;
-
 	case OPT_L:
 	  if (spec_file == NULL)
 	    spec_file = find_spec_file (decoded_options[i].arg);
Index: gcc/java/lang.opt
===================================================================
--- gcc/java/lang.opt	(revision 163669)
+++ gcc/java/lang.opt	(working copy)
@@ -29,7 +29,7 @@ Driver
 ; Java driver option in fact distinct from C-family option with the same name.
 
 CLASSPATH
-Driver Separate
+Java Separate Alias(fclasspath=)
 
 D
 Driver Joined Separate
@@ -88,19 +88,19 @@ Java Var(flag_redundant)
 Warn if modifiers are specified when not necessary
 
 bootclasspath
-Driver Separate
+Java Separate Alias(fbootclasspath=)
 
 classpath
-Driver Separate
+Java Separate Alias(fclasspath=)
 
 encoding
-Driver Separate
+Java Separate Alias(fencoding=)
 
 extdirs
 Driver Separate
 
 fCLASSPATH=
-Java JoinedOrMissing RejectNegative
+Java JoinedOrMissing RejectNegative Alias(fclasspath=)
 --CLASSPATH	Deprecated; use --classpath instead
 
 faux-classpath
Index: gcc/java/lang.c
===================================================================
--- gcc/java/lang.c	(revision 163669)
+++ gcc/java/lang.c	(working copy)
@@ -261,7 +261,6 @@ java_handle_option (size_t scode, const 
 
     case OPT_faux_classpath:
     case OPT_fclasspath_:
-    case OPT_fCLASSPATH_:
       jcf_path_classpath_arg (arg);
       break;
 
Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c	(revision 163669)
+++ gcc/gcc.c	(working copy)
@@ -3742,6 +3742,12 @@ driver_handle_option (const struct cl_de
       do_save = false;
       break;
 
+    case OPT_L:
+      /* Similarly, canonicalize -L for linkers that may not accept
+	 separate arguments.  */
+      save_switch (concat ("-L", arg, NULL), 0, NULL, validated);
+      return true;
+
     case OPT_save_temps:
       save_temps_flag = SAVE_TEMPS_CWD;
       validated = true;
@@ -3772,7 +3778,6 @@ driver_handle_option (const struct cl_de
 	 processing.  */
       break;
 
-    case OPT_specs:
     case OPT_specs_:
       {
 	struct user_specs *user = XNEW (struct user_specs);
Index: gcc/testsuite/gcc.dg/cpp/warn-comments-2.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/warn-comments-2.c	(revision 163669)
+++ gcc/testsuite/gcc.dg/cpp/warn-comments-2.c	(working copy)
@@ -1,7 +1,7 @@
 // { dg-do preprocess }
 // { dg-options "-std=gnu99 -fdiagnostics-show-option -Werror=comments" }
 /* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */
-/* /* */  // { dg-error "\"\.\*\" within comment .-Werror=comments." }
+/* /* */  // { dg-error "\"\.\*\" within comment .-Werror=comment." }
 
 // \
-          // { dg-error "multi-line comment .-Werror=comments." "multi-line" { target *-*-* } 6 }
+          // { dg-error "multi-line comment .-Werror=comment." "multi-line" { target *-*-* } 6 }
Index: gcc/testsuite/gcc.dg/cpp/warn-comments-3.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/warn-comments-3.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/warn-comments-3.c	(revision 0)
@@ -0,0 +1,7 @@
+// { dg-do preprocess }
+// { dg-options "-std=gnu99 -fdiagnostics-show-option -Werror=comment" }
+/* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */
+/* /* */  // { dg-error "\"\.\*\" within comment .-Werror=comment." }
+
+// \
+          // { dg-error "multi-line comment .-Werror=comment." "multi-line" { target *-*-* } 6 }
Index: gcc/testsuite/gcc.dg/cpp/warn-comments.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/warn-comments.c	(revision 163669)
+++ gcc/testsuite/gcc.dg/cpp/warn-comments.c	(working copy)
@@ -1,7 +1,7 @@
 // { dg-do preprocess }
 // { dg-options "-std=gnu99 -fdiagnostics-show-option -Wcomments" }
 
-/* /* */  // { dg-warning "\"\.\*\" within comment .-Wcomments." }
+/* /* */  // { dg-warning "\"\.\*\" within comment .-Wcomment." }
 
 // \
-          // { dg-warning "multi-line comment .-Wcomments." "multi-line" { target *-*-* } 6 }
+          // { dg-warning "multi-line comment .-Wcomment." "multi-line" { target *-*-* } 6 }
Index: gcc/opts.c
===================================================================
--- gcc/opts.c	(revision 163669)
+++ gcc/opts.c	(working copy)
@@ -1598,11 +1598,6 @@ common_handle_option (const struct cl_de
       break;
 
     case OPT_Wlarger_than_:
-      /* This form corresponds to -Wlarger-than-.
-	 Kept for backward compatibility.
-	 Don't use it as the first argument of warning().  */
-
-    case OPT_Wlarger_than_eq:
       larger_than_size = value;
       warn_larger_than = value != -1;
       break;
@@ -1643,7 +1638,6 @@ common_handle_option (const struct cl_de
       break;
 
     case OPT_aux_info:
-    case OPT_aux_info_:
       aux_info_file_name = arg;
       flag_gen_aux_info = 1;
       break;
@@ -1754,7 +1748,6 @@ common_handle_option (const struct cl_de
       break;
 
     case OPT_finline_limit_:
-    case OPT_finline_limit_eq:
       set_param_value ("max-inline-insns-single", value / 2);
       set_param_value ("max-inline-insns-auto", value / 2);
       break;
@@ -1943,18 +1936,6 @@ common_handle_option (const struct cl_de
 	warning (0, "unknown stack check parameter \"%s\"", arg);
       break;
 
-    case OPT_fstack_check:
-      /* This is the same as the "specific" mode above.  */
-      if (value)
-	flag_stack_check = STACK_CHECK_BUILTIN
-			   ? FULL_BUILTIN_STACK_CHECK
-			   : STACK_CHECK_STATIC_BUILTIN
-			     ? STATIC_BUILTIN_STACK_CHECK
-			     : GENERIC_STACK_CHECK;
-      else
-	flag_stack_check = NO_STACK_CHECK;
-      break;
-
     case OPT_fstack_limit:
       /* The real switch is -fno-stack-limit.  */
       if (value)
@@ -2373,8 +2354,11 @@ enable_warning_as_error (const char *arg
     }
   else
     {
+      const struct cl_option *option = &cl_options[option_index];
       const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
 
+      if (option->alias_target != N_OPTS)
+	option_index = option->alias_target;
       diagnostic_classify_diagnostic (global_dc, option_index, kind,
 				      UNKNOWN_LOCATION);
       if (kind == DK_ERROR)
Index: gcc/opts.h
===================================================================
--- gcc/opts.h	(revision 163669)
+++ gcc/opts.h	(working copy)
@@ -45,6 +45,9 @@ struct cl_option
   const char *opt_text;
   const char *help;
   const char *missing_argument_error;
+  const char *alias_arg;
+  const char *neg_alias_arg;
+  unsigned short alias_target;
   unsigned short back_chain;
   unsigned char opt_len;
   int neg_index;
Index: gcc/optc-gen.awk
===================================================================
--- gcc/optc-gen.awk	(revision 163669)
+++ gcc/optc-gen.awk	(working copy)
@@ -201,6 +201,36 @@ for (i = 0; i < n_opts; i++) {
 	else
 		missing_arg_error = quote missing_arg_error quote
 
+	alias_arg = opt_args("Alias", flags[i])
+	if (alias_arg == "") {
+		alias_data = "NULL, NULL, N_OPTS"
+	} else {
+		alias_opt = nth_arg(0, alias_arg)
+		alias_posarg = nth_arg(1, alias_arg)
+		alias_negarg = nth_arg(2, alias_arg)
+
+		if (var_ref(opts[i], flags[i]) != "0")
+			print "#error Alias setting variable"
+
+		if (alias_posarg != "" && alias_negarg == "") {
+			if (!flag_set_p("RejectNegative", flags[i]) \
+			    && opts[i] ~ "^[Wfm]")
+				print "#error Alias with single argument " \
+					"allowing negative form"
+		}
+
+		alias_opt = opt_enum(alias_opt)
+		if (alias_posarg == "")
+			alias_posarg = "NULL"
+		else
+			alias_posarg = quote alias_posarg quote
+		if (alias_negarg == "")
+			alias_negarg = "NULL"
+		else
+			alias_negarg = quote alias_negarg quote
+		alias_data = alias_posarg ", " alias_negarg ", " alias_opt
+	}
+
 	neg = opt_args("Negative", flags[i]);
 	if (neg != "")
 		idx = indices[neg]
@@ -216,9 +246,9 @@ for (i = 0; i < n_opts; i++) {
 	}
 	# Split the printf after %u to work around an ia64-hp-hpux11.23
 	# awk bug.
-	printf("  { %c-%s%c,\n    %s,\n    %s,\n    %s, %u,",
+	printf("  { %c-%s%c,\n    %s,\n    %s,\n    %s, %s, %u,",
 	       quote, opts[i], quote, hlp, missing_arg_error,
-	       back_chain[i], len)
+	       alias_data, back_chain[i], len)
 	printf(" %d,\n", idx)
 	condition = opt_args("Condition", flags[i])
 	cl_flags = switch_flags(flags[i])
Index: gcc/stor-layout.c
===================================================================
--- gcc/stor-layout.c	(revision 163669)
+++ gcc/stor-layout.c	(working copy)
@@ -675,9 +675,9 @@ layout_decl (tree decl, unsigned int kno
 	  int size_as_int = TREE_INT_CST_LOW (size);
 
 	  if (compare_tree_int (size, size_as_int) == 0)
-	    warning (OPT_Wlarger_than_eq, "size of %q+D is %d bytes", decl, size_as_int);
+	    warning (OPT_Wlarger_than_, "size of %q+D is %d bytes", decl, size_as_int);
 	  else
-	    warning (OPT_Wlarger_than_eq, "size of %q+D is larger than %wd bytes",
+	    warning (OPT_Wlarger_than_, "size of %q+D is larger than %wd bytes",
                      decl, larger_than_size);
 	}
     }
Index: gcc/opth-gen.awk
===================================================================
--- gcc/opth-gen.awk	(revision 163669)
+++ gcc/opth-gen.awk	(working copy)
@@ -321,6 +321,7 @@ print "{"
 for (i = 0; i < n_opts; i++)
 	back_chain[i] = "N_OPTS";
 
+enum_value = 0
 for (i = 0; i < n_opts; i++) {
 	# Combine the flags of identical switches.  Switches
 	# appear many times if they are handled by many front
@@ -332,6 +333,12 @@ for (i = 0; i < n_opts; i++) {
 
 	len = length (opts[i]);
 	enum = opt_enum(opts[i])
+	enum_string = enum " = " enum_value ","
+
+	# Aliases do not get enumeration names.
+	if (flag_set_p("Alias.*", flags[i])) {
+		enum_string = "/* " enum_string " */"
+	}
 
 	# If this switch takes joined arguments, back-chain all
 	# subsequent switches to it for which it is a prefix.  If
@@ -346,7 +353,8 @@ for (i = 0; i < n_opts; i++) {
 		}
 	}
 
-	s = substr("                                         ", length (enum))
+	s = substr("                                          ",
+		   length (enum_string))
 	if (i + 1 == n_opts)
 		comma = ""
 
@@ -355,7 +363,8 @@ for (i = 0; i < n_opts; i++) {
 	else
 		hlp = "N_(\"" help[i] "\")";
 
-	print "  " enum "," s "/* -" opts[i] " */"
+	print "  " enum_string s "/* -" opts[i] " */"
+	enum_value++
 }
 
 print "  N_OPTS,"
Index: gcc/common.opt
===================================================================
--- gcc/common.opt	(revision 163669)
+++ gcc/common.opt	(working copy)
@@ -88,7 +88,7 @@ S
 Driver
 
 W
-Common RejectNegative Var(extra_warnings) Warning
+Common RejectNegative Warning Alias(Wextra)
 This switch is deprecated; use -Wextra instead
 
 Wa,
@@ -153,7 +153,7 @@ Common Var(warn_inline) Warning
 Warn when an inlined function cannot be inlined
 
 Wlarger-than-
-Common RejectNegative Joined UInteger Warning Undocumented
+Common RejectNegative Joined Warning Undocumented Alias(Wlarger-than=)
 
 Wlarger-than=
 Common RejectNegative Joined UInteger Warning
@@ -301,7 +301,7 @@ Common Separate
 -aux-info <file>	Emit declaration information into <file>
 
 aux-info=
-Common Joined
+Common Joined Alias(aux-info)
 
 auxbase
 Common Separate RejectDriver
@@ -750,7 +750,7 @@ Common Report Var(flag_inline_functions_
 Integrate functions called once into their callers
 
 finline-limit-
-Common RejectNegative Joined UInteger
+Common RejectNegative Joined Alias(finline-limit=)
 
 finline-limit=
 Common RejectNegative Joined UInteger
@@ -1259,7 +1259,7 @@ Common Report RejectNegative Joined
 -fstack-check=[no|generic|specific]	Insert stack checking code into the program
 
 fstack-check
-Common Report
+Common Alias(fstack-check=, specific, no)
 Insert stack checking code into the program.  Same as -fstack-check=specific
 
 fstack-limit
@@ -1755,7 +1755,7 @@ shared-libgcc
 Driver
 
 specs
-Driver Separate
+Driver Separate Alias(specs=)
 
 specs=
 Driver Joined
Index: gcc/tree-optimize.c
===================================================================
--- gcc/tree-optimize.c	(revision 163669)
+++ gcc/tree-optimize.c	(working copy)
@@ -477,10 +477,10 @@ tree_rest_of_compilation (tree fndecl)
 	    = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (ret_type));
 
 	  if (compare_tree_int (TYPE_SIZE_UNIT (ret_type), size_as_int) == 0)
-	    warning (OPT_Wlarger_than_eq, "size of return value of %q+D is %u bytes",
+	    warning (OPT_Wlarger_than_, "size of return value of %q+D is %u bytes",
                      fndecl, size_as_int);
 	  else
-	    warning (OPT_Wlarger_than_eq, "size of return value of %q+D is larger than %wd bytes",
+	    warning (OPT_Wlarger_than_, "size of return value of %q+D is larger than %wd bytes",
                      fndecl, larger_than_size);
 	}
     }
Index: gcc/opt-functions.awk
===================================================================
--- gcc/opt-functions.awk	(revision 163669)
+++ gcc/opt-functions.awk	(working copy)
@@ -201,9 +201,6 @@ function var_ref(name, flags)
 # Given the option called NAME return a sanitized version of its name.
 function opt_sanitized_name(name)
 {
-	if (name == "finline-limit=" || name == "Wlarger-than=" \
-	    || name == "ftemplate-depth=")
-		name = name "eq"
 	if (name == "gdwarf+")
 		name = "gdwarfplus"
 	gsub ("[^A-Za-z0-9]", "_", name)
