diff options
Diffstat (limited to 'ocaml-binary-annot/asmcomp/printlinear.ml')
| -rw-r--r-- | ocaml-binary-annot/asmcomp/printlinear.ml | 77 |
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 |
