From patchwork Mon Apr 11 01:35:52 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Basile Starynkevitch X-Patchwork-Id: 90546 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 B6F9AB6F16 for ; Mon, 11 Apr 2011 11:37:31 +1000 (EST) Received: (qmail 8331 invoked by alias); 11 Apr 2011 01:37:29 -0000 Received: (qmail 8323 invoked by uid 22791); 11 Apr 2011 01:37:27 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, TW_CP X-Spam-Check-By: sourceware.org Received: from smtp-150-sunday.nerim.net (HELO maiev.nerim.net) (194.79.134.150) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 11 Apr 2011 01:37:22 +0000 Received: from hector.lesours (ours.starynkevitch.net [213.41.244.95]) by maiev.nerim.net (Postfix) with ESMTPS id 012A12E00B; Mon, 11 Apr 2011 03:37:20 +0200 (CEST) Received: from glinka.lesours ([192.168.0.1]) by hector.lesours with smtp (Exim 4.74) (envelope-from ) id 1Q963s-00052h-S0; Mon, 11 Apr 2011 03:37:04 +0200 Date: Mon, 11 Apr 2011 03:35:52 +0200 From: Basile Starynkevitch To: gcc-patches@gcc.gnu.org Cc: Laurynas Biveinis Subject: PATCH [trunk] gengtype should generate ggc_alloc macros in plugin mode on for plugin files Message-Id: <20110411033552.75423cd2.basile@starynkevitch.net> In-Reply-To: <20110408195551.4804bbfe.basile@starynkevitch.net> References: <20110404215335.032d7b9c.basile@starynkevitch.net> <20110408074445.4ee15190.basile@starynkevitch.net> <20110408195551.4804bbfe.basile@starynkevitch.net> 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 On Fri, 8 Apr 2011 19:55:51 +0200 Basile Starynkevitch 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 * 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. 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 {