[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