On Wed, Oct 03, 2012 at 12:21:02PM +0300, Laurynas Biveinis wrote: > Hello Basile - > > > 2012-10-02 Basile Starynkevitch <bas...@starynkevitch.net> > > > > * gengtype.c (walk_type): Emit mark_hook when inside a > > struct of a union member. > > Can you send me off-list the gengtype output before and after the fix?
I messed something, the example I did send was wrong. Let's start all over again. Consider the following file (I named this example on purpose differently than in the previous message) #################### /* file basilemarkh.h */ struct GTY ((mark_hook("mymarker"))) mytest_st { int myflag; tree mytree; gimple mygimple; }; #define MYUTAG 1 union GTY ((desc ("%0.u_int"))) myutest_un { int GTY ((skip)) u_int; struct mytest_st GTY ((tag ("MYUTAG"))) u_mytest; }; static GTY (()) union myutest_un *myutestptr; static inline void mymarker (struct mytest_st *s) { s->myflag = 1; } /* eof basilemarkh.h */ ################### With the gengtype from 4.7 in Debian/Sid/AMD64 (a 4.7.2 I believe) /usr/lib/gcc/x86_64-linux-gnu/4.7/gengtype -D -v \ -r /usr/lib/gcc/x86_64-linux-gnu/4.7/gtype.state \ -P _g-4.7-basilemarkh.h basilemarkh.h #### from generated _g-4.7-basilemarkh.h /* functions code */ void gt_ggc_mx_myutest_un (void *x_p) { union myutest_un * const x = (union myutest_un *)x_p; if (ggc_test_and_set_mark (x)) { switch ((*x).u_int) { case MYUTAG: //// ###### no mark hook here, should have a call to mymarker gt_ggc_m_9tree_node ((*x).u_mytest.mytree); gt_ggc_m_18gimple_statement_d ((*x).u_mytest.mygimple); break; default: break; } } } ### end of excerpt from generated _g-4.7-basilemarkh.h With the gengtype from unpatched trunk svn rev 192031 the emitted gt_ggc_mx_myutest_un is exactly the same. Of course the //// ### comment above has been added manually by me Basile. So I applied and I am proposing the following patch to gcc trunk 192031 (Laurynas, I did take your remarks into account) ##### patch to trunk Index: gcc/gengtype.c =================================================================== --- gcc/gengtype.c (revision 192031) +++ gcc/gengtype.c (working copy) @@ -2810,6 +2810,7 @@ walk_type (type_p t, struct walk_type_data *d) const char *oldval = d->val; const char *oldprevval1 = d->prev_val[1]; const char *oldprevval2 = d->prev_val[2]; + const char *struct_mark_hook = NULL; const int union_p = t->kind == TYPE_UNION; int seen_default_p = 0; options_p o; @@ -2833,7 +2834,14 @@ walk_type (type_p t, struct walk_type_data *d) if (!desc && strcmp (o->name, "desc") == 0 && o->kind == OPTION_STRING) desc = o->info.string; + else if (!struct_mark_hook && strcmp (o->name, "mark_hook") == 0 + && o->kind == OPTION_STRING) + struct_mark_hook = o->info.string; + if (struct_mark_hook) + oprintf (d->of, "%*s%s (&%s));\n", + d->indent, "", struct_mark_hook, oldval); + d->prev_val[2] = oldval; d->prev_val[1] = oldprevval2; if (union_p) ##### end of patch with the following ChangeLog entry ##### gcc/ChangeLog entry 2012-10-03 Basile Starynkevitch <bas...@starynkevitch.net> * gengtype.c (walk_type): Emit mark_hook when inside a struct of a union member. ##### end of gcc/ChangeLog entry If you apply my proposed patch the emitted function is ### from generated _gtrunk-basilemarkh.h with my patch to gengtype.c /* functions code */ void gt_ggc_mx_myutest_un (void *x_p) { union myutest_un * const x = (union myutest_un *)x_p; if (ggc_test_and_set_mark (x)) { switch ((*x).u_int) { case MYUTAG: mymarker (&(*x).u_mytest)); gt_ggc_m_9tree_node ((*x).u_mytest.mytree); gt_ggc_m_18gimple_statement_d ((*x).u_mytest.mygimple); break; default: break; } } } #### end of excerpt from generated _gtrunk-basilemarkh.h If you just use the gengtype from trunk 192031 without my patch you get the same code as from gcc-4.7's gengtype: #### from generated _g192031-basilemarkh.h void gt_ggc_mx_myutest_un (void *x_p) { union myutest_un * const x = (union myutest_un *)x_p; if (ggc_test_and_set_mark (x)) { switch ((*x).u_int) { case MYUTAG: gt_ggc_m_9tree_node ((*x).u_mytest.mytree); gt_ggc_m_18gimple_statement_d ((*x).u_mytest.mygimple); break; default: break; } } } ### end of excerpt from generated _g192031-basilemarkh.h Is my patch here ok for trunk? 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 mines, sont seulement les miennes} ***