Skip to content
Snippets Groups Projects
Commit ebfac096 authored by Wilke Pierre's avatar Wilke Pierre
Browse files

Sujet (builtins) + Détection de conflit dans alpaga + Résolution de bugs dans ltl_gen

parent 2fe25b0d
No related branches found
No related tags found
No related merge requests found
No preview for this file type
...@@ -101,6 +101,17 @@ let string_of_lltype = function ...@@ -101,6 +101,17 @@ let string_of_lltype = function
| Follow i -> Printf.sprintf "<a style='color:red;' href=\"#rule-%d\">%d</a>" i i | Follow i -> Printf.sprintf "<a style='color:red;' href=\"#rule-%d\">%d</a>" i i
let check_conflicts (toks,nts,rules) () =
List.fold_left
(fun acc x ->
List.fold_left (fun acc t ->
let rs = (hashget_def lltable (x,t) []) in
if List.length rs > 1 then true else acc
) acc toks
) false
nts
let print_table (toks,nts,rules) oc () = let print_table (toks,nts,rules) oc () =
Format.fprintf oc "<!DOCTYPE html>" ; Format.fprintf oc "<!DOCTYPE html>" ;
Format.fprintf oc "<html><head><link rel='stylesheet' type='text/css' href='style.css'/></head>\n"; Format.fprintf oc "<html><head><link rel='stylesheet' type='text/css' href='style.css'/></head>\n";
......
...@@ -164,6 +164,9 @@ let _ = ...@@ -164,6 +164,9 @@ let _ =
iter_first (toks, nts, rules) (); iter_first (toks, nts, rules) ();
iter_follownt (toks, nts, rules) (); iter_follownt (toks, nts, rules) ();
fill_lltable (toks, nts, rules) (); fill_lltable (toks, nts, rules) ();
let has_conflict = check_conflicts (toks, nts, rules) () in
if has_conflict
then Printf.fprintf stderr "Warning! There is a conflict in your grammar. Check the prediction table for more details.\n";
(match !table_file with (match !table_file with
| Some tfile -> let oc = open_out tfile in | Some tfile -> let oc = open_out tfile in
print_html (toks, nts, rules) (Format.formatter_of_out_channel oc) (); print_html (toks, nts, rules) (Format.formatter_of_out_channel oc) ();
......
...@@ -299,7 +299,6 @@ let ltl_instrs_of_linear_instr fname live_out allocation ...@@ -299,7 +299,6 @@ let ltl_instrs_of_linear_instr fname live_out allocation
store_loc reg_tmp1 allocation rd >>= fun (ld, rd) -> store_loc reg_tmp1 allocation rd >>= fun (ld, rd) ->
OK (ls @ LMov(rd, rs) :: ld) OK (ls @ LMov(rd, rs) :: ld)
| Rprint r -> | Rprint r ->
let (save_a_regs, arg_saved, ofs) = let (save_a_regs, arg_saved, ofs) =
save_caller_save save_caller_save
(range 32) (range 32)
...@@ -312,7 +311,7 @@ let ltl_instrs_of_linear_instr fname live_out allocation ...@@ -312,7 +311,7 @@ let ltl_instrs_of_linear_instr fname live_out allocation
in in
parameter_passing >>= fun parameter_passing -> parameter_passing >>= fun parameter_passing ->
OK (LComment "Saving a0-a7,t0-t6" :: save_a_regs @ OK (LComment "Saving a0-a7,t0-t6" :: save_a_regs @
LAddi(reg_sp, reg_s0, !Archi.wordsize * ofs) :: LAddi(reg_sp, reg_s0, !Archi.wordsize * (ofs + 1)) ::
parameter_passing @ parameter_passing @
LCall "print" :: LCall "print" ::
LComment "Restoring a0-a7,t0-t6" :: restore_caller_save arg_saved) LComment "Restoring a0-a7,t0-t6" :: restore_caller_save arg_saved)
...@@ -400,7 +399,7 @@ let ltl_prog_of_linear lp = ...@@ -400,7 +399,7 @@ let ltl_prog_of_linear lp =
let f_alloc = let f_alloc =
match Hashtbl.find_option allocations fname with match Hashtbl.find_option allocations fname with
| None -> (Hashtbl.create 0, 0) | None -> (Hashtbl.create 0, 0)
| Some (rig, allocation, next_stack_slot) -> (allocation, - next_stack_slot) | Some (rig, allocation, next_stack_slot) -> (allocation, - next_stack_slot - 1)
in in
let f_lives = let f_lives =
match Hashtbl.find_option lives fname with match Hashtbl.find_option lives fname with
......
...@@ -41,11 +41,12 @@ let regs_in_instr_list (l: rtl_instr list) : reg Set.t = ...@@ -41,11 +41,12 @@ let regs_in_instr_list (l: rtl_instr list) : reg Set.t =
let regalloc_on_stack_fun (f: linear_fun) : ((reg, loc) Hashtbl.t * int)= let regalloc_on_stack_fun (f: linear_fun) : ((reg, loc) Hashtbl.t * int)=
let allocation = Hashtbl.create 10 in let allocation = Hashtbl.create 10 in
let regs = regs_in_instr_list f.linearfunbody in let regs = regs_in_instr_list f.linearfunbody in
let regs = Set.diff regs (Set.of_list f.linearfunargs) in
let next_stack_slot = let next_stack_slot =
List.fold_left (fun next_stack_slot r -> List.fold_left (fun next_stack_slot r ->
Hashtbl.replace allocation r (Stk (next_stack_slot)); Hashtbl.replace allocation r (Stk (next_stack_slot));
next_stack_slot - 1 next_stack_slot - 1
) 0 (Set.to_list regs) in ) (-1) (Set.to_list regs) in
(allocation, next_stack_slot) (allocation, next_stack_slot)
...@@ -248,7 +249,7 @@ let regalloc_fun (f: linear_fun) ...@@ -248,7 +249,7 @@ let regalloc_fun (f: linear_fun)
let next_stack_slot = let next_stack_slot =
List.fold_left (fun next_stack_slot decision -> List.fold_left (fun next_stack_slot decision ->
allocate allocation rig all_colors next_stack_slot decision allocate allocation rig all_colors next_stack_slot decision
) 0 stack in ) (-1) stack in
(rig, allocation, next_stack_slot) (rig, allocation, next_stack_slot)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment