Option alias support for .opt files
Richard Guenther
richard.guenther@gmail.com
Thu Sep 2 09:10:00 GMT 2010
On Wed, Sep 1, 2010 at 9:23 PM, Joseph S. Myers <joseph@codesourcery.com> wrote:
> This patch adds an option alias facility for .opt files. It doesn't
> cover quite everything needed to replace translate_options - remaining
> pieces will be in subsequent patches - but it does suffice to handle
> various existing option aliases.
>
> When an option is an alias, no OPT_* enum value is generated for it
> and all code dealing with decoded options only needs to deal with the
> canonical option, not with the alias. In addition, specs only need to
> deal with the canonical form of the option. The canonical option
> fields in cl_decoded_option structures now really do represent a
> canonical form rather than what was passed in argv; option arguments
> for options accepting both joined and separate arguments are
> canonically considered to be separate. (To avoid possible problems
> with some linkers, gcc.c makes sure to use a joined form of -L options
> for specs; this appears to be the only existing option likely to have
> such issues. The use of separate arguments as canonical incidentally
> fixes PR 44076, an issue with a "%{!MT:...}" spec not matching -MT
> options with joined argument.)
>
> By not creating OPT_* enum names for aliases, it is no longer
> necessary for the OPT_* enum names to have special cases for options
> with forms ending both "-" and "=".
>
> -Werror= will handle aliases - thus, both -Werror=comment and
> -Werror=comments will work the same, whereas only one would work
> before (diagnostics will say "-Werror=comment" as the enabling option
> regardless of which was actually passed, but that's a minor issue).
>
> Various existing options are marked as aliases where appropriate. In
> the Java case this will cause some options to be accepted by jc1 that
> were previously only accepted by the driver; I think this is
> appropriate (there is no reason for options logically meaningful to
> both to be accepted by one only).
>
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu. OK to
> commit?
Ok for the non-C and non-Java parts.
Thanks,
Richard.
> 2010-09-01 Joseph Myers <joseph@codesourcery.com>
>
> PR driver/44076
> * opts.h (struct cl_option): Add alias_arg, neg_alias_arg and
> alias_target fields.
> * opt-functions.awk (opt_sanitized_name): Don't handle
> finline-limit=, Wlarger-than= and ftemplate-depth= specially.
> * optc-gen.awk: Generate alias fields.
> * opth-gen.awk: Explicitly give values for OPT_* enum constants.
> Don't generate such constants for aliases.
> * opts-common.c (generate_canonical_option): New.
> (decode_cmdline_option): Handle aliases. Use
> generate_canonical_option for known options instead of copying the
> input option text.
> * doc/options.texi (Alias): Document.
> * common.opt (W, Wlarger-than-, aux-info=, finline-limit-,
> fstack-check, specs): Mark as aliases.
> * gcc.c (driver_handle_option): Canonicalize -L options to joined
> arguments.
> (driver_handle_option): Don't handle OPT_specs.
> * opts.c (common_handle_option): Don't handle options marked as
> aliases.
> (enable_warning_as_error): Handle aliases.
> * stor-layout.c (layout_decl): Use OPT_Wlarger_than_ instead of
> OPT_Wlarger_than_eq.
> * tree-optimize.c (tree_rest_of_compilation): Use
> OPT_Wlarger_than_ instead of OPT_Wlarger_than_eq.
>
> c-family:
> 2010-09-01 Joseph Myers <joseph@codesourcery.com>
>
> * c.opt (Wcomments, Werror-implicit-function-declaration,
> ftemplate-depth-, std=c89, std=c9x, std=gnu89, std=gnu9x,
> std=iso9899:1990, std=iso9899:1999, std=iso9899:199x): Mark as
> aliases.
> * c-common.c (option_codes): Use OPT_Wcomment instead of
> OPT_Wcomments.
> * c-opts.c (warning_as_error_callback, c_common_handle_option):
> Don't handle options marked as aliases.
>
> java:
> 2010-09-01 Joseph Myers <joseph@codesourcery.com>
>
> * lang.opt (CLASSPATH, bootclasspath, classpath, encoding,
> fCLASSPATH=): Mark as Java options and as aliases.
> * jvspec.c (jvgenmain_spec): Don't handle -fCLASSPATH*.
> (lang_specific_driver): Don't handle options marked as aliases.
> * lang.c (java_handle_option): Don't handle OPT_fCLASSPATH_.
>
> testsuite:
> 2010-09-01 Joseph Myers <joseph@codesourcery.com>
>
> * gcc.dg/cpp/warn-comments-3.c: New. Based on warn-comments-2.c
> but using -Werror=comment.
> * gcc.dg/cpp/warn-comments.c, gcc.dg/cpp/warn-comments-2.c: Adjust
> expected error messages.
>
> 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)
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
>
More information about the Gcc-patches
mailing list