1
%% -*- erlang-indent-level: 2 -*-
1
2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3
%% Copyright (c) 2003 by Erik Stenman.
3
%% -*- erlang-indent-level: 2 -*-
4
4
%% ====================================================================
5
5
%% Filename : hipe_icode_pp.erl
6
6
%% Module : hipe_icode_pp
7
7
%% Purpose : Pretty-printer for Icode.
9
%% History : * 2003-04-16 (stenman@epfl.ch):
9
%% History : * 2003-04-16 (stenman@epfl.ch): Created.
13
%% $Date: 2003/04/23 12:31:24 $
15
14
%% ====================================================================
17
%% Icode Pretty-Printer.
18
%% ____________________________________________________________________
20
%%@doc Icode PrettyPrinter
23
%% ____________________________________________________________________
20
%% ====================================================================
24
22
-module(hipe_icode_pp).
25
-export([pp/1, pp/2, pp_instrs/2, pp_exit/1]).
29
%% - changed pp_instr => pp_instrs + pp_instr as in RTL and Sparc
30
%% - added pp_exit/1 as in RTL + Sparc.
32
%%@spec (Icode::hipe_icode:icode()) -> ok
24
-export([pp/1, pp/2, pp_block/1]).
27
-export([pp_instrs/2, pp_exit/1]).
30
-include("hipe_icode.hrl").
32
%%---------------------------------------------------------------------
34
%% @spec pp(Icode::hipe_icode:icode()) -> ok
34
%%@doc Prettyprints Linear Icode on stdout.
35
%%<p> Badly formed or unknown instructions are printed suronded by three stars "***".</p>
36
%% @doc Prettyprints linear Icode on stdout.
37
%% <p> Badly formed or unknown instructions are printed surrounded
38
%% by three stars "***".</p>
37
40
pp(standard_io, Icode).
39
%%@spec (IoDevice::iodevice(), Icode::hipe_icode:icode()) -> ok
42
%% @spec pp(IoDevice::iodevice(), Icode::hipe_icode:icode()) -> ok
41
%%@doc Prettyprints Linear Icode on IoDevice.
42
%%<p> Badly formed or unknown instructions are printed suronded by three stars "***".</p>
44
%% @doc Prettyprints linear Icode on IoDevice.
45
%% <p> Badly formed or unknown instructions are printed surrounded by
46
%% three stars "***".</p>
44
{Mod, Fun, _Arity} = hipe_icode:icode_fun(Icode),
45
Args = hipe_icode:icode_params(Icode),
46
io:format(Dev, "~w:~w(", [Mod, Fun]),
48
{Mod, Fun, Arity} = hipe_icode:icode_fun(Icode),
49
Args = hipe_icode:icode_params(Icode),
50
io:format(Dev, "~w:~w/~w(", [Mod, Fun, Arity]),
47
51
pp_args(Dev, Args),
48
52
io:format(Dev, ") ->~n", []),
49
io:format(Dev, "%% Info:~w\n",
53
Info = lists:map(fun(X)-> case X of
56
[erl_types:t_to_string(Y)
62
hipe_icode:icode_info(Icode)),
63
io:format(Dev, "%% Info:~p\n",
50
64
[[case hipe_icode:icode_is_closure(Icode) of
52
66
false -> 'Not a closure'
110
130
pp_instrs_exit(Dev, Is).
112
%% ____________________________________________________________________
134
%%---------------------------------------------------------------------
114
136
pp_instr(Dev, I) ->
115
case hipe_icode:type(I) of
117
io:format(Dev, "~p: ", [hipe_icode:label_name(I)]),
118
case hipe_icode:info(I) of
119
[] -> io:format(Dev, "~n",[]);
120
Info -> io:format(Dev, "~w~n", [Info])
124
io:format(Dev, " % ~p~n", [hipe_icode:comment_text(I)]);
139
io:format(Dev, "~p:~n", [hipe_icode:label_name(I)]);
141
Txt = hipe_icode:comment_text(I),
142
Str = case io_lib:deep_char_list(Txt) of
144
false -> io_lib:format("~p", [Txt])
146
io:format(Dev, " % ~s~n", [Str]);
127
148
io:format(Dev, " ", []),
128
149
pp_arg(Dev, hipe_icode:phi_dst(I)),
129
150
io:format(Dev, " := phi(", []),
130
pp_args(Dev, hipe_icode:phi_args(I)),
151
pp_phi_args(Dev, hipe_icode:phi_arglist(I)),
131
152
io:format(Dev, ")~n", []);
134
154
io:format(Dev, " ", []),
135
pp_arg(Dev, hipe_icode:mov_dst(I)),
155
pp_arg(Dev, hipe_icode:move_dst(I)),
136
156
io:format(Dev, " := ", []),
137
pp_arg(Dev, hipe_icode:mov_src(I)),
157
pp_arg(Dev, hipe_icode:move_src(I)),
138
158
io:format(Dev, "~n", []);
141
case hipe_icode:call_in_guard(I) of
143
io:format(Dev, " <G>", []);
145
io:format(Dev, " ", [])
147
case hipe_icode:call_dst(I) of
160
io:format(Dev, " ", []),
161
case hipe_icode:call_dstlist(I) of
162
[] -> %% result is unused -- e.g. taken out by dead code elimination
149
163
io:format(Dev, "_ := ", []);
165
pp_args(Dev, DstList),
152
166
io:format(Dev, " := ", [])
154
hipe_icode_primops:pp(hipe_icode:call_fun(I), Dev),
155
io:format(Dev, "(", []),
156
pp_args(Dev, hipe_icode:call_args(I)),
168
pp_fun(Dev, hipe_icode:call_fun(I),
169
hipe_icode:call_args(I),
170
hipe_icode:call_type(I),
171
hipe_icode:call_in_guard(I)),
157
172
case hipe_icode:call_continuation(I) of
159
io:format(Dev, ") (~w)", [hipe_icode:call_type(I)]);
161
io:format(Dev, ") (~w) -> ~w",
162
[hipe_icode:call_type(I),CC])
176
io:format(Dev, " -> ~w", [CC])
165
case hipe_icode:call_fail(I) of
178
case hipe_icode:call_fail_label(I) of
166
179
[] -> io:format(Dev, "~n", []);
167
180
Fail -> io:format(Dev, ", #fail ~w~n", [Fail])
170
183
io:format(Dev, " ", []),
171
case hipe_icode:enter_fun(I) of
172
{Mod, Fun, _Arity} ->
173
io:format(Dev, "~w:~w(", [Mod, Fun]);
175
io:format(Dev, "~w(", [Fun]);
177
io:format(Dev, "~w(", [Fun])
179
pp_args(Dev, hipe_icode:enter_args(I)),
180
io:format(Dev, ") (~w) ~n",
181
[hipe_icode:enter_type(I)]);
184
pp_fun(Dev, hipe_icode:enter_fun(I),
185
hipe_icode:enter_args(I),
186
hipe_icode:enter_type(I)),
187
io:format(Dev, "~n", []);
183
189
io:format(Dev, " return(", []),
184
190
pp_args(Dev, hipe_icode:return_vars(I)),
185
191
io:format(Dev, ")~n", []);
187
io:format(Dev, " pushcatch -> ~w cont ~w~n",
188
[hipe_icode:pushcatch_label(I),
189
hipe_icode:pushcatch_successor(I)]);
193
io:format(Dev, " begin_try -> ~w cont ~w~n",
194
[hipe_icode:begin_try_label(I),
195
hipe_icode:begin_try_successor(I)]);
191
197
io:format(Dev, " ", []),
192
case hipe_icode:restore_catch_type(I) of
194
pp_args(Dev, [hipe_icode:restore_catch_reason_dst(I),
195
hipe_icode:restore_catch_type_dst(I)]);
197
pp_arg(Dev, hipe_icode:restore_catch_reason_dst(I))
199
io:format(Dev, " := restore_catch(~w)~n",
200
[hipe_icode:restore_catch_label(I)]);
202
io:format(Dev, " remove_catch(~w)~n",
203
[hipe_icode:remove_catch_label(I)]);
205
Type = case hipe_icode:fail_type(I) of
198
pp_args(Dev, hipe_icode:begin_handler_dstlist(I)),
199
io:format(Dev, " := begin_handler()~n",[]);
201
io:format(Dev, " end_try~n", []);
203
Type = hipe_icode:fail_class(I),
209
204
io:format(Dev, " fail(~w, [", [Type]),
210
pp_args(Dev, hipe_icode:fail_reason(I)),
211
io:put_chars(Dev, "])\n");
205
pp_args(Dev, hipe_icode:fail_args(I)),
206
case hipe_icode:fail_label(I) of
207
[] -> io:put_chars(Dev, "])\n");
208
Fail -> io:format(Dev, "]) -> ~w\n", [Fail])
213
211
io:format(Dev, " if ~w(", [hipe_icode:if_op(I)]),
214
212
pp_args(Dev, hipe_icode:if_args(I)),
215
213
io:format(Dev, ") then ~p (~.2f) else ~p~n",
216
[hipe_icode:if_true_label(I), hipe_icode:if_pred(I), hipe_icode:if_false_label(I)]);
214
[hipe_icode:if_true_label(I), hipe_icode:if_pred(I),
215
hipe_icode:if_false_label(I)]);
218
217
io:format(Dev, " switch_val ",[]),
219
218
pp_arg(Dev, hipe_icode:switch_val_arg(I)),
220
219
pp_switch_cases(Dev, hipe_icode:switch_val_cases(I)),
221
220
io:format(Dev, " fail -> ~w\n",
222
221
[hipe_icode:switch_val_fail_label(I)]);
223
switch_tuple_arity ->
222
#switch_tuple_arity{} ->
224
223
io:format(Dev, " switch_tuple_arity ",[]),
225
224
pp_arg(Dev, hipe_icode:switch_tuple_arity_arg(I)),
226
225
pp_switch_cases(Dev,hipe_icode:switch_tuple_arity_cases(I)),
227
226
io:format(Dev, " fail -> ~w\n",
228
227
[hipe_icode:switch_tuple_arity_fail_label(I)]);
230
229
io:format(Dev, " if is_", []),
231
230
pp_type(Dev, hipe_icode:type_type(I)),
232
231
io:format(Dev, "(", []),
233
pp_arg(Dev, hipe_icode:type_var(I)),
232
pp_args(Dev, hipe_icode:type_args(I)),
234
233
io:format(Dev, ") then ~p (~.2f) else ~p~n",
235
234
[hipe_icode:type_true_label(I), hipe_icode:type_pred(I),
236
235
hipe_icode:type_false_label(I)]);
238
237
io:format(Dev, " goto ~p~n", [hipe_icode:goto_label(I)]);
240
239
io:format(Dev, " ", []),
241
pp_arg(Dev, hipe_icode:fmov_dst(I)),
240
pp_arg(Dev, hipe_icode:fmove_dst(I)),
242
241
io:format(Dev, " f:= ", []),
243
pp_arg(Dev, hipe_icode:fmov_src(I)),
242
pp_arg(Dev, hipe_icode:fmove_src(I)),
244
243
io:format(Dev, "~n", [])
246
pp_fun(Dev, Fun, Args, Type) ->
247
pp_fun(Dev, Fun, Args, Type, false).
249
pp_fun(Dev, Fun, Args, Type, Guard) ->
252
hipe_icode_primops:pp(Fun, Dev);
255
io:format(Dev, "~w/~w", [F, A]);
258
io:format(Dev, "~w:~w/~w", [M, F, A])
260
io:format(Dev, "(", []),
266
io:format(Dev, ") (primop,guard)", []);
268
io:format(Dev, ") (guard)", [])
273
io:format(Dev, ") (primop)", []);
275
io:format(Dev, ")", [])
279
pp_arg(Dev, {var, V, {T, R}}) ->
280
io:format(Dev, "v~p (~s, ~s)", [V, erl_types:t_to_string(T), hipe_icode_range_an:to_string(R)]);
247
281
pp_arg(Dev, {var, V, T}) ->
248
case erl_types:t_is_undefined(T) of
250
io:format(Dev, "v~p", [V]);
252
io:format(Dev, "v~p (~s)", [V, erl_types:t_to_string(T)])
282
io:format(Dev, "v~p (~s)", [V, erl_types:t_to_string(T)]);
254
283
pp_arg(Dev, {var, V}) ->
255
284
io:format(Dev, "v~p", [V]);
256
285
pp_arg(Dev, {fvar, V}) ->