[LLVMdev] C Compiler written in OCaml, Pointers Wanted
jon at ffconsultancy.com
Wed Feb 24 04:09:41 PST 2010
On Wednesday 24 February 2010 03:37:35 Nyx wrote:
> 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:
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
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
> 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
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
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.
More information about the llvm-dev