Commit 50b028d2 authored by Taddeüs Kroes's avatar Taddeüs Kroes

Code + makefile cleanup

parent bf263fa2
LD := clang LD := clang
LDFLAGS := -nostartfiles LDFLAGS := -nostartfiles
BFILES := $(wildcard *.b) BFILES := $(patsubst %.b,%,$(wildcard *.b))
.PHONY: clean .PHONY: clean
.PRECIOUS: $(patsubst %.b,%.ll %-opt.ll,$(BFILES)) .PRECIOUS: $(addsuffix .ll,$(BFILES)) $(addsuffix -opt.ll,$(BFILES))
bf: bf.ml bf: bf.ml
ocamlopt -o $@ -g -I /usr/lib/ocaml/llvm-3.5 llvm.cmxa $^ ocamlopt -o $@ -g -I /usr/lib/ocaml/llvm-3.5 llvm.cmxa $<
rm -f $@.cmi $@.cmx $@.o
%: %.o %: %.o
$(LD) -o $@ $< $(LDFLAGS) $(LD) -o $@ $< $(LDFLAGS)
...@@ -24,4 +25,4 @@ bf: bf.ml ...@@ -24,4 +25,4 @@ bf: bf.ml
./bf < $< > $@ ./bf < $< > $@
clean: clean:
rm -f bf *.cmi *.cmx *.ll *.bc *.o $(patsubst %.b,%,$(BFILES)) rm -f bf *.cmi *.cmx *.ll *.bc *.o $(BFILES) $(addsuffix -opt,$(BFILES))
...@@ -49,14 +49,15 @@ let compile memsize program = ...@@ -49,14 +49,15 @@ let compile memsize program =
let byte_ty = i8_type ctx in let byte_ty = i8_type ctx in
let byteptr_ty = pointer_type byte_ty in let byteptr_ty = pointer_type byte_ty in
let i1_ty = i1_type ctx in let bool_ty = i1_type ctx in
let i32_ty = i32_type ctx in let i32_ty = i32_type ctx in
let int_ty = i32_ty in
let void_ty = void_type ctx in let void_ty = void_type ctx in
let putchar = declare_function "putchar" (function_type int_ty [|byte_ty|]) m in let putchar = declare_function "putchar" (function_type i32_ty [|byte_ty|]) m in
let getchar = declare_function "getchar" (function_type byte_ty [||]) m in let getchar = declare_function "getchar" (function_type byte_ty [||]) m in
let cexit = declare_function "exit" (function_type void_ty [|i32_ty|]) m in
(* use custom _start symbol rather than main function to reduce complexity *)
let f = define_function "_start" (function_type void_ty [||]) m in let f = define_function "_start" (function_type void_ty [||]) m in
let bb_cur = ref (entry_block f) in let bb_cur = ref (entry_block f) in
let b = builder_at_end ctx !bb_cur in let b = builder_at_end ctx !bb_cur in
...@@ -66,13 +67,11 @@ let compile memsize program = ...@@ -66,13 +67,11 @@ let compile memsize program =
bb_cur := bb bb_cur := bb
in in
let i n = const_int int_ty n in let i n = const_int i32_ty n in
let i8 n = const_int byte_ty n in let i8 n = const_int byte_ty n in
(*let mem = define_global "mem" (const_null (array_type byte_ty memsize)) m in
set_linkage Linkage.Private mem;*)
let mem = build_alloca (array_type byte_ty memsize) "mem" b in let mem = build_alloca (array_type byte_ty memsize) "mem" b in
let idx = build_alloca int_ty "idx" b in let idx = build_alloca i32_ty "idx" b in
let gep () = build_in_bounds_gep mem [|i 0; build_load idx "" b|] "" b in let gep () = build_in_bounds_gep mem [|i 0; build_load idx "" b|] "" b in
let load ptr = build_load ptr "" b in let load ptr = build_load ptr "" b in
...@@ -97,14 +96,14 @@ let compile memsize program = ...@@ -97,14 +96,14 @@ let compile memsize program =
let bb_body = insert_block ctx "" bb_end in let bb_body = insert_block ctx "" bb_end in
let bb_cond = insert_block ctx "" bb_body in let bb_cond = insert_block ctx "" bb_body in
ignore (build_br bb_cond b); build_br bb_cond b |> ignore;
position_at_end bb_cond b; position_at_end bb_cond b;
let cond = build_icmp Icmp.Eq (load (gep ())) (i8 0) "" b in let cond = build_icmp Icmp.Eq (load (gep ())) (i8 0) "" b in
ignore (build_cond_br cond bb_end bb_body b); build_cond_br cond bb_end bb_body b |> ignore;
set_cur_bb bb_body; set_cur_bb bb_body;
List.iter compile_command p; List.iter compile_command p;
ignore (build_br bb_cond b); build_br bb_cond b |> ignore;
set_cur_bb bb_end set_cur_bb bb_end
in in
...@@ -112,20 +111,19 @@ let compile memsize program = ...@@ -112,20 +111,19 @@ let compile memsize program =
(* zero-initialize memory (use intrinsic for optimization assumptions) *) (* zero-initialize memory (use intrinsic for optimization assumptions) *)
set_data_layout "e" m; (* little-endian, needed for optimization *) set_data_layout "e" m; (* little-endian, needed for optimization *)
let memset = let memset =
let arg_types = [|byteptr_ty; byte_ty; i32_ty; i32_ty; i1_ty|] in let arg_types = [|byteptr_ty; byte_ty; i32_ty; i32_ty; bool_ty|] in
declare_function "llvm.memset.p0i8.i32" (function_type void_ty arg_types) m declare_function "llvm.memset.p0i8.i32" (function_type void_ty arg_types) m
in in
let ptr = build_bitcast mem byteptr_ty "" b in let ptr = build_bitcast mem byteptr_ty "" b in
build_call memset [|ptr; i8 0; i memsize; i 0; const_int i1_ty 0|] "" b |> ignore; build_call memset [|ptr; i8 0; i memsize; i 0; const_int bool_ty 0|] "" b |> ignore;
(* set pivot to index 0 and compile program commands *) (* set pivot to index 0 and compile program commands *)
store idx (i 0); store idx (i 0);
List.iter compile_command program; List.iter compile_command program;
(* exit gracefully *) (* exit gracefully *)
let cexit = declare_function "exit" (function_type void_ty [|i32_ty|]) m in build_call cexit [|i 0|] "" b |> ignore;
ignore (build_call cexit [|i 0|] "" b); build_ret_void b |> ignore;
ignore (build_ret_void b);
m m
let () = let () =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment