On Fri, 8 Apr 2011 19:55:51 +0200
Basile Starynkevitch <[email protected]> wrote:
> Committed revision 172203 (on trunk).
>
> Actually, the above committed patch is better than nothing, but not
> perfect. It happens to generate ggc_alloc macros for things which are
> not defined in the plugin (however, this is not a big deal in practice,
> since it generates some macros in common with those inside
> gtype-desc.h).
>
> I have no clear idea on how to improve it. We could for instance write
> the ggc_alloc macros only for struct & typedefs defined in the plugin
> files. We then would need a way to know if a file is a plugin file or
> not. What do you think?
The attached file improves the situation, by flagging input files and
generating ggc_alloc macros only relevant to plugin files.
########## gcc/ChangeLog entry #####
2011-04-11 Basile Starynkevitch <[email protected]>
* gengtype.h (struct input_file_st): Add inpisplugin field.
(type_fileloc): New function.
* gengtype.c
(write_typed_struct_alloc_def): Add gcc_assert.
(write_typed_alloc_defns): Ditto. Don't output for plugin files.
(write_typed_alloc_defns): Don't output for plugin files.
(input_file_by_name): Clear inpisplugin field.
(main): Set inpisplugin field for plugin files.
########
Comments are welcome. Ok for trunk with what changes?
Regards.
--
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 mine, sont seulement les miennes} ***
Index: gcc/gengtype.c
===================================================================
--- gcc/gengtype.c (revision 172252)
+++ gcc/gengtype.c (working copy)
@@ -4235,6 +4235,7 @@ write_typed_struct_alloc_def (outf_p f,
enum alloc_quantity quantity,
enum alloc_zone zone)
{
+ gcc_assert (UNION_OR_STRUCT_P(s));
write_typed_alloc_def (f, variable_size_p (s), get_type_specifier (s),
s->u.s.tag, allocator_type, quantity, zone);
}
@@ -4269,6 +4270,13 @@ write_typed_alloc_defns (outf_p f,
{
if (!USED_BY_TYPED_GC_P (s))
continue;
+ gcc_assert (s->kind == TYPE_STRUCT || s->kind == TYPE_UNION
+ || s->kind == TYPE_LANG_STRUCT);
+ /* In plugin mode onput output ggc_alloc macro definitions
+ relevant to plugin input files. */
+ if (nb_plugin_files > 0
+ && ((s->u.s.line.file == NULL) || !s->u.s.line.file->inpisplugin))
+ continue;
write_typed_struct_alloc_def (f, s, "", single, any_zone);
write_typed_struct_alloc_def (f, s, "cleared_", single, any_zone);
write_typed_struct_alloc_def (f, s, "vec_", vector, any_zone);
@@ -4287,6 +4295,14 @@ write_typed_alloc_defns (outf_p f,
s = p->type;
if (!USED_BY_TYPED_GC_P (s) || (strcmp (p->name, s->u.s.tag) == 0))
continue;
+ /* In plugin mode onput output ggc_alloc macro definitions
+ relevant to plugin input files. */
+ if (nb_plugin_files > 0)
+ {
+ struct fileloc* filoc = type_fileloc(s);
+ if (!filoc || !filoc->file->inpisplugin)
+ continue;
+ };
write_typed_typedef_alloc_def (f, p, "", single, any_zone);
write_typed_typedef_alloc_def (f, p, "cleared_", single, any_zone);
write_typed_typedef_alloc_def (f, p, "vec_", vector, any_zone);
@@ -4814,6 +4830,7 @@ input_file_by_name (const char* name)
f = XCNEWVAR (input_file, sizeof (input_file)+namlen+2);
f->inpbitmap = 0;
f->inpoutf = NULL;
+ f->inpisplugin = 0;
strcpy (f->inpname, name);
slot = htab_find_slot (input_file_htab, f, INSERT);
gcc_assert (slot != NULL);
@@ -4945,8 +4962,11 @@ main (int argc, char **argv)
/* Parse our plugin files and augment the state. */
for (ix = 0; ix < nb_plugin_files; ix++)
- parse_file (get_input_file_name (plugin_files[ix]));
-
+ {
+ input_file* pluginput = plugin_files [ix];
+ pluginput->inpisplugin = true;
+ parse_file (get_input_file_name (pluginput));
+ }
if (hit_error)
return 1;
Index: gcc/gengtype.h
===================================================================
--- gcc/gengtype.h (revision 172252)
+++ gcc/gengtype.h (working copy)
@@ -33,6 +33,7 @@ struct input_file_st
struct outf* inpoutf; /* Cached corresponding output file, computed
in get_output_file_with_visibility. */
lang_bitmap inpbitmap; /* The set of languages using this file. */
+ bool inpisplugin; /* Flag set for plugin input files. */
char inpname[1]; /* A variable-length array, ended by a null
char. */
};
@@ -304,6 +305,7 @@ struct type {
} u;
};
+
/* The one and only TYPE_STRING. */
extern struct type string_type;
@@ -328,6 +330,19 @@ extern struct type scalar_char;
+/* Give the file location of a type, if any. */
+static inline struct fileloc*
+type_fileloc (type_p t)
+{
+ if (!t)
+ return NULL;
+ if (UNION_OR_STRUCT_P(t))
+ return &t->u.s.line;
+ if (t->kind == TYPE_PARAM_STRUCT)
+ return &t->u.param_struct.line;
+ return NULL;
+}
+
/* Structure representing an output file. */
struct outf
{