[LLVMdev] C Compiler written in OCaml, Pointers Wanted

Jon Harrop jon at ffconsultancy.com
Wed Feb 24 04:09:41 PST 2010


On Wednesday 24 February 2010 03:37:35 Nyx wrote:
> Hello,
>
> For a course project, I am required to write a compiler for some language
> of my choice, and this compiler has to be implemented in a functional
> language. I have chosen create a *JIT* compiler for C source, and to
> implement my compiler in OCaml using LLVM for the back-end. I have
> experience using LLVM in C++ (I wrote a MATLAB JIT compiler not long ago),
> however, I am a bit puzzled as to how to go about some things, and would
> appreciate some pointers:

First up, my HLVM project should answer all of your questions:

  http://www.ffconsultancy.com/ocaml/hlvm/

Specifically, this is a JIT compiler written almost entirely in OCaml (2kLOC) 
that includes a self-generating run-time with multicore-capable garbage 
collector that operates using malloc and free directly.

> 1. When writing my MATLAB JIT in C++, I created bindings to native C++
> functions to serve as my runtime library. This hardly seems practical in
> OCaml.

You would expose a C interface and bind OCaml to that with C stubs using 
OCaml's internal's C macros.

> I would ideally want to write my runtime library in C (this will 
> contain functions such as malloc, free, puts, strlen, etc.),

You'll probably find it easier just to invoke these directly from your 
generated code. In other words, your OCaml code will call LLVM to generate 
native code and then call LLVM's JIT to executate that native code and then 
your native code is on its own (no calling back to or via OCaml code).

> and link it 
> with the code I compile somehow. Is there any way for LLVM to link with
> code in pre-compiled C object files? Please note that this is for a JIT
> compiler, I need to be able to do this at run-time, I will not be
> generating an executable file.

You can call libc stuff directly. Other stuff you probably want to dlload.

> 2. One thing I don't know how to go about is memory allocation. As I just
> said, this will be a C *JIT* compiler. This means that my running compiled
> code will have to co-exist with OCaml. How do I go about implementing
> malloc in this context? Does LLVM provide some memory allocation
> implementation that will work with a JIT?

No need. You just call malloc and free from your generated code.

> 3. Do the OCaml LLVM bindings even allow using LLVM in JIT mode?

Yes, of course. This is a core part of several LLVM-based projects written in 
OCaml.

> And of course, if anyone has experience writing a JIT using LLVM, or using
> the OCaml LLVM bindings, any advice you may have will be greatly
> appreciated.

I have been using LLVM from OCaml for well over a year. It works really well: 
LLVM is a great library and OCaml is an awesome language for compiler 
writing.

In particular, you do *not* need to modify LLVM or OCaml at all. They both 
work perfectly in harmony out of the box.

-- 
Dr Jon Harrop, Flying Frog Consultancy Ltd.
http://www.ffconsultancy.com/?e



More information about the llvm-dev mailing list