diff options
author | Basile Starynkevitch <basile@starynkevitch.net> | 2010-10-18 06:05:28 +0000 |
---|---|---|
committer | Basile Starynkevitch <basile@starynkevitch.net> | 2010-10-18 06:05:28 +0000 |
commit | 9642ebfbaa0c49c541064efb89c4f94aed06ce2c (patch) | |
tree | d85a460fd85c97e3d628d911811ed21f00a79509 /gcc/gengtype.c | |
parent | a83c7b37f1c525f1ac43666839f79fb263395bd1 (diff) |
2010-10-18 Basile Starynkevitch <basile@starynkevitch.net>
Jeremie Salvucci <jeremie.salvucci@free.fr>
* gengtype.c (verbosity_level): Added variable.
(set_gc_used): Count variables for verbosity.
(close_output_files): Backing up files, counting written ones
verbosily.
(write_types): Count emitted functions for verbosity. Added
debug messages.
(write_enum_defn): Count structures for verbosity. Added debug
messages.
(gengtype_long_options): Added "verbose" & "backupdir".
(print_usage): Ditto.
(main): Verbose display of parsed files.
* gengtype.h (verbosity_level): Added declaration.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@165609 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gengtype.c')
-rw-r--r-- | gcc/gengtype.c | 128 |
1 files changed, 121 insertions, 7 deletions
diff --git a/gcc/gengtype.c b/gcc/gengtype.c index 3133d657d12..38189ae194c 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -163,6 +163,15 @@ const char *write_state_filename; int do_dump; int do_debug; +/* Level for verbose messages. */ +int verbosity_level; + +/* The backup directory should be in the same file system as the + generated files, otherwise the rename(2) system call would fail. + If NULL, no backup is made when overwriting a generated file. */ +static const char* backup_dir; /* (-B) program option. */ + + static outf_p create_file (const char *, const char *); static const char *get_file_basename (const char *); @@ -1515,9 +1524,15 @@ set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM]) static void set_gc_used (pair_p variables) { + int nbvars = 0; pair_p p; for (p = variables; p; p = p->next) - set_gc_used_type (p->type, GC_USED, NULL); + { + set_gc_used_type (p->type, GC_USED, NULL); + nbvars++; + }; + if (verbosity_level >= 2) + printf ("%s used %d GTY-ed variables\n", progname, nbvars); } /* File mapping routines. For each input file, there is one output .c file @@ -1907,6 +1922,7 @@ is_file_equal (outf_p of) static void close_output_files (void) { + int nbwrittenfiles = 0; outf_p of; for (of = output_files; of; of = of->next) @@ -1914,18 +1930,46 @@ close_output_files (void) if (!is_file_equal (of)) { - FILE *newfile = fopen (of->name, "w"); + FILE *newfile = NULL; + char *backupname = NULL; + /* Back up the old version of the output file gt-FOO.c as + BACKUPDIR/gt-FOO.c~ if we have a backup directory. */ + if (backup_dir) + { + backupname = concat (backup_dir, "/", + lbasename (of->name), "~", NULL); + if (!access (of->name, F_OK) && rename (of->name, backupname)) + fatal ("failed to back up %s as %s: %s", + of->name, backupname, xstrerror (errno)); + } + + newfile = fopen (of->name, "w"); if (newfile == NULL) fatal ("opening output file %s: %s", of->name, xstrerror (errno)); if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused) fatal ("writing output file %s: %s", of->name, xstrerror (errno)); if (fclose (newfile) != 0) fatal ("closing output file %s: %s", of->name, xstrerror (errno)); + nbwrittenfiles++; + if (verbosity_level >= 2 && backupname) + printf ("%s wrote #%-3d %s backed-up in %s\n", + progname, nbwrittenfiles, of->name, backupname); + else if (verbosity_level >= 1) + printf ("%s write #%-3d %s\n", progname, nbwrittenfiles, of->name); + free (backupname); + } + else + { + /* output file remains unchanged. */ + if (verbosity_level >= 2) + printf ("%s keep %s\n", progname, of->name); } free (of->buf); of->buf = NULL; of->bufused = of->buflength = 0; } + if (verbosity_level >= 1) + printf ("%s wrote %d files.\n", progname, nbwrittenfiles); } struct flist @@ -2801,6 +2845,7 @@ static void write_types (outf_p output_header, type_p structures, type_p param_structs, const struct write_types_data *wtd) { + int nbfun = 0; /* Count the emitted functions. */ type_p s; oprintf (output_header, "\n/* %s*/\n", wtd->comment); @@ -2890,11 +2935,29 @@ write_types (outf_p output_header, type_p structures, type_p param_structs, { type_p ss; for (ss = s->u.s.lang_struct; ss; ss = ss->next) - write_func_for_structure (s, ss, NULL, wtd); + { + nbfun++; + DBGPRINTF ("writing func #%d lang_struct ss @ %p '%s'", + nbfun, (void*) ss, ss->u.s.tag); + write_func_for_structure (s, ss, NULL, wtd); + } } else - write_func_for_structure (s, s, NULL, wtd); + { + nbfun++; + DBGPRINTF ("writing func #%d struct s @ %p '%s'", + nbfun, (void*) s, s->u.s.tag); + write_func_for_structure (s, s, NULL, wtd); + } } + else + { + /* Structure s is not possibly pointed to, so can be ignored. */ + DBGPRINTF ("ignored s @ %p '%s' gc_used#%d", + (void*)s, s->u.s.tag, + (int) s->gc_used); + } + for (s = param_structs; s; s = s->next) if (s->gc_used == GC_POINTED_TO) { @@ -2906,11 +2969,30 @@ write_types (outf_p output_header, type_p structures, type_p param_structs, { type_p ss; for (ss = stru->u.s.lang_struct; ss; ss = ss->next) - write_func_for_structure (s, ss, param, wtd); + { + nbfun++; + DBGPRINTF ("writing func #%d param lang_struct ss @ %p '%s'", + nbfun, (void*) ss, ss->u.s.tag); + write_func_for_structure (s, ss, param, wtd); + } } else - write_func_for_structure (s, stru, param, wtd); + { + nbfun++; + DBGPRINTF ("writing func #%d param struct s @ %p stru @ %p '%s'", + nbfun, (void*) s, + (void*) stru, stru->u.s.tag); + write_func_for_structure (s, stru, param, wtd); + } + } + else + { + /* Param structure s is not pointed to, so should be ignored. */ + DBGPRINTF ("ignored s @ %p", (void*)s); } + if (verbosity_level >= 2) + printf ("%s emitted %d routines for %s\n", + progname, nbfun, wtd->comment); } static const struct write_types_data ggc_wtd = { @@ -3100,6 +3182,8 @@ static void write_enum_defn (type_p structures, type_p param_structs) { type_p s; + int nbstruct = 0; + int nbparamstruct = 0; if (!header_file) return; @@ -3108,6 +3192,12 @@ write_enum_defn (type_p structures, type_p param_structs) for (s = structures; s; s = s->next) if (USED_BY_TYPED_GC_P (s)) { + nbstruct++; + DBGPRINTF ("write_enum_defn s @ %p nbstruct %d", + (void*) s, nbstruct); + if (UNION_OR_STRUCT_P (s)) + DBGPRINTF ("write_enum_defn s %p #%d is unionorstruct tagged %s", + (void*) s, nbstruct, s->u.s.tag); oprintf (header_file, " gt_ggc_e_"); output_mangled_typename (header_file, s); oprintf (header_file, ",\n"); @@ -3115,12 +3205,19 @@ write_enum_defn (type_p structures, type_p param_structs) for (s = param_structs; s; s = s->next) if (s->gc_used == GC_POINTED_TO) { + nbparamstruct++; + DBGPRINTF ("write_enum_defn s %p nbparamstruct %d", + (void*) s, nbparamstruct); oprintf (header_file, " gt_e_"); output_mangled_typename (header_file, s); oprintf (header_file, ",\n"); } oprintf (header_file, " gt_types_enum_last\n"); oprintf (header_file, "};\n"); + if (verbosity_level >= 2) + printf ("%s handled %d GTY-ed structures & %d parameterized structures.\n", + progname, nbstruct, nbparamstruct); + } /* Might T contain any non-pointer elements? */ @@ -4289,10 +4386,12 @@ dump_everything (void) static const struct option gengtype_long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, + {"verbose", no_argument, NULL, 'v'}, {"dump", no_argument, NULL, 'd'}, {"debug", no_argument, NULL, 'D'}, {"plugin", required_argument, NULL, 'P'}, {"srcdir", required_argument, NULL, 'S'}, + {"backupdir", required_argument, NULL, 'B'}, {"inputs", required_argument, NULL, 'I'}, {"read-state", required_argument, NULL, 'r'}, {"write-state", required_argument, NULL, 'w'}, @@ -4309,11 +4408,14 @@ print_usage (void) printf ("\t -D | --debug " " \t# Give debug output to debug %s itself.\n", progname); printf ("\t -V | --version " " \t# Give version information.\n"); + printf ("\t -v | --verbose \t# Increase verbosity. Can be given several times.\n"); printf ("\t -d | --dump " " \t# Dump state for debugging.\n"); printf ("\t -P | --plugin <output-file> <plugin-src> ... " " \t# Generate for plugin.\n"); printf ("\t -S | --srcdir <GCC-directory> " " \t# Specify the GCC source directory.\n"); + printf ("\t -B | --backupdir <directory> " + " \t# Specify the backup directory for updated files.\n"); printf ("\t -I | --inputs <input-list> " " \t# Specify the file with source files list.\n"); printf ("\t -w | --write-state <state-file> " " \t# Write a state file.\n"); @@ -4332,7 +4434,7 @@ static void parse_program_options (int argc, char **argv) { int opt = -1; - while ((opt = getopt_long (argc, argv, "hVdP:S:I:w:r:D", + while ((opt = getopt_long (argc, argv, "hVvdP:S:B:I:w:r:D", gengtype_long_options, NULL)) >= 0) { switch (opt) @@ -4349,6 +4451,9 @@ parse_program_options (int argc, char **argv) case 'D': /* --debug */ do_debug = 1; break; + case 'v': /* --verbose */ + verbosity_level++; + break; case 'P': /* --plugin */ if (optarg) plugin_output_filename = optarg; @@ -4362,6 +4467,12 @@ parse_program_options (int argc, char **argv) fatal ("missing source directory"); srcdir_len = strlen (srcdir); break; + case 'B': /* --backupdir */ + if (optarg) + backup_dir = optarg; + else + fatal ("missing backup directory"); + break; case 'I': /* --inputs */ if (optarg) inputlist = optarg; @@ -4470,6 +4581,9 @@ main (int argc, char **argv) parse_file (gt_files[i]); DBGPRINTF ("parsed file #%d %s", (int) i, gt_files[i]); } + if (verbosity_level >= 1) + printf ("%s parsed %d files\n", progname, (int) num_gt_files); + DBGPRINT_COUNT_TYPE ("structures after parsing", structures); DBGPRINT_COUNT_TYPE ("param_structs after parsing", param_structs); |