1
(*===----------------------------------------------------------------------===
3
*===----------------------------------------------------------------------===*)
6
open Llvm_executionengine
11
ignore (initialize_native_target ());
13
(* Install standard binary operators.
14
* 1 is the lowest precedence. *)
15
Hashtbl.add Parser.binop_precedence '=' 2;
16
Hashtbl.add Parser.binop_precedence '<' 10;
17
Hashtbl.add Parser.binop_precedence '+' 20;
18
Hashtbl.add Parser.binop_precedence '-' 20;
19
Hashtbl.add Parser.binop_precedence '*' 40; (* highest. *)
21
(* Prime the first token. *)
22
print_string "ready> "; flush stdout;
23
let stream = Lexer.lex (Stream.of_channel stdin) in
26
let the_execution_engine = ExecutionEngine.create Codegen.the_module in
27
let the_fpm = PassManager.create_function Codegen.the_module in
29
(* Set up the optimizer pipeline. Start with registering info about how the
30
* target lays out data structures. *)
31
DataLayout.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
33
(* Promote allocas to registers. *)
34
add_memory_to_register_promotion the_fpm;
36
(* Do simple "peephole" optimizations and bit-twiddling optzn. *)
37
add_instruction_combination the_fpm;
39
(* reassociate expressions. *)
40
add_reassociation the_fpm;
42
(* Eliminate Common SubExpressions. *)
45
(* Simplify the control flow graph (deleting unreachable blocks, etc). *)
46
add_cfg_simplification the_fpm;
48
ignore (PassManager.initialize the_fpm);
50
(* Run the main "interpreter loop" now. *)
51
Toplevel.main_loop the_fpm the_execution_engine stream;
53
(* Print out all the generated code. *)
54
dump_module Codegen.the_module