diff options
Diffstat (limited to 'backend/PrintRTL.ml')
-rw-r--r-- | backend/PrintRTL.ml | 59 |
1 files changed, 50 insertions, 9 deletions
diff --git a/backend/PrintRTL.ml b/backend/PrintRTL.ml index 6e8c5785..62ee2c99 100644 --- a/backend/PrintRTL.ml +++ b/backend/PrintRTL.ml @@ -21,6 +21,8 @@ open Integers open RTL open PrintOp +(* Printing of RTL code *) + let name_of_chunk = function | Mint8signed -> "int8signed" | Mint8unsigned -> "int8unsigned" @@ -55,15 +57,19 @@ let print_instruction pp (pc, i) = then fprintf pp "nop@ " else fprintf pp "goto %ld@ " s | Iop(op, args, res, s) -> - fprintf pp "%a = %a@ " reg res (print_operator reg) (op, args); + fprintf pp "%a = %a@ " + reg res (PrintOp.print_operation reg) (op, args); print_succ pp s (Int32.pred pc) | Iload(chunk, addr, args, dst, s) -> fprintf pp "%a = %s[%a]@ " - reg dst (name_of_chunk chunk) (print_addressing reg) (addr, args); + reg dst (name_of_chunk chunk) + (PrintOp.print_addressing reg) (addr, args); print_succ pp s (Int32.pred pc) | Istore(chunk, addr, args, src, s) -> fprintf pp "%s[%a] = %a@ " - (name_of_chunk chunk) (print_addressing reg) (addr, args) reg src; + (name_of_chunk chunk) + (PrintOp.print_addressing reg) (addr, args) + reg src; print_succ pp s (Int32.pred pc) | Icall(sg, fn, args, res, s) -> fprintf pp "%a = %a(%a)@ " @@ -72,9 +78,13 @@ let print_instruction pp (pc, i) = | Itailcall(sg, fn, args) -> fprintf pp "tailcall %a(%a)@ " ros fn regs args + | Ibuiltin(ef, args, res, s) -> + fprintf pp "%a = builtin \"%s\"(%a)@ " + reg res (extern_atom ef.ef_id) regs args; + print_succ pp s (Int32.pred pc) | Icond(cond, args, s1, s2) -> fprintf pp "if (%a) goto %ld else goto %ld@ " - (print_condition reg) (cond, args) + (PrintOp.print_condition reg) (cond, args) (camlint_of_positive s1) (camlint_of_positive s2) | Ijumptable(arg, tbl) -> let tbl = Array.of_list tbl in @@ -101,11 +111,42 @@ let print_function pp f = List.iter (print_instruction pp) instrs; fprintf pp "@;<0 -2>}@]@." -let print_fundef fd = - begin match fd with - | Internal f -> print_function std_formatter f +let print_fundef pp fd = + match fd with + | Internal f -> print_function pp f | External _ -> () - end; - fd +let print_if optdest currpp fd = + match !optdest with + | None -> () + | Some f -> + let pp = + match !currpp with + | Some pp -> pp + | None -> + let oc = open_out f in + let pp = formatter_of_out_channel oc in + currpp := Some pp; + pp + in print_fundef pp fd + +let destination_rtl : string option ref = ref None +let pp_rtl : formatter option ref = ref None +let print_rtl = print_if destination_rtl pp_rtl + +let destination_tailcall : string option ref = ref None +let pp_tailcall : formatter option ref = ref None +let print_tailcall = print_if destination_tailcall pp_tailcall + +let destination_castopt : string option ref = ref None +let pp_castopt : formatter option ref = ref None +let print_castopt = print_if destination_castopt pp_castopt + +let destination_constprop : string option ref = ref None +let pp_constprop : formatter option ref = ref None +let print_constprop = print_if destination_constprop pp_constprop + +let destination_cse : string option ref = ref None +let pp_cse : formatter option ref = ref None +let print_cse = print_if destination_cse pp_cse |