optc-gen.awk and opth-gen.awk start with a large piece of mostly
common code, with some miscellaneous differences between the two
scripts.  I want to increase the number of files being generated by
the options scripts, and consequently the number of scripts - in
particular, replacing the special rule for building gcc-options.o by
splitting options.c into two files, one that goes in both the driver
and cc1 and one with the per-function save/restore code for cc1 only.
Adding more variant copies of much the same common code seems like a
bad idea, so I've applied this patch to refactor the common code into
a new opt-read.awk (which is almost as long as either optc-gen.awk or
opth-gen.awk were in their entirety when originally created in r83333
in 2004).  Bootstrapped with no regressions on
x86_64-unknown-linux-gnu.

2011-05-21  Joseph Myers  <jos...@codesourcery.com>

        * opt-read.awk: New.  Split out of optc-gen.awk and opth-gen.awk.
        * optc-gen.awk: Move common code to opt-read.awk.
        * opth-gen.awk: Likewise.
        * Makefile.in (options.c, s-options-h): Update to use
        opt-read.awk.

Index: gcc/optc-gen.awk
===================================================================
--- gcc/optc-gen.awk    (revision 173969)
+++ gcc/optc-gen.awk    (working copy)
@@ -21,104 +21,13 @@
 # opt-gather.awk, combines the flags of duplicate options and generates a
 # C file.
 #
-# This program uses functions from opt-functions.awk
+
+# This program uses functions from opt-functions.awk and code from
+# opt-read.awk.
 #
-# Usage: awk -f opt-functions.awk -f optc-gen.awk \
+# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-gen.awk \
 #            [-v header_name=header.h] < inputfile > options.c
 
-BEGIN {
-       n_opts = 0
-       n_langs = 0
-       n_target_save = 0
-       n_extra_vars = 0
-       n_extra_target_vars = 0
-       n_extra_c_includes = 0
-       n_extra_h_includes = 0
-       n_enums = 0
-       quote = "\042"
-       comma = ","
-       FS=SUBSEP
-       # Default the name of header created from opth-gen.awk to options.h
-       if (header_name == "") header_name="options.h"
-}
-
-# Collect the text and flags of each option into an array
-       {
-               if ($1 == "Language") {
-                       langs[n_langs] = $2
-                       n_langs++;
-               }
-               else if ($1 == "TargetSave") {
-                       # Make sure the declarations are put in source order
-                       target_save_decl[n_target_save] = $2
-                       n_target_save++
-               }
-               else if ($1 == "Variable") {
-                       extra_vars[n_extra_vars] = $2
-                       n_extra_vars++
-               }
-               else if ($1 == "TargetVariable") {
-                       # Combination of TargetSave and Variable
-                       extra_vars[n_extra_vars] = $2
-                       n_extra_vars++
-
-                       var = $2
-                       sub(" *=.*", "", var)
-                       orig_var = var
-                       name = var
-                       type = var
-                       sub("^.*[ *]", "", name)
-                       sub(" *" name "$", "", type)
-                       target_save_decl[n_target_save] = type " x_" name
-                       n_target_save++
-
-                       extra_target_vars[n_extra_target_vars] = name
-                       n_extra_target_vars++;
-               }
-               else if ($1 == "HeaderInclude") {
-                       extra_h_includes[n_extra_h_includes++] = $2;
-               }
-               else if ($1 == "SourceInclude")  {
-                       extra_c_includes[n_extra_c_includes++] = $2;
-               }
-               else if ($1 == "Enum") {
-                       props = $2
-                       name = opt_args("Name", props)
-                       type = opt_args("Type", props)
-                       unknown_error = opt_args("UnknownError", props)
-                       enum_names[n_enums] = name
-                       enum_type[name] = type
-                       enum_index[name] = n_enums
-                       enum_unknown_error[name] = unknown_error
-                       enum_help[name] = $3
-                       n_enums++
-               }
-               else if ($1 == "EnumValue")  {
-                       props = $2
-                       enum_name = opt_args("Enum", props)
-                       string = opt_args("String", props)
-                       value = opt_args("Value", props)
-                       val_flags = "0"
-                       val_flags = val_flags \
-                         test_flag("Canonical", props, "| CL_ENUM_CANONICAL") \
-                         test_flag("DriverOnly", props, "| 
CL_ENUM_DRIVER_ONLY")
-                       enum_data[enum_name] = enum_data[enum_name] \
-                         "  { " quote string quote ", " value ", " val_flags \
-                         " },\n"
-               }
-               else {
-                       name = opt_args("Mask", $1)
-                       if (name == "") {
-                               opts[n_opts]  = $1
-                               flags[n_opts] = $2
-                               help[n_opts]  = $3
-                               for (i = 4; i <= NF; i++)
-                                       help[n_opts] = help[n_opts] " " $i
-                               n_opts++;
-                       }
-               }
-       }
-
 # Dump that array of options into a C file.
 END {
 print "/* This file is auto-generated by optc-gen.awk.  */"
Index: gcc/opth-gen.awk
===================================================================
--- gcc/opth-gen.awk    (revision 173969)
+++ gcc/opth-gen.awk    (working copy)
@@ -21,100 +21,10 @@
 # opt-gather.awk, combines the flags of duplicate options and generates a
 # C header file.
 #
-# This program uses functions from opt-functions.awk
-# Usage: awk -f opt-functions.awk -f opth-gen.awk < inputfile > options.h
-
-BEGIN {
-       n_opts = 0
-       n_langs = 0
-       n_target_save = 0
-       n_extra_vars = 0
-       n_extra_target_vars = 0
-       n_extra_masks = 0
-       n_extra_c_includes = 0
-       n_extra_h_includes = 0
-       have_save = 0;
-       quote = "\042"
-       FS=SUBSEP
-}
-
-# Collect the text and flags of each option into an array
-       {
-               if ($1 == "Language") {
-                       langs[n_langs] = $2
-                       n_langs++;
-               }
-               else if ($1 == "TargetSave") {
-                       # Make sure the declarations are put in source order
-                       target_save_decl[n_target_save] = $2
-                       n_target_save++
-               }
-               else if ($1 == "Variable") {
-                       extra_vars[n_extra_vars] = $2
-                       n_extra_vars++
-               }
-               else if ($1 == "TargetVariable") {
-                       # Combination of TargetSave and Variable
-                       extra_vars[n_extra_vars] = $2
-                       n_extra_vars++
-
-                       var = $2
-                       sub(" *=.*", "", var)
-                       orig_var = var
-                       name = var
-                       type = var
-                       sub("^.*[ *]", "", name)
-                       sub(" *" name "$", "", type)
-                       target_save_decl[n_target_save] = type " x_" name
-                       n_target_save++
-
-                       extra_target_vars[n_extra_target_vars] = name
-                       n_extra_target_vars++
-               }
-               else if ($1 == "HeaderInclude") {
-                       extra_h_includes[n_extra_h_includes++] = $2;
-               }
-               else if ($1 == "SourceInclude")  {
-                       extra_c_includes[n_extra_c_includes++] = $2;
-               }
-               else if ($1 == "Enum")  {
-                       props = $2
-                       name = opt_args("Name", props)
-                       type = opt_args("Type", props)
-                       unknown_error = opt_args("UnknownError", props)
-                       enum_names[n_enums] = name
-                       enum_type[name] = type
-                       enum_index[name] = n_enums
-                       enum_unknown_error[name] = unknown_error
-                       enum_help[name] = $3
-                       n_enums++
-               }
-               else if ($1 == "EnumValue")  {
-                       props = $2
-                       enum_name = opt_args("Enum", props)
-                       string = opt_args("String", props)
-                       value = opt_args("Value", props)
-                       val_flags = "0"
-                       val_flags = val_flags \
-                         test_flag("Canonical", props, "| CL_ENUM_CANONICAL") \
-                         test_flag("DriverOnly", props, "| 
CL_ENUM_DRIVER_ONLY")
-                       enum_data[enum_name] = enum_data[enum_name] \
-                         "  { " quote string quote ", " value ", " val_flags \
-                         " },\n"
-               }
-               else {
-                       name = opt_args("Mask", $1)
-                       if (name == "") {
-                               opts[n_opts]  = $1
-                               flags[n_opts] = $2
-                               help[n_opts]  = $3
-                               n_opts++;
-                       }
-                       else {
-                               extra_masks[n_extra_masks++] = name
-                       }
-               }
-       }
+# This program uses functions from opt-functions.awk and code from
+# opt-read.awk.
+# Usage: awk -f opt-functions.awk -f opt-read.awk -f opth-gen.awk \
+#            < inputfile > options.h
 
 # Dump out an enumeration into a .h file.
 # Combine the flags of duplicate options.
Index: gcc/opt-read.awk
===================================================================
--- gcc/opt-read.awk    (revision 0)
+++ gcc/opt-read.awk    (revision 0)
@@ -0,0 +1,119 @@
+#  Copyright (C) 2003,2004,2005,2006,2007,2008, 2010, 2011
+#  Free Software Foundation, Inc.
+#  Contributed by Kelley Cook, June 2004.
+#  Original code from Neil Booth, May 2003.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3, or (at your option) any
+# later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Read in the option records generated from opt-gather.awk.
+
+BEGIN {
+       n_opts = 0
+       n_langs = 0
+       n_target_save = 0
+       n_extra_vars = 0
+       n_extra_target_vars = 0
+       n_extra_masks = 0
+       n_extra_c_includes = 0
+       n_extra_h_includes = 0
+       n_enums = 0
+       have_save = 0;
+       quote = "\042"
+       comma = ","
+       FS=SUBSEP
+       # Default the name of header created from opth-gen.awk to options.h
+       if (header_name == "") header_name="options.h"
+}
+
+# Collect the text and flags of each option into an array
+       {
+               if ($1 == "Language") {
+                       langs[n_langs] = $2
+                       n_langs++;
+               }
+               else if ($1 == "TargetSave") {
+                       # Make sure the declarations are put in source order
+                       target_save_decl[n_target_save] = $2
+                       n_target_save++
+               }
+               else if ($1 == "Variable") {
+                       extra_vars[n_extra_vars] = $2
+                       n_extra_vars++
+               }
+               else if ($1 == "TargetVariable") {
+                       # Combination of TargetSave and Variable
+                       extra_vars[n_extra_vars] = $2
+                       n_extra_vars++
+
+                       var = $2
+                       sub(" *=.*", "", var)
+                       orig_var = var
+                       name = var
+                       type = var
+                       sub("^.*[ *]", "", name)
+                       sub(" *" name "$", "", type)
+                       target_save_decl[n_target_save] = type " x_" name
+                       n_target_save++
+
+                       extra_target_vars[n_extra_target_vars] = name
+                       n_extra_target_vars++
+               }
+               else if ($1 == "HeaderInclude") {
+                       extra_h_includes[n_extra_h_includes++] = $2;
+               }
+               else if ($1 == "SourceInclude")  {
+                       extra_c_includes[n_extra_c_includes++] = $2;
+               }
+               else if ($1 == "Enum") {
+                       props = $2
+                       name = opt_args("Name", props)
+                       type = opt_args("Type", props)
+                       unknown_error = opt_args("UnknownError", props)
+                       enum_names[n_enums] = name
+                       enum_type[name] = type
+                       enum_index[name] = n_enums
+                       enum_unknown_error[name] = unknown_error
+                       enum_help[name] = $3
+                       n_enums++
+               }
+               else if ($1 == "EnumValue")  {
+                       props = $2
+                       enum_name = opt_args("Enum", props)
+                       string = opt_args("String", props)
+                       value = opt_args("Value", props)
+                       val_flags = "0"
+                       val_flags = val_flags \
+                         test_flag("Canonical", props, "| CL_ENUM_CANONICAL") \
+                         test_flag("DriverOnly", props, "| 
CL_ENUM_DRIVER_ONLY")
+                       enum_data[enum_name] = enum_data[enum_name] \
+                         "  { " quote string quote ", " value ", " val_flags \
+                         " },\n"
+               }
+               else {
+                       name = opt_args("Mask", $1)
+                       if (name == "") {
+                               opts[n_opts]  = $1
+                               flags[n_opts] = $2
+                               help[n_opts]  = $3
+                               for (i = 4; i <= NF; i++)
+                                       help[n_opts] = help[n_opts] " " $i
+                               n_opts++;
+                       }
+                       else {
+                               extra_masks[n_extra_masks++] = name
+                       }
+               }
+       }
+
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in     (revision 173969)
+++ gcc/Makefile.in     (working copy)
@@ -2263,13 +2263,17 @@ s-options: $(ALL_OPT_FILES) Makefile $(s
        $(SHELL) $(srcdir)/../move-if-change tmp-optionlist optionlist
        $(STAMP) s-options
 
-options.c: optionlist $(srcdir)/opt-functions.awk $(srcdir)/optc-gen.awk
-       $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/optc-gen.awk \
+options.c: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \
+    $(srcdir)/optc-gen.awk
+       $(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" < $< > $@
 
 options.h: s-options-h ; @true
-s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opth-gen.awk
-       $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opth-gen.awk \
+s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \
+    $(srcdir)/opth-gen.awk
+       $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opt-read.awk \
+              -f $(srcdir)/opth-gen.awk \
               < $< > tmp-options.h
        $(SHELL) $(srcdir)/../move-if-change tmp-options.h options.h
        $(STAMP) $@

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to