This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Trunk] patch for GNU-friendly gengtype
- From: Basile Starynkevitch <basile at starynkevitch dot net>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 16 Jun 2010 15:11:34 +0200
- Subject: [Trunk] patch for GNU-friendly gengtype
Hello All
We need to improve gengtype, in particular so that it will (later) be
installed -eg as gcc-gengtype- and be usable in plugin mode without
requiring the entire GCC build or source tree.
See http://gcc.gnu.org/ml/gcc/2009-06/msg00416.html and more.
A first step is to make gengtype more GNU friendly, that is accept
--help & --version program arguments, and change its program
invocation conventions.
The attached patch to trunk revison 160833 seems to work (on
x86-64/Linux).
gcc/Changelog entry:
2010-06-16 Basile Starynkevitch <basile@starynkevitch.net>
* Makefile.in (gengtype.o): Pass version information strings as
-DGENGTYPE_* preprocessor flags.
* gengtype.c: include getopt.h.
(do_dump): Added static variable moved from main.
(inputlist): Ditto.
(plugin_output_filename): Ditto.
(gengtype_long_options): New variable.
(print_usage): Added function.
(bug_report_url, version_string, pkgversion_string): Added variable.
(print_version): Added function.
(parse_program_options): Added new function.
(main): Changed program invocation convention. Call
parse_program_options. Removed old argument parsing.
##############
I was not able to add a dependency to version.o for build/gengtype.o
(this caused circularities in make), so I pasted code from version.c
to gengtype.c
Comments are welcome.
Bootstrapped on x86-64/Linux (Ubuntu/Lucid).
Ok for trunk?
Cheers
--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mines, sont seulement les miennes} ***
Index: gcc/gengtype.c
===================================================================
--- gcc/gengtype.c (revision 160833)
+++ gcc/gengtype.c (working copy)
@@ -21,9 +21,11 @@
#include "bconfig.h"
#include "system.h"
#include "gengtype.h"
+#include "getopt.h"
#include "errors.h" /* for fatal */
#include "double-int.h"
#include "hashtab.h"
+#include "version.h" /* for version_string & pkgversion_string */
/* Data types, macros, etc. used only in this file. */
@@ -145,10 +147,12 @@
/* The list of output files. */
static outf_p output_files;
-/* The plugin input files and their number; in that case only
- a single file is produced. */
+/* The plugin input files and their number; in that case only a single
+ file is produced. Each element of plugin_files should have an all
+ zero lang_bitmap. */
static char** plugin_files;
static size_t nb_plugin_files;
+
/* the generated plugin output name & file */
static outf_p plugin_output;
@@ -162,6 +166,10 @@
/* Length of srcdir name. */
static size_t srcdir_len = 0;
+static int do_dump = 0;
+static char* inputlist = NULL;
+static char* plugin_output_filename = NULL;
+
static outf_p create_file (const char *, const char *);
static const char * get_file_basename (const char *);
@@ -4158,54 +4166,129 @@
}
+/* Option specification for getopt_long. */
+static const struct option gengtype_long_options[] =
+{
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, 'v' },
+ { "dump", no_argument, NULL, 'd' },
+ { "plugin", required_argument, NULL, 'P' },
+ { "srcdir", required_argument, NULL, 'S' },
+ { "inputs", required_argument, NULL, 'I' },
+ { NULL, no_argument, NULL, 0 },
+};
+
+
+static void
+print_usage (void)
+{
+ fprintf (stderr, "Usage: %s\n", progname);
+ fprintf (stderr, "\t -h | --help \t# Give this help.\n");
+ fprintf (stderr, "\t -v | --version \t# Give version information.\n");
+ fprintf (stderr, "\t -d | --dump \t# Dump state for debugging.\n");
+ fprintf (stderr, "\t -P | --plugin <output-file> \t# Generate for a plugin.\n");
+ fprintf (stderr, "\t -S | --srcdir <GCC-directory> \t# Specify the GCC source directory.\n");
+ fprintf (stderr, "\t -I | --inputs <input-list> \t# Specify the file with source files list.\n");
+}
+
+
+/* This is the location of the online document giving instructions for
+ reporting bugs. If you distribute a modified version of GCC,
+ please configure with --with-bugurl pointing to a document giving
+ instructions for reporting bugs to you, not us. (You are of course
+ welcome to forward us bugs reported to you, if you determine that
+ they are not bugs in your modifications.) */
+const char bug_report_url[] = GENGTYPE_BUGURL;
+/* The complete version string, assembled from several pieces.
+ GENGTYPE_BASEVER, GENGTYPE_DATESTAMP, GENGTYPE_DEVPHASE, and
+ GENGTYPE_REVISION are defined by the Makefile. */
+
+const char version_string[] = GENGTYPE_BASEVER GENGTYPE_DATESTAMP GENGTYPE_DEVPHASE GENGTYPE_REVISION;
+const char pkgversion_string[] = GENGTYPE_PKGVERSION;
+
+static void
+print_version (void)
+{
+ /* Since we cannot depend upon version.o, we have to duplicate
+ version information here. */
+ fprintf (stderr, "%s %s%s\n", progname, pkgversion_string, version_string);
+ fprintf (stderr, "Report bugs: %s\n", bug_report_url);
+}
+
+
+/* Parse the program options using getopt_long... */
+static void
+parse_program_options (int argc, char**argv)
+{
+ int opt = -1;
+ while ((opt = getopt_long (argc, argv, "hvdP:S:I:",
+ gengtype_long_options, NULL)) >= 0)
+ {
+ switch (opt)
+ {
+ case 'h': /* --help */
+ print_usage ();
+ break;
+ case 'v': /* --version */
+ print_version ();
+ break;
+ case 'd': /* --dump */
+ do_dump = 1;
+ break;
+ case 'P': /* --plugin */
+ if (optarg)
+ plugin_output_filename = optarg;
+ else
+ fatal ("missing plugin output file name");
+ break;
+ case 'S': /* --srcdir */
+ if (optarg)
+ srcdir = optarg;
+ else
+ fatal ("missing source directory");
+ srcdir_len = strlen (srcdir);
+ break;
+ case 'I': /* --inputs */
+ if (optarg)
+ inputlist = optarg;
+ else
+ fatal ("missing input list");
+ break;
+ default:
+ fprintf (stderr, "%s: unknown flag '%c'\n", progname, opt);
+ print_usage ();
+ fatal ("unexpected flag");
+ }
+ };
+ if (plugin_output_filename)
+ {
+ /* In plugin mode we require some input files. */
+ int i = 0;
+ if (optind >= argc)
+ fatal("no source files given in plugin mode");
+ nb_plugin_files = argc - optind;
+ for (i = 0; i < (int) nb_plugin_files; i++)
+ {
+ /* Place an all zero lang_bitmap before the plugin file
+ name. */
+ char *name = argv[i + optind];
+ int len = strlen(name) + 1 + sizeof (lang_bitmap);
+ plugin_files[i] = XCNEWVEC (char, len) + sizeof (lang_bitmap);
+ strcpy (plugin_files[i], name);
+ }
+ }
+}
+
int
main (int argc, char **argv)
{
size_t i;
static struct fileloc pos = { this_file, 0 };
- char* inputlist = 0;
- int do_dump = 0;
outf_p output_header;
- char* plugin_output_filename = NULL;
/* fatal uses this */
- progname = "gengtype";
+ progname = (argc>0)?argv[0]:"gengtype";
+ parse_program_options (argc, argv);
- if (argc >= 2 && !strcmp (argv[1], "-d"))
- {
- do_dump = 1;
- argv = &argv[1];
- argc--;
- }
-
- if (argc >= 6 && !strcmp (argv[1], "-P"))
- {
- plugin_output_filename = argv[2];
- plugin_output = create_file ("GCC", plugin_output_filename);
- srcdir = argv[3];
- inputlist = argv[4];
- nb_plugin_files = argc - 5;
- plugin_files = XCNEWVEC (char *, nb_plugin_files);
- for (i = 0; i < nb_plugin_files; i++)
- {
- /* Place an all zero lang_bitmap before the plugin file
- name. */
- char *name = argv[i + 5];
- int len = strlen(name) + 1 + sizeof (lang_bitmap);
- plugin_files[i] = XCNEWVEC (char, len) + sizeof (lang_bitmap);
- strcpy (plugin_files[i], name);
- }
- }
- else if (argc == 3)
- {
- srcdir = argv[1];
- inputlist = argv[2];
- }
- else
- fatal ("usage: gengtype [-d] [-P pluginout.h] srcdir input-list "
- "[file1 file2 ... fileN]");
-
- srcdir_len = strlen (srcdir);
-
read_input_list (inputlist);
if (hit_error)
return 1;
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in (revision 160833)
+++ gcc/Makefile.in (working copy)
@@ -3745,7 +3745,7 @@
s-gtype: build/gengtype$(build_exeext) $(filter-out [%], $(GTFILES)) \
gtyp-input.list
- $(RUN_GEN) build/gengtype$(build_exeext) $(srcdir) gtyp-input.list
+ $(RUN_GEN) build/gengtype$(build_exeext) -S $(srcdir) -I gtyp-input.list
$(STAMP) s-gtype
generated_files = config.h tm.h $(TM_P_H) $(TM_H) multilib.h \
@@ -3831,8 +3831,17 @@
build/gengtype-lex.o : gengtype-lex.c gengtype.h $(BCONFIG_H) $(SYSTEM_H)
build/gengtype-parse.o : gengtype-parse.c gengtype.h $(BCONFIG_H) \
$(SYSTEM_H)
+
+# gengtype cannot depend of version.o, otherwise a circular make
+# dependency appears.
build/gengtype.o : gengtype.c $(BCONFIG_H) $(SYSTEM_H) gengtype.h \
- rtl.def insn-notes.def errors.h double-int.h $(HASHTAB_H)
+ rtl.def insn-notes.def errors.h double-int.h $(HASHTAB_H) \
+ $(REVISION) $(DATESTAMP) $(BASEVER)
+ $(COMPILER) $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \
+ -DGENGTYPE_BASEVER=$(BASEVER_s) -DGENGTYPE_DATESTAMP=$(DATESTAMP_s) \
+ -DGENGTYPE_REVISION=$(REVISION_s) \
+ -DGENGTYPE_DEVPHASE=$(DEVPHASE_s) -DGENGTYPE_PKGVERSION=$(PKGVERSION_s) \
+ -DGENGTYPE_BUGURL=$(BUGURL_s) -c $(srcdir)/gengtype.c $(OUTPUT_OPTION)
build/genmddeps.o: genmddeps.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h \
errors.h $(READ_MD_H)
build/genmodes.o : genmodes.c $(BCONFIG_H) $(SYSTEM_H) errors.h \
@@ -3875,7 +3884,7 @@
build/genautomata$(build_exeext) : BUILD_LIBS += -lm
# These programs are not linked with the MD reader.
-build/gengtype$(build_exeext) : build/gengtype-lex.o build/gengtype-parse.o
+build/gengtype$(build_exeext) : build/gengtype-lex.o build/gengtype-parse.o
# Generated source files for gengtype.
gengtype-lex.c : gengtype-lex.l