<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div apple-content-edited="true"><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">Hi all,</span></font></div><div><br class="webkit-block-placeholder"></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">Here's an example of how to LLVM's JIT compiler/interpreter from Ocaml.</span></font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier">$ </font><b><font class="Apple-style-span" face="Courier">cat jithelloworld.ml</font></b></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#FF0000">(* jithelloworld.ml *)</font></font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#0000FF">open</font> <i>Llvm</i></font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#0000FF">open</font> <i>Llvm_executionengine</i></font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#0000FF">let</font> execute_function f m =</font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#FF0000">  (* Set up the JIT. *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> jit = <i>ExecutionEngine</i>.create (<i>ModuleProvider</i>.create m) <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier">  <i>ExecutionEngine</i>.run_static_ctors jit;</font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#FF0000">  (* Execute the function. *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">ignore</font> (<i>ExecutionEngine</i>.run_function f [| |] jit);</font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#FF0000">  (* Tear down the JIT. *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <i>ExecutionEngine</i>.run_static_dtors jit;</font></div><div><font class="Apple-style-span" face="Courier">  <i>ExecutionEngine</i>.dispose jit</font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#0000FF">let</font> build_module =</font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> m = create_module <font class="Apple-style-span" color="#999999">"jithelloworld"</font> in</font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#FF0000">(* @greeting = global [14 x i8] c"Hello, world!\00" *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> greeting = define_global <font class="Apple-style-span" color="#999999">"greeting"</font> (const_stringz <font class="Apple-style-span" color="#999999">"Hello, world!"</font>) m <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#FF0000">(* declare i32 @puts(i8* ) *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> puts = declare_function <font class="Apple-style-span" color="#999999">"puts"</font></font></div><div><font class="Apple-style-span" face="Courier">               (function_type i32_type [| pointer_type i8_type |]) m <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#FF0000">(* define i32 @main() {</font></font></div><div><font class="Apple-style-span" face="Courier"><font class="Apple-style-span" color="#FF0000">    entry:               *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> main = define_function <font class="Apple-style-span" color="#999999">"main"</font> (function_type i32_type [| |]) m <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> at_entry = builder_at_end (entry_block main) <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#FF0000">(* %tmp = getelementptr [14 x i8]* @greeting, i32 0, i32 0 *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> zero = const_int i32_type 0 <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> str = build_gep greeting [| zero; zero |] <font class="Apple-style-span" color="#999999">"tmp"</font> at_entry <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#FF0000">(* call i32 @puts( i8* %tmp ) *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">ignore</font> (build_call puts [| str |] <font class="Apple-style-span" color="#999999">""</font> at_entry);</font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#FF0000">(* ret void *)</font></font></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">ignore</font> (build_ret (const_null i32_type) at_entry);</font></div><div><font class="Apple-style-span" face="Courier">  </font></div><div><font class="Apple-style-span" face="Courier">  (main, m)</font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><span class="Apple-style-span" style="font-family: Courier; "><font class="Apple-style-span" color="#0000FF">let</font> _ =</span></div><div><font class="Apple-style-span" face="Courier">  <font class="Apple-style-span" color="#0000FF">let</font> (f, m) = build_module <font class="Apple-style-span" color="#0000FF">in</font></font></div><div><font class="Apple-style-span" face="Courier">  execute_function f m</font></div><div><font class="Apple-style-span" face="Courier"><br class="webkit-block-placeholder"></font></div><div><span class="Apple-style-span" style="font-family: Courier; ">$ <b>ocamlopt -cc g++ llvm.cmxa llvm_executionengine.cmxa -o jithelloworld jithelloworld.ml</b></span></div><div><font class="Apple-style-span" face="Courier">$ <b>./jithelloworld</b></font></div><div><font class="Apple-style-span" face="Courier">Hello, world!</font></div><div><br class="webkit-block-placeholder"></div></div>— Gordon<br class="Apple-interchange-newline"></span></span></span></span></span></div></span> </div><br></body></html>