-
Wilke Pierre authoredWilke Pierre authored
rtl_print.ml 2.08 KiB
open Batteries
open Elang_print
open Rtl
open Prog
open Utils
let print_reg r =
Format.sprintf "r%d" r
let print_cmpop (r: rtl_cmp) =
(match r with
| Rclt -> "<"
| Rcle -> "<="
| Rcgt -> ">"
| Rcge -> ">="
| Rceq -> "=="
| Rcne -> "!=")
let dump_rtl_instr name (live_in, live_out) ?(endl="\n") oc (i: rtl_instr) =
let print_node s = Format.sprintf "%s_%d" name s in
let dump_liveness live where =
match live with
Some live -> Format.fprintf oc "// Live %s : { %s }\n" where (String.concat ", " (Set.to_list (Set.map string_of_int live)))
| None -> ()
in
dump_liveness live_in "before";
begin match i with
| Rbinop (b, rd, rs1, rs2) ->
Format.fprintf oc "%s <- %s(%s, %s)" (print_reg rd) (dump_binop b) (print_reg rs1) (print_reg rs2)
| Runop (u, rd, rs) ->
Format.fprintf oc "%s <- %s(%s)" (print_reg rd) (dump_unop u) (print_reg rs)
| Rconst (rd, i) ->
Format.fprintf oc "%s <- %d" (print_reg rd) i
| Rbranch (cmpop, r1, r2, s1) ->
Format.fprintf oc "%s %s %s ? jmp %s" (print_reg r1) (print_cmpop cmpop) (print_reg r2) (print_node s1)
| Rjmp s ->
Format.fprintf oc "jmp %s" (print_node s)
| Rmov (rd, rs) -> Format.fprintf oc "%s <- %s" (print_reg rd) (print_reg rs)
| Rret r -> Format.fprintf oc "ret %s" (print_reg r)
| Rprint r -> Format.fprintf oc "print %s" (print_reg r)
| Rlabel n -> Format.fprintf oc "%s_%d:" name n
end;
Format.fprintf oc "%s" endl;
dump_liveness live_out "after"
let dump_rtl_node name lives =
print_listi (fun i ->
dump_rtl_instr name
(match lives with
None -> (None, None)
| Some (lin, lout) ->
Hashtbl.find_option lin i, Hashtbl.find_option lout i)
~endl:"\n"
) "" "" ""
let dump_rtl_fun oc rtlfunname ({ rtlfunargs; rtlfunbody; rtlfunentry }: rtl_fun) =
Format.fprintf oc "%s(%s):\n" rtlfunname
(String.concat ", " $ List.map print_reg rtlfunargs);
Hashtbl.iter (fun n node ->
Format.fprintf oc "%s_%d:\n" rtlfunname n;
dump_rtl_node rtlfunname None oc node) rtlfunbody
let dump_rtl_prog oc cp =
dump_prog dump_rtl_fun oc cp