Hello All, As I observed in http://gcc.gnu.org/ml/gcc/2010-07/msg00248.html and in http://gcc.gnu.org/ml/gcc/2012-10/msg00003.html the mark_hook GTY annotation is sometimes incorrectly ingored by gengtype.
The example in http://gcc.gnu.org/ml/gcc/2012-10/msg00003.html demonstrates that incorrect behavior of gengtype (both with gengtype from GCC 4.7, and with the current trunk's gengtype). For simplicity, here is it again: /* file tmarkh.h */ #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 tmarkh.h */ when running gengtype (the one from the trunk, or the gcc-4.7 one) with gengtype -D -v -r gtype.state -P _g-tmarkh.h tmarkh.h you can observe that the generated _g-tmarkh.h don't contain any call to mymarker. If the static variable (here myutestptr) is declared with the struct mytest_st* type, the marker is emitted. The reason of that bug is that for GTY-ed union members which are themselves GTY-ed struct, the marking of the nested struct is generated inline (for the union) and in that case the mark_hook annotation was not used. The attached patch to trunk svn rev 191972 solves this issue (with it, the generated _g-tmarkh.h is correctly calling mymarker). The gcc/ChangeLog entry is: ############ 2012-10-02 Basile Starynkevitch <bas...@starynkevitch.net> * gengtype.c (walk_type): Emit mark_hook when inside a struct of a union member. ############ 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} ***
Index: gcc-trunk-bstarynk/gcc/gengtype.c =================================================================== --- gcc-trunk-bstarynk/gcc/gengtype.c (revision 191972) +++ gcc-trunk-bstarynk/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 *structmarkhook = 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 (!structmarkhook && strcmp(o->name, "mark_hook") == 0 + && o->kind == OPTION_STRING) + structmarkhook = o->info.string; + if (structmarkhook) + oprintf (d->of, "%*s/*structmarkhook %s */ %s (&%s));\n", + d->indent, "", t->u.s.tag, structmarkhook, oldval); + d->prev_val[2] = oldval; d->prev_val[1] = oldprevval2; if (union_p)