Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/closure #13

Merged
merged 14 commits into from
Mar 21, 2019
Prev Previous commit
Next Next commit
cast function closure env
  • Loading branch information
anhnguyen1618 committed Mar 20, 2019
commit 36983bf6a749de1b308e6f981a7d3de3315e133b
Binary file modified bin/compiler
Binary file not shown.
2 changes: 1 addition & 1 deletion src/semant.ml
Original file line number Diff line number Diff line change
Expand Up @@ -686,7 +686,7 @@ let trans_prog ((my_exp: A.exp), (output_name: string)) =
let main_level = Translate.new_level Translate.outermost in
ignore(trans_exp (Env.base_venv, Env.base_tenv, main_level, my_exp, outermost_break_block));
Translate.build_return_main();
(*dump_module Translate.the_module;*)
dump_module Translate.the_module;
print_module ("llvm_byte_code/"^ output_name ^ ".ll") Translate.the_module;


Expand Down
15 changes: 8 additions & 7 deletions src/translate.ml
Original file line number Diff line number Diff line change
Expand Up @@ -539,25 +539,26 @@ let build_closure
| Some x -> x
in

let llvm_fp_type = get_llvm_type fp_addr_type in
(*let llvm_fp_type = get_llvm_type fp_addr_type in*)
let arg_types =
llvm_fp_type
string_type
:: (List.map get_llvm_type arg_types)
|> Array.of_list
in
let function_type = L.function_type (get_llvm_type ret_type) arg_types |> L.pointer_type in
let closure_struct_type = L.struct_type context [|function_type; llvm_fp_type|] in
let closure_struct_type = L.struct_type context [|function_type; string_type|] in
let closure_addr = L.build_malloc closure_struct_type "closure_addr" builder in
let casted_env_addr = L.build_bitcast fp_addr string_type "closure_env" builder in
let save_val_to_closure index exp =
let addr = L.build_gep closure_addr [| int_exp(0); int_exp(index) |] "Element" builder in
ignore(L.build_store exp addr builder)
in

save_val_to_closure 0 defined_func;
save_val_to_closure 1 fp_addr;
let casted_fp_addr = build_bitcast_generic T.GENERIC_RECORD closure_addr in
save_val_to_closure 1 casted_env_addr;
let casted_closure_addr = build_bitcast_generic T.GENERIC_RECORD closure_addr in
let closure_struct_pointer_type = L.pointer_type closure_struct_type in
(closure_struct_pointer_type, casted_fp_addr)
(closure_struct_pointer_type, casted_closure_addr)

let closure_call_exp
(closure_addr: exp)
Expand All @@ -574,7 +575,7 @@ let closure_call_exp
in
let func_ptr = get_val_from_closure 0 in
let env = get_val_from_closure 1 in
L.build_call func_ptr (Array.of_list (env::args)) "" builder
L.build_call func_ptr (env::args |> Array.of_list) "" builder


let build_external_func
Expand Down