GCC Garbage Collection
Brendon Costa
bcosta@avdat.com.au
Tue Nov 14 00:09:00 GMT 2006
Mike Stump wrote:
> On Nov 12, 2006, at 10:47 PM, Brendon Costa wrote:
>
>> I think i am having trouble with the garbage collector deleting
>> the memory for tree nodes that i am still using.
>
>
> You must have a reference to that data from gc managed memory. If
> you don't use use gc to allocate the data structures, it just won't
> work. In addition, the roots of all such data structures have to be
> findable from the gc roots. The compiler is littered with examples
> of how to do this, as an example:
>
> static GTY(()) tree block_clear_fn;
>
> is findable by the gc system. All data findable from this tree, will
> be findable by the GC system.
>
> If you _must_ have references outside gc, you can do this, if there
> is at least 1 reference within the gc system. For example, if you do:
>
> static GTY(()) tree my_refereces;
>
> void note_reference(tree decl) {
> my_references = tree_cons (NULL_TREE, decl, my_references);
> }
>
> and call note_reference (decl) for every single bit you save a
> reference to, it'll work. Actually, no, it won't work, precompiled
> headers will fail to work because you'd need to modify the PCH writer
> to write your data, because you didn't mark your data structures with
> GTY and didn't use gc to allocate them. See the preprocessor for an
> example of code that doesn't use GTY and yet writes the data out for
> PCH files.
>
>
Thanks for the help.
I used the idea you showed above and it seems to work (I dont understand
enough to know why you say it wont work and thus this email). I did this
by adding the note_reference() function to except.c as a quick hack so I
did not have to modify the build files at all.
Eventually I plan on trying to update my code to perform all calculation
at the time it finds a given node. This will reduce memory usage as the
nodes will not have to remain around after this. For now as a hack I
might keep this code in my patched except.c file.
I dont think I understand the relationship between the PCH files and the
garbage collector. I thought that the PCH files were the gt-*.h files
which are generated, though I have no idea what is placed in them
except. I think it somehow does some black magic to let the garbage
collector know what does and does not need to be cleaned up, but in
reality I have no idea.
None of my data structures are being managed by the garbage collector, i
manually malloc and free them so I figured that I did not need to worry
about modifying a PCH writer to cater for them? The only thing being
used with the garbage collector are existing tree nodes which from what
I understand should already have all infrustructure to achieve this...
So now when i create a instance of TypeInfo
struct TypeInfoStruct
{
tree node;
....
};
typedef TypeInfoStruct TypeInfo;
I also now call note_reference() with the node that I store in the type
info struct which ensures that the garbage collector knows there is at
least 1 reference to this tree node and so does not destroy it.
Thanks again for the help. Sorry that I dont understand how this works.
I am still trying to learn more about GCC hacking.
Brendon.
More information about the Gcc
mailing list