[LLVMdev] globals in DS graph

Chris Lattner sabre at nondot.org
Mon Nov 25 01:26:01 PST 2002

> Specifically, I wrote the following simple program:
> List *g;
> void alloc_func(){
>   g = ( List* ) malloc( sizeof( List ) );
> }
> void free_func(){
>   free( g );
> }

I don't have an LLVM tree available to me right now (as
tank/llvm.cs.uiuc.edu) is down, so take this with a grain of salt...

> I noticed that the DSnode for g in alloc_func is different from that of
> free_func and NEITHER of them had GlobalNode bit set in their types. Only
> the malloc bit and the incomplete bit have been set. I am completely
> clueless how to figure out if it is a global node or not. I used
> getGlobals and found that the returned map had size 0.

There may be a few different things going on here.  First of all, the
"globals" graph is only partially implemented currently.  Right now, nodes
eligable to be moved to the globals graph are properly removed from the
individual function graphs, but they are never reinserted into the globals
graph.  This can cause some funny disappearances that don't make a lot of
sense, and...

> How can I get the "common" global node of g?

... the common node in this case never gets unified.  This is one of the
top priorities for me when I get back to Illinois (after thanksgiving
break), but it is unlikely to make much progress in the mean time.  If you
would like to disable this behavior, look in the DSGraph::removeDeadNodes
(or similar) in DataStructure.cpp.  In it you will see the code that marks
nodes as being "alive" in the current graph.  All you have to do is add
code to mark all globals as alive, and they will be propogated up to main.
Alternatively, take a look at the CVS revisions a few checkins back to see
when the globals graph stuff was added... and revert it.

I hope this helps some :)



More information about the llvm-dev mailing list