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