[LLVMdev] Ocaml JIT example

Gordon Henriksen gordonhenriksen at mac.com
Sun Dec 23 10:28:46 PST 2007


Hi all,

Here's an example of how to LLVM's JIT compiler/interpreter from Ocaml.

$ cat jithelloworld.ml
(* jithelloworld.ml *)

open Llvm
open Llvm_executionengine

let execute_function f m =
   (* Set up the JIT. *)
   let jit = ExecutionEngine.create (ModuleProvider.create m) in
   ExecutionEngine.run_static_ctors jit;

   (* Execute the function. *)
   ignore (ExecutionEngine.run_function f [| |] jit);

   (* Tear down the JIT. *)
   ExecutionEngine.run_static_dtors jit;
   ExecutionEngine.dispose jit

let build_module =
   let m = create_module "jithelloworld" in

   (* @greeting = global [14 x i8] c"Hello, world!\00" *)
   let greeting = define_global "greeting" (const_stringz "Hello,  
world!") m in

   (* declare i32 @puts(i8* ) *)
   let puts = declare_function "puts"
                (function_type i32_type [| pointer_type i8_type |]) m in

   (* define i32 @main() {
     entry:               *)
   let main = define_function "main" (function_type i32_type [| |]) m in
   let at_entry = builder_at_end (entry_block main) in

   (* %tmp = getelementptr [14 x i8]* @greeting, i32 0, i32 0 *)
   let zero = const_int i32_type 0 in
   let str = build_gep greeting [| zero; zero |] "tmp" at_entry in

   (* call i32 @puts( i8* %tmp ) *)
   ignore (build_call puts [| str |] "" at_entry);

   (* ret void *)
   ignore (build_ret (const_null i32_type) at_entry);

   (main, m)

let _ =
   let (f, m) = build_module in
   execute_function f m

$ ocamlopt -cc g++ llvm.cmxa llvm_executionengine.cmxa -o  
jithelloworld jithelloworld.ml
$ ./jithelloworld
Hello, world!

— Gordon

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


More information about the llvm-dev mailing list