[LLVMdev] ocaml+llvm

Gordon Henriksen gordonhenriksen at mac.com
Mon Aug 13 18:31:25 PDT 2007


On 2007-08-13, at 16:33, Chris Lattner wrote:

>> The biggest problem is a data structure called the frame table, a  
>> simple structure for which LLVM seems ill-prepared. For each call  
>> site in the program, ocaml emits an entry into this table:
>>
>>     key   : the return address of the call site
>>     value : the stack offset of every variable live after return
>>
>> The garbage collector uses this when walking the stack to find  
>> live objects.
>
> I don't think you want to try to have the LLVM code generator build  
> this table.
>
> The table is a contract between the specific codegen you're using  
> and the GC runtime you're using.  This contract is specific to the  
> current ocaml code generator.

Ocaml is compiled statically; this isn't an ephemeral link from JIT  
to runtime as might be the case for a Java or Perl program. Changing  
these structures breaks binary compatibility (including C interop).

> In the LLVM world, you should use the first-class support we  
> already have for accurate GC: http://llvm.org/docs/ 
> GarbageCollection.html
>
> Based on this, you annotate the variables with llvm.gcroot intrinsics,

I'm totally on board with that. The llvm.gc* intrinsics are well- 
designed as hooks for runtime-specific code generation. I just need  
to custom lower llvm.gcroot, too.

> and then walk the stack with the llvm_cg_walk_gcroots function.  
> Note that these are not well tested and probably have holes in  
> them, but these are the interfaces we want to use :)

But here I have to disagree. Quite by design, LLVM lacks an existing  
runtime to leverage: LLVM ­ CLR. In light of that, it is difficult to  
justify ignoring a mature runtime that does exist in order to avoid  
building a simple data structure.

Here are the respective negatives I perceive:

Ditch the frame table and write a new runtime:
- no need to write any interesting LLVM code! [1]
- breaks binary compatibility (including C interop)
- have to write new runtime; llvm's GC is a strawman
- makes an ugly patch, which makes for licensing problems [2]

Tread lightly:
- generated .bc is incompatible with llc due to runtime-specific GC  
codegen

Ñ Gordon


[1] Yes, this is a downside. :) Possibly the dominant one, since this  
is a weekend project.

[2] ocaml is licensed under the QPL [Trolltech/KDE], which has an  
onerous distribution clause which prohibits forks. My current work  
leaves the existing code generator in place, touching only a few  
files to integrate LLVM code generation as a runtime option; this  
improves the possibility that a patch would be accepted, and  
otherwise makes patch maintenance manageable.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070813/e8ca789e/attachment.html>


More information about the llvm-dev mailing list