diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-08-18 09:06:55 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-08-18 09:06:55 +0000 |
commit | a15858a0a8fcea82db02fe8c9bd2ed912210419f (patch) | |
tree | 5c0c19439f0d0f9e8873ce0dad2034cb9cafc4ba /backend/PrintRTL.ml | |
parent | adedca3a1ff17ff8ac66eb2bcd533a50df0927a0 (diff) | |
download | compcert-a15858a0a8fcea82db02fe8c9bd2ed912210419f.tar.gz compcert-a15858a0a8fcea82db02fe8c9bd2ed912210419f.zip |
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
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 |