[LLVMdev] Fibonacci example in OCaml

Jon Harrop jon at ffconsultancy.com
Sun Nov 25 14:04:37 PST 2007

Here's my translation of the Fibonacci example into OCaml:

open Printf
open Llvm

let build_fib m =
   let fibf =
     define_function "fib" (function_type i32_type [| i32_type |]) m in

   let bb = builder_at_end (entry_block fibf) in

   let one = const_int i32_type 1 and two = const_int i32_type 2 in

   let argx = param fibf 0 in
   set_value_name "AnArg" argx;

   let retbb = append_block "return" fibf in
   let retb = builder_at_end retbb in
   let recursebb = append_block "recurse" fibf in
   let recurseb = builder_at_end recursebb in

   let condinst = build_icmp Icmp_sle argx two "cond" bb in
   ignore(build_cond_br condinst retbb recursebb bb);
   ignore(build_ret one retb);

   let sub = build_sub argx one "arg" recurseb in
   let callfibx1 = build_call fibf [|sub|] "fibx1" recurseb in

   let sub = build_sub argx two "arg" recurseb in
   let callfibx2 = build_call fibf [|sub|] "fibx2" recurseb in

   let sum = build_add callfibx1 callfibx2 "addresult" recurseb in

   build_ret sum recurseb;


let main filename =
   let m = create_module filename in

   let puts =
     declare_function "puts"
       (function_type i32_type [|pointer_type i8_type|]) m in

   let fib = build_fib m in

   let main = define_function "main" (function_type i32_type [| |]) m in
   let at_entry = builder_at_end (entry_block main) in   
   let n = build_call fib [| const_int i32_type 40 |] "" at_entry in
   ignore (build_ret (const_null i32_type) at_entry);

   if not (Llvm_bitwriter.write_bitcode_file m filename) then exit 1;
   dispose_module m

let () = match Sys.argv with
  | [|_; filename|] -> main filename
  | _ as a -> eprintf "Usage: %s <file>\n" a.(0)

I'd appreciate it if someone could gloss over this and let me know if I'm 
going in the correct direction. Also, I have a really stupid question: what 
is the easiest way to print the int result!? :-)

Dr Jon D Harrop, Flying Frog Consultancy Ltd.

More information about the llvm-dev mailing list