From a15858a0a8fcea82db02fe8c9bd2ed912210419f Mon Sep 17 00:00:00 2001 From: xleroy Date: Wed, 18 Aug 2010 09:06:55 +0000 Subject: Merge of branches/full-expr-4: - Csyntax, Csem: source C language has side-effects within expressions, performs implicit casts, and has nondeterministic reduction semantics for expressions - Cstrategy: deterministic red. sem. for the above - Clight: the previous source C language, with pure expressions. Added: temporary variables + implicit casts. - New pass SimplExpr to pull side-effects out of expressions (previously done in untrusted Caml code in cparser/) - Csharpminor: added temporary variables to match Clight. - Cminorgen: adapted, removed cast optimization (moved to back-end) - CastOptim: RTL-level optimization of casts - cparser: transformations Bitfields, StructByValue and StructAssign now work on non-simplified expressions - Added pretty-printers for several intermediate languages, and matching -dxxx command-line flags. git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1467 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e --- backend/PrintRTL.ml | 59 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 9 deletions(-) (limited to 'backend/PrintRTL.ml') 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 -- cgit