diff mbox

[C] options generation and language count

Message ID 20110901214924.GA7377@intrepid.com
State New
Headers show

Commit Message

Gary Funck Sept. 1, 2011, 9:49 p.m. UTC
2011-09-01  Gary Funck <gary@intrepid.com>

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

This patch extracts the shift count used in the definition of
CL_PARAMS to determine the maximum number of language supported
by the implementation.  optc-gen.awk implements the check and
will exit with an error if the number of languages exceeds the limit.

Patch, attached.  Please review.

Thanks,

- Gary

Comments

Joseph Myers Sept. 2, 2011, 1:42 p.m. UTC | #1
On Thu, 1 Sep 2011, Gary Funck wrote:

> +# 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

Are you sure this /dev/stderr reference is portable?

I think this is trying to be too clever and you should just generate 
#if/#error in the output just like all the other error checks, and so not 
need to extract a value from a header with awk at all.
diff mbox

Patch

Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 178389)
+++ gcc/ChangeLog	(working copy)
@@ -1,3 +1,15 @@ 
+2011-09-01  Gary Funck <gary@intrepid.com>
+
+	* 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  <rdsandiford@googlemail.com>
 
 	* 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