diff options
-rw-r--r-- | gcc/ChangeLog | 23 | ||||
-rw-r--r-- | gcc/gcc.c | 2 | ||||
-rw-r--r-- | gcc/opt-functions.awk | 51 | ||||
-rw-r--r-- | gcc/optc-gen.awk | 12 | ||||
-rw-r--r-- | gcc/opts-common.c | 40 | ||||
-rw-r--r-- | gcc/opts.c | 2 | ||||
-rw-r--r-- | gcc/opts.h | 61 | ||||
-rw-r--r-- | gcc/toplev.c | 2 |
8 files changed, 133 insertions, 60 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 045f18fec44..b293750ee09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2011-03-31 Joseph Myers <joseph@codesourcery.com> + + * opts.h (cl_option): Add comments to fields. Add bit-fields for + various flags. + (CL_SEPARATE_NARGS_SHIFT, CL_SEPARATE_NARGS_MASK, + CL_SEPARATE_ALIAS, CL_NO_DRIVER_ARG, CL_REJECT_DRIVER, CL_SAVE, + CL_DISABLED, CL_REPOR, CL_REJECT_NEGATIVE, CL_MISSING_OK, + CL_UINTEGER, CL_NEGATIVE_ALIAS): Remove. + (CL_JOINED, CL_SEPARATE, CL_UNDOCUMENTED): Update bit positions. + * opt-functions.awk (flag_init, switch_bit_fields): New. + (switch_flags): Don't handle flags moved to bit-fields. Don't + generate CL_MISSING_OK or CL_SAVE. + * optc-gen.awk: Update to generate bit-field output as well as + flags field. + * gcc.c (driver_wrong_lang_callback): Use cl_reject_driver + bit-field instead of CL_REJECT_DRIVER flag. + * opts-common.c (generate_canonical_option, + decode_cmdline_option): Use bit-fields instead of CL_* flags. + * opts.c (maybe_default_option): Use cl_reject_negative bit-field + instead of CL_REJECT_NEGATIVE flag. + * toplev.c (print_switch_values): Use cl_report bit-field instead + of CL_REPORT flag. + 2011-03-31 Eric Botcazou <ebotcazou@adacore.com> * tree-ssa-pre.c (create_component_ref_by_pieces_1) <ARRAY_REF>: Drop diff --git a/gcc/gcc.c b/gcc/gcc.c index c399d14eedb..7ad959aa8da 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -3115,7 +3115,7 @@ driver_wrong_lang_callback (const struct cl_decoded_option *decoded, options. */ const struct cl_option *option = &cl_options[decoded->opt_index]; - if (option->flags & CL_REJECT_DRIVER) + if (option->cl_reject_driver) error ("unrecognized command line option %qs", decoded->orig_option_with_args_text); else diff --git a/gcc/opt-functions.awk b/gcc/opt-functions.awk index f5f5cd4656e..19bdf3afb06 100644 --- a/gcc/opt-functions.awk +++ b/gcc/opt-functions.awk @@ -42,6 +42,16 @@ function test_flag(regex, flags, string) return "" } +# Return a field initializer, with trailing comma, for a field that is +# 1 if FLAGS contains a flag matching REGEX and 0 otherwise. +function flag_init(regex, flags) +{ + if (flag_set_p(regex, flags)) + return "1 /* " regex " */, " + else + return "0, " +} + # If FLAGS contains a "NAME(...argument...)" flag, return the value # of the argument. Return the empty string otherwise. function opt_args(name, flags) @@ -87,27 +97,38 @@ function switch_flags (flags) test_flag("Common", flags, " | CL_COMMON") \ 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("SeparateAlias", flags, " | CL_SEPARATE_ALIAS") \ - test_flag("NegativeAlias", flags, " | CL_NEGATIVE_ALIAS") \ - test_flag("Save", flags, " | CL_SAVE") \ test_flag("Joined", flags, " | CL_JOINED") \ - test_flag("JoinedOrMissing", flags, " | CL_JOINED | CL_MISSING_OK") \ + test_flag("JoinedOrMissing", flags, " | CL_JOINED") \ test_flag("Separate", flags, " | CL_SEPARATE") \ - test_flag("RejectNegative", flags, " | CL_REJECT_NEGATIVE") \ - test_flag("UInteger", flags, " | CL_UINTEGER") \ test_flag("Undocumented", flags, " | CL_UNDOCUMENTED") \ test_flag("Warning", flags, " | CL_WARNING") \ - test_flag("Optimization", flags, " | CL_OPTIMIZATION") \ - test_flag("Report", flags, " | CL_REPORT") + test_flag("Optimization", flags, " | CL_OPTIMIZATION") + sub( "^0 \\| ", "", result ) + return result +} + +# Return bit-field initializers for option flags FLAGS. +function switch_bit_fields (flags) +{ + result = "" sep_args = opt_args("Args", flags) - if (sep_args != "") { + if (sep_args == "") + sep_args = 0 + else sep_args-- - result = result " | (" sep_args \ - " << CL_SEPARATE_NARGS_SHIFT)" - } - sub( "^0 \\| ", "", result ) + result = result sep_args ", " + + result = result \ + flag_init("SeparateAlias", flags) \ + flag_init("NegativeAlias", flags) \ + flag_init("NoDriverArg", flags) \ + flag_init("RejectDriver", flags) \ + flag_init("RejectNegative", flags) \ + flag_init("JoinedOrMissing", flags) \ + flag_init("UInteger", flags) \ + flag_init("Report", flags) + + sub(", $", "", result) return result } diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk index 24def356218..a821c648d37 100644 --- a/gcc/optc-gen.awk +++ b/gcc/optc-gen.awk @@ -401,15 +401,21 @@ for (i = 0; i < n_opts; i++) { printf(" %d,\n", idx) condition = opt_args("Condition", flags[i]) cl_flags = switch_flags(flags[i]) + cl_bit_fields = switch_bit_fields(flags[i]) + cl_zero_bit_fields = switch_bit_fields("") if (condition != "") printf("#if %s\n" \ " %s,\n" \ + " 0, %s,\n" \ "#else\n" \ - " CL_DISABLED,\n" \ + " 0,\n" \ + " 1 /* Disabled. */, %s,\n" \ "#endif\n", - condition, cl_flags, cl_flags) + condition, cl_flags, cl_bit_fields, cl_zero_bit_fields) else - printf(" %s,\n", cl_flags) + printf(" %s,\n" \ + " 0, %s,\n", + cl_flags, cl_bit_fields) printf(" %s, %s }%s\n", var_ref(opts[i], flags[i]), var_set(flags[i]), comma) } diff --git a/gcc/opts-common.c b/gcc/opts-common.c index a88aed032d9..f54d64aff28 100644 --- a/gcc/opts-common.c +++ b/gcc/opts-common.c @@ -257,7 +257,7 @@ generate_canonical_option (size_t opt_index, const char *arg, int value, const char *opt_text = option->opt_text; if (value == 0 - && !(option->flags & CL_REJECT_NEGATIVE) + && !option->cl_reject_negative && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm')) { char *t = XNEWVEC (char, option->opt_len + 5); @@ -276,7 +276,7 @@ generate_canonical_option (size_t opt_index, const char *arg, int value, if (arg) { if ((option->flags & CL_SEPARATE) - && !(option->flags & CL_SEPARATE_ALIAS)) + && !option->cl_separate_alias) { decoded->canonical_option[0] = opt_text; decoded->canonical_option[1] = arg; @@ -412,7 +412,7 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, /* Reject negative form of switches that don't take negatives as unrecognized. */ - if (!value && (option->flags & CL_REJECT_NEGATIVE)) + if (!value && option->cl_reject_negative) { opt_index = OPT_SPECIAL_unknown; errors |= CL_ERR_NEGATIVE; @@ -424,18 +424,17 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, warn_message = option->warn_message; /* Check to see if the option is disabled for this configuration. */ - if (option->flags & CL_DISABLED) + if (option->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, and, if so, how many such arguments. */ separate_arg_flag = ((option->flags & CL_SEPARATE) - && !((option->flags & CL_NO_DRIVER_ARG) + && !(option->cl_no_driver_arg && (lang_mask & CL_DRIVER))); separate_args = (separate_arg_flag - ? ((option->flags & CL_SEPARATE_NARGS_MASK) - >> CL_SEPARATE_NARGS_SHIFT) + 1 + ? option->cl_separate_nargs + 1 : 0); joined_arg_flag = (option->flags & CL_JOINED) != 0; @@ -447,7 +446,7 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, argument to be persistent until the program exits. */ arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len; - if (*arg == '\0' && !(option->flags & CL_MISSING_OK)) + if (*arg == '\0' && !option->cl_missing_ok) { if (separate_arg_flag) { @@ -483,7 +482,7 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, /* Is this option an alias (or an ignored option, marked as an alias of OPT_SPECIAL_ignore)? */ if (option->alias_target != N_OPTS - && (!(option->flags & CL_SEPARATE_ALIAS) || have_separate_arg)) + && (!option->cl_separate_alias || have_separate_arg)) { size_t new_opt_index = option->alias_target; @@ -501,13 +500,13 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, /* The new option must not be an alias itself. */ gcc_assert (new_option->alias_target == N_OPTS - || (new_option->flags & CL_SEPARATE_ALIAS)); + || new_option->cl_separate_alias); if (option->neg_alias_arg) { gcc_assert (option->alias_arg != NULL); gcc_assert (arg == NULL); - gcc_assert (!(option->flags & CL_NEGATIVE_ALIAS)); + gcc_assert (!option->cl_negative_alias); if (value) arg = option->alias_arg; else @@ -518,35 +517,34 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, { gcc_assert (value == 1); gcc_assert (arg == NULL); - gcc_assert (!(option->flags & CL_NEGATIVE_ALIAS)); + gcc_assert (!option->cl_negative_alias); arg = option->alias_arg; } - if (option->flags & CL_NEGATIVE_ALIAS) + if (option->cl_negative_alias) value = !value; opt_index = new_opt_index; option = new_option; if (value == 0) - gcc_assert (!(option->flags & CL_REJECT_NEGATIVE)); + gcc_assert (!option->cl_reject_negative); /* Recompute what arguments are allowed. */ separate_arg_flag = ((option->flags & CL_SEPARATE) - && !((option->flags & CL_NO_DRIVER_ARG) + && !(option->cl_no_driver_arg && (lang_mask & CL_DRIVER))); joined_arg_flag = (option->flags & CL_JOINED) != 0; - if (separate_args > 1 || (option->flags & CL_SEPARATE_NARGS_MASK)) + if (separate_args > 1 || option->cl_separate_nargs) gcc_assert (separate_args - == ((option->flags & CL_SEPARATE_NARGS_MASK) - >> CL_SEPARATE_NARGS_SHIFT) + 1); + == (unsigned int) option->cl_separate_nargs + 1); if (!(errors & CL_ERR_MISSING_ARG)) { if (separate_arg_flag || joined_arg_flag) { - if ((option->flags & CL_MISSING_OK) && arg == NULL) + if (option->cl_missing_ok && arg == NULL) arg = ""; gcc_assert (arg != NULL); } @@ -560,7 +558,7 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, gcc_assert (warn_message == NULL); warn_message = option->warn_message; } - if (option->flags & CL_DISABLED) + if (option->cl_disabled) errors |= CL_ERR_DISABLED; } } @@ -570,7 +568,7 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, errors |= CL_ERR_WRONG_LANG; /* If the switch takes an integer, convert it. */ - if (arg && (option->flags & CL_UINTEGER)) + if (arg && option->cl_uinteger) { value = integral_argument (arg); if (value == -1) diff --git a/gcc/opts.c b/gcc/opts.c index 8cce46a2951..cd581f6ce69 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -382,7 +382,7 @@ maybe_default_option (struct gcc_options *opts, lang_mask, DK_UNSPECIFIED, loc, handlers, dc); else if (default_opt->arg == NULL - && !(option->flags & CL_REJECT_NEGATIVE)) + && !option->cl_reject_negative) handle_generated_option (opts, opts_set, default_opt->opt_index, default_opt->arg, !default_opt->value, lang_mask, DK_UNSPECIFIED, loc, diff --git a/gcc/opts.h b/gcc/opts.h index 491177898c6..15e717da0d9 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -53,20 +53,60 @@ enum cl_var_type { struct cl_option { + /* Text of the option, including initial '-'. */ const char *opt_text; + /* Help text for --help, or NULL. */ const char *help; + /* Error message for missing argument, or NULL. */ const char *missing_argument_error; + /* Warning to give when this option is used, or NULL. */ const char *warn_message; + /* Argument of alias target when positive option given, or NULL. */ const char *alias_arg; + /* Argument of alias target when negative option given, or NULL. */ const char *neg_alias_arg; + /* Alias target, or N_OPTS if not an alias. */ unsigned short alias_target; + /* Previous option that is an initial substring of this one, or + N_OPTS if none. */ unsigned short back_chain; + /* Option length, not including initial '-'. */ unsigned char opt_len; + /* Next option in a sequence marked with Negative, or -1 if none. */ int neg_index; + /* CL_* flags for this option. */ unsigned int flags; + /* Disabled in this configuration. */ + BOOL_BITFIELD cl_disabled : 1; + /* Options marked with CL_SEPARATE take a number of separate + arguments (1 to 4) that is one more than the number in this + bit-field. */ + unsigned int cl_separate_nargs : 2; + /* Option is an alias when used with separate argument. */ + BOOL_BITFIELD cl_separate_alias : 1; + /* Alias to negative form of option. */ + BOOL_BITFIELD cl_negative_alias : 1; + /* Option takes no argument in the driver. */ + BOOL_BITFIELD cl_no_driver_arg : 1; + /* Reject this option in the driver. */ + BOOL_BITFIELD cl_reject_driver : 1; + /* Reject no- form. */ + BOOL_BITFIELD cl_reject_negative : 1; + /* Missing argument OK (joined). */ + BOOL_BITFIELD cl_missing_ok : 1; + /* Argument is an integer >=0. */ + BOOL_BITFIELD cl_uinteger : 1; + /* Report argument with -fverbose-asm */ + BOOL_BITFIELD cl_report : 1; + /* Offset of field for this option in struct gcc_options, or + (unsigned short) -1 if none. */ unsigned short flag_var_offset; + /* Index in cl_enums of enum used for this option's arguments, for + CLVC_ENUM options. */ unsigned short var_enum; + /* How this option's value is determined and sets a field. */ enum cl_var_type var_type; + /* Value or bit-mask with which to set a field. */ int var_value; }; @@ -98,24 +138,9 @@ extern const unsigned int cl_lang_count; This distinction is important because --help will not list options which only have these higher bits set. */ -/* Options marked with CL_SEPARATE take a number of separate arguments - (1 to 4) that is one more than the number in this bit-field. */ -#define CL_SEPARATE_NARGS_SHIFT 17 -#define CL_SEPARATE_NARGS_MASK (3U << CL_SEPARATE_NARGS_SHIFT) - -#define CL_SEPARATE_ALIAS (1U << 19) /* Option is an alias when used with separate argument. */ -#define CL_NO_DRIVER_ARG (1U << 20) /* Option takes no argument in the driver. */ -#define CL_REJECT_DRIVER (1U << 21) /* Reject this option in the driver. */ -#define CL_SAVE (1U << 22) /* Target-specific option for attribute. */ -#define CL_DISABLED (1U << 23) /* Disabled in this configuration. */ -#define CL_REPORT (1U << 24) /* Report argument with -fverbose-asm */ -#define CL_JOINED (1U << 25) /* If takes joined argument. */ -#define CL_SEPARATE (1U << 26) /* If takes a separate argument. */ -#define CL_REJECT_NEGATIVE (1U << 27) /* Reject no- form. */ -#define CL_MISSING_OK (1U << 28) /* Missing argument OK (joined). */ -#define CL_UINTEGER (1U << 29) /* Argument is an integer >=0. */ -#define CL_UNDOCUMENTED (1U << 30) /* Do not output with --help. */ -#define CL_NEGATIVE_ALIAS (1U << 31) /* Alias to negative form of option. */ +#define CL_JOINED (1U << 17) /* If takes joined argument. */ +#define CL_SEPARATE (1U << 18) /* If takes a separate argument. */ +#define CL_UNDOCUMENTED (1U << 19) /* Do not output with --help. */ /* Flags for an enumerated option argument. */ #define CL_ENUM_CANONICAL (1 << 0) /* Canonical for this value. */ diff --git a/gcc/toplev.c b/gcc/toplev.c index 64af11200e9..3b154a6255e 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -891,7 +891,7 @@ print_switch_values (print_switch_fn_type print_fn) SWITCH_TYPE_DESCRIPTIVE, _("options enabled: ")); for (j = 0; j < cl_options_count; j++) - if ((cl_options[j].flags & CL_REPORT) + if (cl_options[j].cl_report && option_enabled (j, &global_options) > 0) pos = print_single_switch (print_fn, pos, SWITCH_TYPE_ENABLED, cl_options[j].opt_text); |