From patchwork Sun Aug 29 06:16:32 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Basile Starynkevitch X-Patchwork-Id: 62930 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id B5433B710C for ; Sun, 29 Aug 2010 16:16:52 +1000 (EST) Received: (qmail 4633 invoked by alias); 29 Aug 2010 06:16:49 -0000 Received: (qmail 4624 invoked by uid 22791); 29 Aug 2010 06:16:47 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, TW_CP, TW_DB, TW_RG X-Spam-Check-By: sourceware.org Received: from smtp-106-saturday.noc.nerim.net (HELO mallaury.nerim.net) (62.4.17.106) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 29 Aug 2010 06:16:39 +0000 Received: from hector.lesours (ours.starynkevitch.net [213.41.244.95]) by mallaury.nerim.net (Postfix) with ESMTP id 88418A1053; Sun, 29 Aug 2010 08:16:36 +0200 (CEST) Received: from glinka.lesours ([192.168.0.1]) by hector.lesours with esmtp (Exim 4.72) (envelope-from ) id 1OpbC0-0001pt-5q; Sun, 29 Aug 2010 08:16:36 +0200 Subject: Re: gengtype improvements for plugins. patch 1/N From: Basile Starynkevitch Reply-To: basile@starynkevitch.net To: jeremie.salvucci@free.fr Cc: gcc-patches@gcc.gnu.org In-Reply-To: <1283016347.3067.43.camel@glinka> References: <1283012591.3067.17.camel@glinka> <20100828170603.GA1108@gmx.de> <1283016347.3067.43.camel@glinka> Date: Sun, 29 Aug 2010 08:16:32 +0200 Message-ID: <1283062592.3067.50.camel@glinka> Mime-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org There was a one letter typo in the patch (for the gengtype_long_options array, line "version", short letter). So here is the latest and hopefully final version of the patch. the patch relative to trunk is file patch01ter-r163612-progarg.diff the gcc/ChangeLog entry is patch01ter-r163612-progarg.ChangeLog Ok for trunk? Index: gcc/gengtype.c =================================================================== --- gcc/gengtype.c (revision 163612) +++ gcc/gengtype.c (working copy) @@ -20,10 +20,12 @@ #include "bconfig.h" #include "system.h" -#include "gengtype.h" #include "errors.h" /* for fatal */ +#include "getopt.h" #include "double-int.h" #include "hashtab.h" +#include "version.h" /* for version_string & pkgversion_string */ +#include "gengtype.h" /* Data types, macros, etc. used only in this file. */ @@ -39,8 +41,6 @@ enum typekind { TYPE_PARAM_STRUCT }; -typedef unsigned lang_bitmap; - /* A way to pass data through to the output end. */ struct options { @@ -120,16 +120,6 @@ struct type || (x)->kind == TYPE_STRUCT \ || (x)->kind == TYPE_LANG_STRUCT) -/* Structure representing an output file. */ -struct outf -{ - struct outf *next; - const char *name; - size_t buflength; - size_t bufused; - char *buf; -}; -typedef struct outf * outf_p; /* An output file, suitable for definitions, that can see declarations made in INPUT_FILE and is linked into every language that uses @@ -142,26 +132,37 @@ const char *get_output_file_name (const char *); static void oprintf (outf_p o, const char *S, ...) ATTRIBUTE_PRINTF_2; -/* The list of output files. */ -static outf_p output_files; +/* Rhe name of the file containing the list of input files. */ +static char* inputlist = 0; + /* The plugin input files and their number; in that case only a single file is produced. */ static char** plugin_files; static size_t nb_plugin_files; -/* the generated plugin output name & file */ + +/* The generated plugin output file & name. */ static outf_p plugin_output; +static char* plugin_output_filename; -/* The output header file that is included into pretty much every - source file. */ -static outf_p header_file; +/* Our output files and output header file. */ +outf_p output_files; +outf_p header_file; -/* Source directory. */ -static const char *srcdir; +/* Our source directory & its name. */ +const char *srcdir; +size_t srcdir_len; -/* Length of srcdir name. */ -static size_t srcdir_len = 0; +/* Variables used for reading and writing the state. Not yet + implemented feature! */ +char *read_state_filename; +char *write_state_filename; + +/* Variables to help debugging. */ +int do_dump; +int do_debug; + static outf_p create_file (const char *, const char *); static const char * get_file_basename (const char *); @@ -4209,32 +4210,140 @@ dump_everything (void) } +/* 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' }, + { "debug", no_argument, NULL, 'D' }, + { "plugin", required_argument, NULL, 'P' }, + { "srcdir", required_argument, NULL, 'S' }, + { "inputs", required_argument, NULL, 'I' }, + { "read-state", required_argument, NULL, 'r' }, + { "write-state", required_argument, NULL, 'w' }, + { NULL, no_argument, NULL, 0 }, +}; + + +static void +print_usage (void) +{ + printf ("Usage: %s\n", progname); + printf ("\t -h | --help \t# Give this help.\n"); + printf ("\t -D | --debug \t# Lots of debug output to debug gengtype itself.\n"); + printf ("\t -V | --version \t# Give version information.\n"); + printf ("\t -d | --dump \t# Dump state for debugging.\n"); + printf ("\t -P | --plugin \t# Generate for a plugin.\n"); + printf ("\t -S | --srcdir \t# Specify the GCC source directory.\n"); + printf ("\t -I | --inputs \t# Specify the file with source files list.\n"); + printf ("\t -w | --write-state \t# Write a state file (for plugin use).\n"); + printf ("\t -r | --read-state \t# Read a state file.\n"); +} + +static void +print_version (void) +{ + printf ("%s %s%s\n", progname, pkgversion_string, version_string); + printf ("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:w:r:D", + 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 'D': /* --debug */ + do_debug = 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; + case 'r': /* --read-state */ + if (optarg) + read_state_filename = optarg; + else + fatal ("missing read state file"); + dbgprintf ("read state %s\n", optarg); + break; + case 'w': /* --write-state */ + dbgprintf ("write state %s\n", optarg); + if (optarg) + write_state_filename = optarg; + else + fatal ("missing write state file"); + 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++) + { + char *name = argv[i + optind]; + 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"; - if (argc >= 2 && !strcmp (argv[1], "-d")) - { - do_dump = 1; - argv = &argv[1]; - argc--; - } + parse_program_options (argc, argv); - if (argc >= 6 && !strcmp (argv[1], "-P")) + if (read_state_filename) + fatal ("read state of %s not implemented yet", read_state_filename); + + if (write_state_filename) + fatal ("write state of %s not implemented yet", write_state_filename); + + if (plugin_output_filename) { - 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++) { @@ -4246,17 +4355,8 @@ main (int argc, char **argv) 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); - + dbgprintf ("inputlist %s", inputlist); read_input_list (inputlist); if (hit_error) return 1; Index: gcc/gengtype.h =================================================================== --- gcc/gengtype.h (revision 163612) +++ gcc/gengtype.h (working copy) @@ -20,6 +20,10 @@ along with GCC; see the file COPYING3. If not see #ifndef GCC_GENGTYPE_H #define GCC_GENGTYPE_H +/* Sets of accepted source languages like C, C++, Ada ... are + represented by a bitmap. */ +typedef unsigned lang_bitmap; + /* A file position, mostly for error messages. The FILE element may be compared using pointer equality. */ struct fileloc { @@ -37,6 +41,35 @@ typedef struct options *options_p; extern int lexer_toplevel_done; extern struct fileloc lexer_line; +/* Structure representing an output file. */ +struct outf +{ + struct outf *next; + const char *name; + size_t buflength; + size_t bufused; + char *buf; +}; +typedef struct outf * outf_p; + +/* The list of output files. */ +extern outf_p output_files; + +/* The output header file that is included into pretty much every + source file. */ +extern outf_p header_file; + +/* Source directory. */ +extern const char *srcdir; + +/* Length of srcdir name. */ +extern size_t srcdir_len; + +/* Variable used for reading and writing the state. */ +extern char *read_state_filename; +extern char *write_state_filename; + + /* Print an error message. */ extern void error_at_line (const struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2; @@ -110,4 +143,19 @@ enum { a meaningful value to be printed. */ FIRST_TOKEN_WITH_VALUE = PARAM_IS }; -#endif + + +/* For debugging purposes of gengtype itself! */ +extern int do_dump; +extern int do_debug; + +#if ENABLE_CHECKING +#define dbgprintf(Fmt,...) do {if(do_debug) \ + fprintf(stderr, "%s:%d: " Fmt "\n", \ + lbasename(__FILE__),__LINE__, ##__VA_ARGS__);} while(0) +#else +#define dbgprintf(Fmt,...) do {/*nodebugprintf*/} while(0) +#endif /*ENABLE_CHECKING*/ + +#endif /*GCC_GENGTYPE_H*/ + Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 163612) +++ gcc/Makefile.in (working copy) @@ -3804,7 +3804,7 @@ s-gtyp-input: Makefile 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 \ @@ -3892,6 +3892,21 @@ build/gengtype-parse.o : gengtype-parse.c gengtype $(SYSTEM_H) build/gengtype.o : gengtype.c $(BCONFIG_H) $(SYSTEM_H) gengtype.h \ rtl.def insn-notes.def errors.h double-int.h $(HASHTAB_H) + +## The build/version.o is needed at least for gengtype. +ifdef REVISION_c +build/version.o: version.c version.h $(REVISION) $(DATESTAMP) $(BASEVER) $(DEVPHASE) +else +build/version.o: version.c version.h $(DATESTAMP) $(BASEVER) $(DEVPHASE) +endif + +## The build/version.o is compiled by the $(COMPILER_FOR_BUILD) so +build/version.o: BUILD_CPPFLAGS += \ + -DBASEVER=$(BASEVER_s) -DDATESTAMP=$(DATESTAMP_s) \ + -DREVISION=$(REVISION_s) \ + -DDEVPHASE=$(DEVPHASE_s) -DPKGVERSION=$(PKGVERSION_s) \ + -DBUGURL=$(BUGURL_s) -c $(srcdir)/version.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 \ @@ -3935,7 +3950,9 @@ $(genprog:%=build/gen%$(build_exeext)): $(BUILD_ER 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 \ + build/version.o + build/genhooks$(build_exeext) : $(BUILD_ERRORS) # Generated source files for gengtype.