On Fri, 21 Oct 2011 10:43:29 +0200
Richard Guenther <richard.guent...@gmail.com> wrote:
> So there is no inherent limitation with the GGC machinery.

There are at least some annoyances:

If a C++ class is GTY-ed, or is pointed by a field inside a GTY-ed struct, and 
if
that class contains for example a PPL data (or simply if a GTY-ed struct 
contains a PPL
data) we need to have the PPL destuctor invoked when Ggc release the struct.

To be more specific, if you want to associate trees with PPL coefficients (in a 
way
visible to several passes, so using Ggc), you will declare in C 

struct GTY (()) treewithcoef_st {
    tree tr;
    ppl_Coefficient_t co;
};

it will leak, because <ppl_c.h> requires that when the field co is no more 
useful, it
should be released with 
  ppl_delete_Coefficient (p->co);
[since actually ppl_Coefficient_t is an opaque non null pointer to some C++ 
class of PPL]

and, assuming the struct treewithcoef_st is used in several passes, the sure 
way to know
when to delete is is thru the Ggc collector (if we always knew when exactly to 
destroy our
treewithcoef_st we won't use GTY on them). Si you want the Ggc collector to call
ppl_delete_Coefficient, and there is no simple way to do that today.

There is however a contrived way (used inside MELT), thru the plugin hooks: 
manage the
set of such struct treewithcoef_st (perhaps in a linked list, or an hash table, 
or a VEC,
or whatever), and
  use the PLUGIN_GGC_START & PLUGIN_GGC_MARKING event, possibly also 
PLUGIN_GGC_END
  add the GTY((mark_hook("some_marking_hook_for_treewithcoef")) gengtype 
annotation 
  to struct treewithcoef_st
at the PLUGIN_GGC_END event, scan this collection of struct treewithcoef_st and 
call
ppl_delete_Coefficient on approriate elements.

With finalizer inside Ggc, we could make that much simpler & more efficient 
(because the
PLUGIN_GGC_* tricks essentially reimplement a mark & sweep collector for our 
struct
treewithcoef_st): we could allocate our struct treewithcoef_st by giving a 
finalizer for
them which calls ppl_delete_Coefficient (p->co)

and later we could even enhance gengtype to be able at least to give the 
finalizer, or
even to support C++ objects with non-trivial destructors.

And indeed, using PPL data shared between several passes is my main motivation.

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 mine, sont seulement les miennes} ***

Reply via email to