<br><div class="gmail_quote">On 31 January 2010 17:08, Jeffrey Yasskin <span dir="ltr"><<a href="mailto:jyasskin@google.com">jyasskin@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
You should look at<br>
<a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITMemoryManager.h?view=markup" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITMemoryManager.h?view=markup</a><br>

and see if inheriting from that and overriding allocateGlobal() will<br>
do what you want.<br></blockquote><div>Thanks - I'll take a look at it. <br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
I'm a little surprised the boehm gc doesn't already see the globals,<br>
since there's a reference to their memory from the JMM, but maybe it<br>
doesn't scan mmap regions by default.<br></blockquote>I believe that Boehm GC will scan data sections in the main ELF executable and in any loaded shared objects and also scan machine registers and the stack down to (roughly) the stack top at program entry but it won't scan anything else unless it's explictly told to. If the JMM gets the memory that global variables are stored in via malloc or mmap then I'll need to add it to the GC root set via GC_add_roots.<br>
<br>Having said that, since I know the exact set of global variables in my compiled program it may be more efficient for me to give the GC this exact set rather than the entire JMM area(s), provided I can ensure that the GC knows of the existence of each global before any reference to a garbage collected object is stored in in.<br>
<br>-- James<br><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="im">
On Sun, Jan 31, 2010 at 6:12 AM, James Williams <<a href="mailto:junk@giantblob.com">junk@giantblob.com</a>> wrote:<br>
> I've implemented this by adding calls to GC_add_roots(<first global in<br>
> module>,<last global in module>+1) to the llvm.global_ctors before any other<br>
> static initialization code for the module.<br>
><br>
> This should be safe assuming that:<br>
> - global variables are laid out in memory in the order they appear in their<br>
> module (and ideally contiguously without being interleaved with any other<br>
> values)<br>
<br>
</div>This isn't necessarily the case. The default JMM allocates slabs with<br>
mmap, which doesn't guarantee that they're in order.<br>
<div class="im"><br>
> - llvm.global_ctors for a given module is run before any other code can<br>
> reference static variables belonging to that module.<br>
<br>
</div>llvm.global_ctors runs when you call<br>
runStaticConstructorsDestructors(false), which lli does before running<br>
any other user code. There could be other global constructors that<br>
access the globals, though, before your constructor runs.<br>
<div class="im"><br>
> Can anyone confirm if I can rely on these assumptions?<br>
><br>
> -- James<br>
><br>
><br>
> On 31 January 2010 12:53, James Williams <<a href="mailto:junk@giantblob.com">junk@giantblob.com</a>> wrote:<br>
>><br>
>> Hi,<br>
>><br>
>> I'm running LLVM bitcode generated by my compiler under lli. The bitcode<br>
>> is linked against Boehm GC (lli -load=/usr/lib/libgc.so).<br>
>><br>
>> It looks like Boehm GC isn't scanning global variables and as a result<br>
>> objects referenced only through globals are being prematurely collected. I<br>
>> understand that Boehm GC needs to see the data segment containing my global<br>
>> variables as a root. For native executables It's smart enough to pick this<br>
>> up from the sections in the ELF executable but this doesn't apply when LLVM<br>
>> bitcode is running under lli.<br>
>><br>
>> Is there some way I can hook into the code generator's placement of new<br>
>> data segments as bitcode is compiled to native code so I can add roots for<br>
>> the segments as required by Boehm GC?<br>
>><br>
>> Thanks in advance,<br>
>> -- James Williams<br>
><br>
><br>
</div>> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
><br>
><br>
<br>
</blockquote></div><br>