Hello All, I am in the process of merging 4.6 (i.e. current trunk) into the GCC MELT branch. However, I want very much the same source code to be able to run as a plugin to 4.5 & as a plugin to 4.6. So precisely, I want to have gcc/melt-runtime.c from the MELT branch compilable as a plugin melt.so both for GCC 4.5 & for GCC 4.6. Of course I am only speaking of *source* compatibility (I do not want the *same* melt.so shared object binary to be usable as a plugin for both 4.5 & 4.6, and I believe it is not possible and should not be wished; obviously compiling melt-runtime.c to melt.so would need different flags for 4.5 & 4.6).
For those unfamiliar with MELT http://gcc.gnu.org/wiki/MELT it is a lispy domain specific language to code GCC extensions in, with powerful pattern matching suitable to match GCC tree-s & gimple-s etc., translated (by itself) into C code suitable for GCC. MELT has its own copying garbage collector, built above ggc (so the copying is done from the MELT nursery, and the old generation is GGC's heap). The minor issue is to distinguish compilation for 4.5 from compilation for 4.6. I believe that a simple trick like below is enough. This is code I am adding inside my gcc/melt-runtime.h /*** NOTE: june 2010. GCC 4.6 has a new typed garbage collected allocator; so any GTY-ed struct FOO_ST should be allocated using ggc_alloc_FOO_ST or ggc_alloc_cleared_FOO_ST. ***/ #if BUILDING_GCC_VERSION >= 4006 && defined(ggc_alloc_typed) #define MELT_HAS_TYPED_GGC_ALLOC 1 #else #define MELT_HAS_TYPED_GGC_ALLOC 0 #endif By the way, perhaps defined(ggc_alloc_typed) would be enough above. Of course the GGC allocation code should be different. For instance, in my gcc/melt-runtime.c the function forwarded_copy would contain the following piece of code, where struct meltobject_st is a GTY-ed struct from gcc/melt-runtime.h #if MELT_HAS_TYPED_GGC_ALLOC struct meltobject_st *dst = ggc_alloc_cleared_meltobject_st (oblen * sizeof (src->obj_vartab[0])); #else /*!MELT_HAS_TYPED_GGC_ALLOC*/ struct meltobject_st *dst = (struct meltobject_st *) ggc_alloc_cleared (offsetof (struct meltobject_st, obj_vartab) + oblen * sizeof (src->obj_vartab[0])); #endif /*MELT_HAS_TYPED_GGC_ALLOC*/ MELT uses a lot of "varying size" structures. For example MELT objects are declared as typedef union melt_un *melt_ptr_t; typedef struct meltobject_st *meltobject_ptr_t; struct GTY ((variable_size)) meltobject_st { /* for objects, the discriminant is their class */ meltobject_ptr_t obj_class; unsigned obj_hash; /* hash code of the object */ unsigned short obj_num; /* discriminate the melt_un containing it as discr */ #define object_magic obj_num unsigned short obj_len; melt_ptr_t GTY ((length ("%h.obj_len"))) obj_vartab[FLEXIBLE_DIM]; }; A small but annoying issue is that GCC 4.5's gengtype does not accept the variable_size annotation, and I would want to have it ignore it. As far as I know, gengtype don't like CPP conditionals; what I really want is something like: #if MELT_HAS_TYPED_GGC_ALLOC struct GTY ((variable_size)) #else struct GTY (()) #endif meltobject_st { /* for objects, the discriminant is their class */ meltobject_ptr_t obj_class; unsigned obj_hash; /* hash code of the object */ unsigned short obj_num; /* discriminate the melt_un containing it as discr */ #define object_magic obj_num unsigned short obj_len; melt_ptr_t GTY ((length ("%h.obj_len"))) obj_vartab[FLEXIBLE_DIM]; }; But I am not sure it would work. What is the status of gengtype with respect to preprocessor conditionals? A possible hack for that would be to change in GCC 4.5.1 gengtype the error build/gengtype /usr/src/Lang/basile-melt-gcc/gcc gtyp-input.list /usr/src/Lang/basile-melt-gcc/gcc/melt-runtime.h:431: unknown option `variable_size' to a warning, perhaps specific to variable_size, something like /usr/src/Lang/basile-melt-gcc/gcc/melt-runtime.h:431: warning: `variable_size' is ignored Is that possible, or is GCC 4.5.1 gengtype code frozen for every 4.5.x? Other comments are welcome. Cheers. PS. I think this discussion is of general interest, because I could imagine that some plugins will try hard to be compilable & used both on gcc 4.5 & gcc 4.6. Of course, we cannot guarantee that it is doable in the general case. -- 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} ***