Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 178389) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,15 @@ +2011-09-01 Gary Funck + + * opts.c (print_specific_help): Fix off-by-one compare in + assertion check. + * opts.h (CL_PARAMS, CL_WARNING, CL_OPTIMIZATION, CL_DRIVER, + CL_TARGET, CL_COMMON, CL_JOINED, CL_SEPARATE, CL_UNDOCUMENTED): + Increase by +5 to allow for more languages. + * Makefile.in (options.c): Extract max. number of languages value + from opts.h, and pass to optc-gen.awk script. + * optc-gen.awk: Use max_lang value and issue error if number of + languages exceeds implementation-defined limit. + 2011-08-31 Richard Sandiford * config/i386/i386.md: Use (match_test ...) for attribute tests. Index: gcc/opts.c =================================================================== --- gcc/opts.c (revision 178389) +++ gcc/opts.c (working copy) @@ -1125,7 +1125,7 @@ print_specific_help (unsigned int includ /* Sanity check: Make sure that we do not have more languages than we have bits available to enumerate them. */ - gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS); + gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS); /* If we have not done so already, obtain the desired maximum width of the output. */ Index: gcc/opts.h =================================================================== --- gcc/opts.h (revision 178389) +++ gcc/opts.h (working copy) @@ -127,12 +127,12 @@ extern const unsigned int cl_options_cou extern const char *const lang_names[]; extern const unsigned int cl_lang_count; -#define CL_PARAMS (1U << 11) /* Fake entry. Used to display --param info with --help. */ -#define CL_WARNING (1U << 12) /* Enables an (optional) warning message. */ -#define CL_OPTIMIZATION (1U << 13) /* Enables an (optional) optimization. */ -#define CL_DRIVER (1U << 14) /* Driver option. */ -#define CL_TARGET (1U << 15) /* Target-specific option. */ -#define CL_COMMON (1U << 16) /* Language-independent. */ +#define CL_PARAMS (1U << 16) /* Fake entry. Used to display --param info with --help. */ +#define CL_WARNING (1U << 17) /* Enables an (optional) warning message. */ +#define CL_OPTIMIZATION (1U << 18) /* Enables an (optional) optimization. */ +#define CL_DRIVER (1U << 19) /* Driver option. */ +#define CL_TARGET (1U << 20) /* Target-specific option. */ +#define CL_COMMON (1U << 21) /* Language-independent. */ #define CL_MIN_OPTION_CLASS CL_PARAMS #define CL_MAX_OPTION_CLASS CL_COMMON @@ -142,9 +142,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. */ -#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. */ +#define CL_JOINED (1U << 22) /* If takes joined argument. */ +#define CL_SEPARATE (1U << 23) /* If takes a separate argument. */ +#define CL_UNDOCUMENTED (1U << 24) /* Do not output with --help. */ /* Flags for an enumerated option argument. */ #define CL_ENUM_CANONICAL (1 << 0) /* Canonical for this value. */ Index: gcc/optc-gen.awk =================================================================== --- gcc/optc-gen.awk (revision 178389) +++ gcc/optc-gen.awk (working copy) @@ -30,6 +30,15 @@ # Dump that array of options into a C file. END { +# MAX_LANG is the maximum number of languages that can be defined. +# Its value is extracted from the value of CL_PARAMS in opts.h +# and is passed on the command line as '-v max_lang=...'. +if (n_langs > max_lang) { + print "Error: the number of defined languages (" n_langs ") " \ + "exceeds the maximum supported by this implementation " \ + "(" max_lang ")" > "/dev/stderr" + exit 2 +} print "/* This file is auto-generated by optc-gen.awk. */" print "" n_headers = split(header_name, headers, " ") Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 178389) +++ gcc/Makefile.in (working copy) @@ -2216,10 +2216,18 @@ s-options: $(ALL_OPT_FILES) Makefile $(s $(STAMP) s-options options.c: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ - $(srcdir)/optc-gen.awk + $(srcdir)/optc-gen.awk $(srcdir)/opts.h + max_lang=`$(AWK) '/^#define +CL_PARAMS +\(1U +<< +[0-9]+\)/ \ + {x=$$5; sub(")","",x); print +x; exit}' $(srcdir)/opts.h`; \ + if test -z "$${max_lang}"; then \ + echo "Could not find a valid CL_PARAMS definition in $(srcdir)/opts.h"; \ + exit 2; \ + fi; \ $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opt-read.awk \ -f $(srcdir)/optc-gen.awk \ - -v header_name="config.h system.h coretypes.h tm.h" < $< > $@ + -v max_lang="$$max_lang" \ + -v header_name="config.h system.h coretypes.h tm.h" < $< > $@.tmp + mv $@.tmp $@ options-save.c: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ $(srcdir)/optc-save-gen.awk