diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0fdb7d09115..ac2045b7091e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-09-29 Basile Starynkevitch + Rafael Avila de Espindola + + * gengtype.c (plugin_output): New. + (get_output_file_with_visibility): Return plugin_output for plugins. + (main): Parse and use the -P option. + * gty.texi: Update the command line format. + 2009-09-29 Jakub Jelinek PR debug/41438 diff --git a/gcc/doc/gty.texi b/gcc/doc/gty.texi index b59d5f3d35e9..56da9b55fc97 100644 --- a/gcc/doc/gty.texi +++ b/gcc/doc/gty.texi @@ -451,11 +451,10 @@ somewhere. It will be called @file{gtype-@var{lang}.h}, where @var{lang} is the name of the subdirectory the language is contained in. Plugins can add additional root tables. Run the @code{gengtype} -utility in plugin mode as @code{gengtype -p @var{source-dir} +utility in plugin mode as @code{gengtype -P pluginout.h @var{source-dir} @var{file-list} @var{plugin*.c}} with your plugin files -@var{plugin*.c} using @code{GTY} to generate the corresponding -@var{gt-plugin*.h} files. The GCC build tree is needed to be present in -that mode. +@var{plugin*.c} using @code{GTY} to generate the @var{pluginout.h} file. +The GCC build tree is needed to be present in that mode. @node Invoking the garbage collector diff --git a/gcc/gengtype.c b/gcc/gengtype.c index 0b5def73b4ec..bb067368db46 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -145,6 +145,8 @@ static outf_p output_files; directory. */ static char** plugin_files; static size_t nb_plugin_files; +/* the generated plugin output name & file */ +static outf_p plugin_output; /* The output header file that is included into pretty much every source file. */ @@ -1714,15 +1716,14 @@ get_output_file_with_visibility (const char *input_file) /* In plugin mode, return NULL unless the input_file is one of the plugin_files. */ - if (plugin_files && nb_plugin_files > 0) - { - int ix= -1; + if (plugin_files) + { size_t i; - for (i = 0; i < nb_plugin_files && ix < 0; i++) - if (strcmp (input_file, plugin_files[i]) == 0) - ix = i; - if (ix < 0) - return NULL; + for (i = 0; i < nb_plugin_files; i++) + if (strcmp (input_file, plugin_files[i]) == 0) + return plugin_output; + + return NULL; } /* Determine the output file name. */ @@ -3667,20 +3668,24 @@ main (int argc, char **argv) size_t i; static struct fileloc pos = { this_file, 0 }; char* inputlist = 0; + outf_p output_header; + char* plugin_output_filename = NULL; /* fatal uses this */ progname = "gengtype"; - if (argc >= 5 && !strcmp (argv[1], "-p")) + if (argc >= 6 && !strcmp (argv[1], "-P")) { - srcdir = argv[2]; - inputlist = argv[3]; - nb_plugin_files = argc-4; + 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 + 4]; + 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); @@ -3692,7 +3697,8 @@ main (int argc, char **argv) inputlist = argv[2]; } else - fatal ("usage: gengtype [-p] srcdir input-list [file1 file2 ... fileN]"); + fatal ("usage: gengtype [-P pluginout.h] srcdir input-list " + "[file1 file2 ... fileN]"); srcdir_len = strlen (srcdir); @@ -3728,7 +3734,8 @@ main (int argc, char **argv) open_base_files (); write_enum_defn (structures, param_structs); - write_types (header_file, structures, param_structs, &ggc_wtd); + output_header = plugin_output ? plugin_output : header_file; + write_types (output_header, structures, param_structs, &ggc_wtd); if (plugin_files == NULL) { write_types (header_file, structures, param_structs, &pch_wtd);