2 (** This module provides a function to print [ERTL] programs. *)
5 let n_spaces n = String.make n ' '
8 let print_global n (x, size) =
9 Printf.sprintf "%s\"%s\" [%d]" (n_spaces n) x size
11 let print_globals eformat n globs =
12 Eformat.printf eformat "%sglobals:\n" (n_spaces n) ;
14 (fun g -> Eformat.printf eformat "%s\n" (print_global (n+2) g)) globs
17 let reg_set_to_list rs =
18 let f r l = l @ [r] in
19 Register.Set.fold f rs []
21 let print_reg_list first last sep f rl =
22 Printf.sprintf "%s%s%s"
23 first (MiscPottier.string_of_list sep f rl) last
25 let print_ptr rl = print_reg_list "[" "]" " ; " Register.print rl
27 let print_args rl = print_reg_list "(" ")" ", " Register.print rl
29 let print_return rl = print_reg_list "[" "]" " ; " Register.print rl
31 let print_params rl = print_reg_list "(" ")" ", " Register.print rl
34 let rl = reg_set_to_list rs in
35 Printf.sprintf "%s" (print_reg_list "" "" ", " Register.print rl)
37 let print_result rl = print_reg_list "[" "]" " ; " Register.print rl
40 let print_statement = function
41 | ERTL.St_skip lbl -> "--> " ^ lbl
42 | ERTL.St_comment (s, lbl) ->
43 Printf.sprintf "*** %s *** --> %s" s lbl
44 | ERTL.St_cost (cost_lbl, lbl) ->
45 Printf.sprintf "emit %s --> %s" cost_lbl lbl
46 | ERTL.St_get_hdw (r1, r2, lbl) ->
47 Printf.sprintf "move %s, %s --> %s"
48 (Register.print r1) (I8051.print_register r2) lbl
49 | ERTL.St_set_hdw (r1, r2, lbl) ->
50 Printf.sprintf "move %s, %s --> %s"
51 (I8051.print_register r1) (Register.print r2) lbl
52 | ERTL.St_hdw_to_hdw (r1, r2, lbl) ->
53 Printf.sprintf "move %s, %s --> %s"
54 (I8051.print_register r1) (I8051.print_register r2) lbl
55 | ERTL.St_newframe lbl ->
56 Printf.sprintf "newframe --> %s" lbl
57 | ERTL.St_delframe lbl ->
58 Printf.sprintf "delframe --> %s" lbl
59 | ERTL.St_framesize (r, lbl) ->
60 Printf.sprintf "imm %s, FRAMESIZE --> %s" (Register.print r) lbl
61 | ERTL.St_pop (r, lbl) ->
62 Printf.sprintf "pop %s --> %s" (Register.print r) lbl
63 | ERTL.St_push (r, lbl) ->
64 Printf.sprintf "push %s --> %s" (Register.print r) lbl
65 | ERTL.St_addrH (dstr, id, lbl) ->
66 Printf.sprintf "addrH %s, %s --> %s" (Register.print dstr) id lbl
67 | ERTL.St_addrL (dstr, id, lbl) ->
68 Printf.sprintf "addrL %s, %s --> %s" (Register.print dstr) id lbl
69 | ERTL.St_int (dstr, i, lbl) ->
70 Printf.sprintf "imm %s, %d --> %s" (Register.print dstr) i lbl
71 | ERTL.St_move (dstr, srcr, lbl) ->
72 Printf.sprintf "move %s, %s --> %s"
73 (Register.print dstr) (Register.print srcr) lbl
74 | ERTL.St_opaccsA (opaccs, dstr, srcr1, srcr2, lbl) ->
75 Printf.sprintf "%sA %s, %s, %s --> %s"
76 (I8051.print_opaccs opaccs)
78 (Register.print srcr1)
79 (Register.print srcr2)
81 | ERTL.St_opaccsB (opaccs, dstr, srcr1, srcr2, lbl) ->
82 Printf.sprintf "%sB %s, %s, %s --> %s"
83 (I8051.print_opaccs opaccs)
85 (Register.print srcr1)
86 (Register.print srcr2)
88 | ERTL.St_op1 (op1, dstr, srcr, lbl) ->
89 Printf.sprintf "%s %s, %s --> %s"
94 | ERTL.St_op2 (op2, dstr, srcr1, srcr2, lbl) ->
95 Printf.sprintf "%s %s, %s, %s --> %s"
98 (Register.print srcr1)
99 (Register.print srcr2)
101 | ERTL.St_clear_carry lbl ->
102 Printf.sprintf "clear CARRY --> %s" lbl
103 | ERTL.St_set_carry lbl ->
104 Printf.sprintf "set CARRY --> %s" lbl
105 | ERTL.St_load (dstr, addr1, addr2, lbl) ->
106 Printf.sprintf "load %s, (%s, %s) --> %s"
107 (Register.print dstr)
108 (Register.print addr1)
109 (Register.print addr2)
111 | ERTL.St_store (addr1, addr2, srcr, lbl) ->
112 Printf.sprintf "store (%s, %s), %s --> %s"
113 (Register.print addr1)
114 (Register.print addr2)
115 (Register.print srcr)
117 | ERTL.St_call_id (f, nb_args, lbl) ->
118 Printf.sprintf "call \"%s\", %d --> %s" f nb_args lbl
119 | ERTL.St_call_ptr (f1, f2, nb_args, lbl) ->
120 Printf.sprintf "call_ptr [%s ; %s], %d --> %s"
126 | ERTL.St_tailcall_id (f, nb_args) ->
127 Printf.sprintf "tailcall \"%s\", %d"
130 | ERTL.St_tailcall_ptr (f, args) ->
131 Printf.sprintf "tailcall_ptr %s, %s"
135 | ERTL.St_cond (srcr, lbl_true, lbl_false) ->
136 Printf.sprintf "branch %s <> 0 --> %s, %s"
137 (Register.print srcr) lbl_true lbl_false
138 | ERTL.St_return ret_regs ->
139 Printf.sprintf "return %s" (print_return ret_regs)
142 let print_graph eformat n c =
144 Eformat.printf eformat "%s%s: %s\n"
147 (print_statement stmt) in
151 let print_internal_decl eformat n f def =
152 Eformat.printf eformat
153 "%s\"%s\" %d\n%slocals: %s\n%sstacksize: %d\n%sentry: %s\n%sexit: %s\n\n"
158 (print_locals def.ERTL.f_locals)
165 print_graph eformat (n+2) def.ERTL.f_graph
168 let print_external_decl eformat n f def =
169 Eformat.printf eformat "%sextern \"%s\": %s\n"
172 (Primitive.print_sig def.AST.ef_sig)
175 let print_fun_decl eformat n (f, def) = match def with
176 | ERTL.F_int def -> print_internal_decl eformat n f def
177 | ERTL.F_ext def -> print_external_decl eformat n f def
179 let print_fun_decls eformat n functs =
181 (fun f -> print_fun_decl eformat n f ; Eformat.printf eformat "\n\n")
185 let print_program p =
186 let eformat = Eformat.create () in
187 Eformat.printf eformat "program:\n\n\n" ;
188 print_globals eformat 2 p.ERTL.vars ;
189 Eformat.printf eformat "\n\n" ;
190 print_fun_decls eformat 2 p.ERTL.functs ;