[llvm-readobj] - Implement LLVM-style dumping for .stack_sizes sections.
[llvm-complete.git] / examples / OCaml-Kaleidoscope / Chapter4 / toplevel.ml
blob01d24ede14927e9ff6baffbb3fe374a243245880
1 (*===----------------------------------------------------------------------===
2 * Top-Level parsing and JIT Driver
3 *===----------------------------------------------------------------------===*)
5 open Llvm
6 open Llvm_executionengine
8 (* top ::= definition | external | expression | ';' *)
9 let rec main_loop the_fpm the_execution_engine stream =
10 match Stream.peek stream with
11 | None -> ()
13 (* ignore top-level semicolons. *)
14 | Some (Token.Kwd ';') ->
15 Stream.junk stream;
16 main_loop the_fpm the_execution_engine stream
18 | Some token ->
19 begin
20 try match token with
21 | Token.Def ->
22 let e = Parser.parse_definition stream in
23 print_endline "parsed a function definition.";
24 dump_value (Codegen.codegen_func the_fpm e);
25 | Token.Extern ->
26 let e = Parser.parse_extern stream in
27 print_endline "parsed an extern.";
28 dump_value (Codegen.codegen_proto e);
29 | _ ->
30 (* Evaluate a top-level expression into an anonymous function. *)
31 let e = Parser.parse_toplevel stream in
32 print_endline "parsed a top-level expr";
33 let the_function = Codegen.codegen_func the_fpm e in
34 dump_value the_function;
36 (* JIT the function, returning a function pointer. *)
37 let result = ExecutionEngine.run_function the_function [||]
38 the_execution_engine in
40 print_string "Evaluated to ";
41 print_float (GenericValue.as_float Codegen.double_type result);
42 print_newline ();
43 with Stream.Error s | Codegen.Error s ->
44 (* Skip token for error recovery. *)
45 Stream.junk stream;
46 print_endline s;
47 end;
48 print_string "ready> "; flush stdout;
49 main_loop the_fpm the_execution_engine stream