Comments
Patch
===================================================================
@@ -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)
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 <basile@starynkevitch.net> * gengtype.c (walk_type): Emit mark_hook when inside a struct of a union member. ############ Ok for trunk? Regards.