summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/asmcomp/printlinear.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/asmcomp/printlinear.ml')
-rw-r--r--ocaml-binary-annot/asmcomp/printlinear.ml77
1 files changed, 77 insertions, 0 deletions
diff --git a/ocaml-binary-annot/asmcomp/printlinear.ml b/ocaml-binary-annot/asmcomp/printlinear.ml
new file mode 100644
index 0000000000..3737e72c13
--- /dev/null
+++ b/ocaml-binary-annot/asmcomp/printlinear.ml
@@ -0,0 +1,77 @@
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 1996 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the Q Public License version 1.0. *)
+(* *)
+(***********************************************************************)
+
+(* $Id$ *)
+
+(* Pretty-printing of linearized machine code *)
+
+open Format
+open Mach
+open Printmach
+open Linearize
+
+let label ppf l =
+ Format.fprintf ppf "L%i" l
+
+let instr ppf i =
+ begin match i.desc with
+ | Lend -> ()
+ | Lop op ->
+ begin match op with
+ | Ialloc _ | Icall_ind | Icall_imm _ | Iextcall(_, _) ->
+ fprintf ppf "@[<1>{%a}@]@," regsetaddr i.live
+ | _ -> ()
+ end;
+ operation op i.arg ppf i.res
+ | Lreloadretaddr ->
+ fprintf ppf "reload retaddr"
+ | Lreturn ->
+ fprintf ppf "return %a" regs i.arg
+ | Llabel lbl ->
+ fprintf ppf "%a:" label lbl
+ | Lbranch lbl ->
+ fprintf ppf "goto %a" label lbl
+ | Lcondbranch(tst, lbl) ->
+ fprintf ppf "if %a goto %a" (test tst) i.arg label lbl
+ | Lcondbranch3(lbl0, lbl1, lbl2) ->
+ fprintf ppf "switch3 %a" reg i.arg.(0);
+ let case n = function
+ | None -> ()
+ | Some lbl ->
+ fprintf ppf "@,case %i: goto %a" n label lbl in
+ case 0 lbl0; case 1 lbl1; case 2 lbl2;
+ fprintf ppf "@,endswitch"
+ | Lswitch lblv ->
+ fprintf ppf "switch %a" reg i.arg.(0);
+ for i = 0 to Array.length lblv - 1 do
+ fprintf ppf "case %i: goto %a" i label lblv.(i)
+ done;
+ fprintf ppf "@,endswitch"
+ | Lsetuptrap lbl ->
+ fprintf ppf "setup trap %a" label lbl
+ | Lpushtrap ->
+ fprintf ppf "push trap"
+ | Lpoptrap ->
+ fprintf ppf "pop trap"
+ | Lraise ->
+ fprintf ppf "raise %a" reg i.arg.(0)
+ end;
+ if i.dbg != Debuginfo.none then
+ fprintf ppf " %s" (Debuginfo.to_string i.dbg)
+
+let rec all_instr ppf i =
+ match i.desc with
+ | Lend -> ()
+ | _ -> fprintf ppf "%a@,%a" instr i all_instr i.next
+
+let fundecl ppf f =
+ fprintf ppf "@[<v 2>%s:@,%a@]" f.fun_name all_instr f.fun_body