[LLVMdev] OCaml

Gordon Henriksen gordonhenriksen at mac.com
Sun Nov 25 04:23:42 PST 2007


Jon,

On 2007-11-24, at 21:58, Jon Harrop wrote:

> I just took another look at the LLVM project and it has come along  
> in leaps and bounds since I last looked. I've been working through  
> the (awesome!) tutorial and am now really hyped about the project.

Excellent!

> I am particularly interested in using LLVM to write compilers for  
> OCaml-like languages in OCaml-like languages. This requires some  
> core functionality that would be generically useful:

Your first two points haven't gotten much treatment yet, so…

> - Garbage collection tuned for functional programming

http://llvm.org/docs/GarbageCollection.html

I've been doing some interesting work on this front. Getting Lattner- 
cycles to have it reviewed and integrated is probably the biggest  
challenge; LLVM is a joy to work with even on major surgery like  
this. :)

The goal is that LLVM should be able to take care of the code  
generation aspects of GC while leaving the runtime open-ended. It  
would be nice to provide a GC runtime along with LLVM, but I'm not  
entirely certain how realistic that is given how intertwined GC is  
with the object model. All of this is thoroughly treated in the above  
doc.

Can you elaborate on what tuning you're looking for?

> - Exceptions

http://llvm.org/docs/ExceptionHandling.html

LLVM's exception support is tuned toward DWARF "zero-cost exceptions,"  
i.e. C++ exception handling. Anton Korobeynikov and Duncan Sands (who  
is working on Ada) are probably the experts in this area.

> - Some interface to LLVM from OCaml

> What is the easiest way to interface a front-end written in OCaml  
> with an LLVM backend?

The C and Ocaml bindings in the source tree are intended to cover  
precisely this scenario, and I would recommend them over .ll emission.  
Jan's remark is a bit out of date; the bindings are sufficient for  
code generation now. A few corners of the IR are still not fully  
covered, but extending the bindings to new methods is quite  
straightforward.

If ocamlc is on your path, then 'configure; make; make install' should  
install the bindings in your ocaml lib. To link with them, compile  
your program with:

     ocamlopt -cc g++

The LLVM libraries currently bound are:

     llvm.cmxa / .cma
     llvm_bitwriter.cmxa / .cma
     llvm_analysis.cmxa / .cma

Their .mli files and the corresponding llvm-c headers (coupled with an  
understanding of the C++ API) are presently the best reference.

> I just rediscovered the OCaml bindings in bindings/ocaml (...). They  
> do indeed look quite complete but I can't find any examples using  
> them.


See an example here, which an Ocaml program to emit the bitcode for a  
"hello world" program:

     http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-October/010996.html

> I think a translation of the tutorial would be most welcome and  
> about 10x shorter. ;-)


Ah, maybe. Patches are welcome. :)

— Gordon


P.S.

> the OCaml bindings in bindings/ocaml (rather than the ones in test/ 
> Bindings/OCaml!).


The latter directory contains tests of the former!



More information about the llvm-dev mailing list