summaryrefslogtreecommitdiff
path: root/lib/compiler/src/beam_ssa_pp.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compiler/src/beam_ssa_pp.erl')
-rw-r--r--lib/compiler/src/beam_ssa_pp.erl71
1 files changed, 53 insertions, 18 deletions
diff --git a/lib/compiler/src/beam_ssa_pp.erl b/lib/compiler/src/beam_ssa_pp.erl
index 4e6974385e..b2f682b705 100644
--- a/lib/compiler/src/beam_ssa_pp.erl
+++ b/lib/compiler/src/beam_ssa_pp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2023. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
%%
-module(beam_ssa_pp).
--export([format_function/1,format_instr/1,format_var/1]).
+-export([format_function/1,format_instr/1,format_var/1,format_type/1]).
-include("beam_ssa.hrl").
-include("beam_types.hrl").
@@ -48,7 +48,7 @@ format_function(#b_function{anno=Anno0,args=Args,
end,
io_lib:format("%% Counter = ~p\n", [Counter]),
[format_anno(Key, Value) ||
- {Key,Value} <- lists:sort(maps:to_list(Anno))],
+ Key := Value <- maps:iterator(Anno, ordered)],
io_lib:format("function `~p`:`~p`(~ts) {\n",
[M, F, format_args(Args, FuncAnno)]),
[format_live_interval(Var, FuncAnno) || Var <- Args],
@@ -99,17 +99,17 @@ format_anno(parameter_info, Map) when is_map(Map) ->
{V,I} <- Params]]
end;
format_anno(Key, Map) when is_map(Map) ->
- Sorted = lists:sort(maps:to_list(Map)),
+ Sorted = maps:to_list(maps:iterator(Map, ordered)),
[io_lib:format("%% ~s:\n", [Key]),
- [io_lib:format("%% ~w => ~w\n", [K,V]) || {K,V} <- Sorted]];
+ [io_lib:format("%% ~kw => ~kw\n", [K,V]) || {K,V} <- Sorted]];
format_anno(Key, Value) ->
- io_lib:format("%% ~s: ~p\n", [Key,Value]).
+ io_lib:format("%% ~s: ~kp\n", [Key,Value]).
format_param_info([{type, T} | Infos], Break) ->
[format_type(T, Break) |
format_param_info(Infos, Break)];
format_param_info([Info | Infos], Break) ->
- [io_lib:format("~s~p", [Break, Info]) |
+ [io_lib:format("~s~kp", [Break, Info]) |
format_param_info(Infos, Break)];
format_param_info([], _Break) ->
[].
@@ -127,9 +127,9 @@ format_block(L, Blocks, FuncAnno) ->
#b_blk{anno=Anno,is=Is,last=Last} = maps:get(L, Blocks),
[case map_size(Anno) of
0 -> [];
- _ -> io_lib:format("%% ~p\n", [Anno])
+ _ -> io_lib:format("%% ~kp\n", [Anno])
end,
- io_lib:format("~p:", [L]),
+ io_lib:format("~kp:", [L]),
format_instrs(Is, FuncAnno, true),
$\n,
format_terminator(Last, FuncAnno)].
@@ -171,20 +171,31 @@ format_i_number(#{}) -> [].
format_terminator(#b_br{anno=A,bool=#b_literal{val=true},
succ=Same,fail=Same}, _) ->
- io_lib:format(" ~sbr ~ts\n", [format_i_number(A),format_label(Same)]);
+ io_lib:format("~s ~sbr ~ts\n",
+ [format_terminator_anno(A),
+ format_i_number(A),
+ format_label(Same)]);
format_terminator(#b_br{anno=A,bool=Bool,succ=Succ,fail=Fail}, FuncAnno) ->
- io_lib:format(" ~sbr ~ts, ~ts, ~ts\n",
- [format_i_number(A),
+ io_lib:format("~s ~sbr ~ts, ~ts, ~ts\n",
+ [format_terminator_anno(A),
+ format_i_number(A),
format_arg(Bool, FuncAnno),
format_label(Succ),
format_label(Fail)]);
format_terminator(#b_switch{anno=A,arg=Arg,fail=Fail,list=List}, FuncAnno) ->
- io_lib:format(" ~sswitch ~ts, ~ts, ~ts\n",
- [format_i_number(A),format_arg(Arg, FuncAnno),
+ io_lib:format("~s ~sswitch ~ts, ~ts, ~ts\n",
+ [format_terminator_anno(A),
+ format_i_number(A),format_arg(Arg, FuncAnno),
format_label(Fail),
format_switch_list(List, FuncAnno)]);
format_terminator(#b_ret{anno=A,arg=Arg}, FuncAnno) ->
- io_lib:format(" ~sret ~ts\n", [format_i_number(A),format_arg(Arg, FuncAnno)]).
+ io_lib:format("~s ~sret ~ts\n",
+ [format_terminator_anno(A),
+ format_i_number(A),
+ format_arg(Arg, FuncAnno)]).
+
+format_terminator_anno(Anno) ->
+ format_instr_anno(Anno, #{}, []).
format_op({Prefix,Name}) ->
io_lib:format("~p:~p", [Prefix,Name]);
@@ -222,7 +233,7 @@ format_args(Args, FuncAnno) ->
format_arg(#b_var{}=Arg, FuncAnno) ->
format_var(Arg, FuncAnno);
format_arg(#b_literal{val=Val}, _FuncAnno) ->
- io_lib:format("`~p`", [Val]);
+ io_lib:format("`~kp`", [Val]);
format_arg(#b_remote{mod=Mod,name=Name,arity=Arity}, FuncAnno) ->
io_lib:format("(~ts:~ts/~p)",
[format_arg(Mod, FuncAnno),format_arg(Name, FuncAnno),Arity]);
@@ -232,7 +243,7 @@ format_arg({Value,Label}, FuncAnno) when is_integer(Label) ->
io_lib:format("{ ~ts, ~ts }", [format_arg(Value, FuncAnno),
format_label(Label)]);
format_arg(Other, _) ->
- io_lib:format("*** ~p ***", [Other]).
+ io_lib:format("*** ~kp ***", [Other]).
format_switch_list(List, FuncAnno) ->
Ss = [io_lib:format("{ ~ts, ~ts }", [format_arg(Val, FuncAnno),
@@ -269,6 +280,16 @@ format_instr_anno(#{arg_types:=Ts}=Anno0, FuncAnno, Args) ->
[io_lib:format(" %% Argument types:~s~ts\n",
[Break, unicode:characters_to_list(Formatted)]) |
format_instr_anno(Anno, FuncAnno, Args)];
+format_instr_anno(#{aliased:=As}=Anno, FuncAnno, Args) ->
+ Break = "\n %% ",
+ [" %% Aliased:",
+ string:join([[Break, format_var(V)] || V <- As], ", "), "\n",
+ format_instr_anno(maps:remove(aliased, Anno), FuncAnno, Args)];
+format_instr_anno(#{unique:=Us}=Anno, FuncAnno, Args) ->
+ Break = "\n %% ",
+ [" %% Unique:",
+ string:join([[Break, format_var(V)] || V <- Us], ", "), "\n",
+ format_instr_anno(maps:remove(unique, Anno), FuncAnno, Args)];
format_instr_anno(Anno, _FuncAnno, _Args) ->
format_instr_anno_1(Anno).
@@ -277,7 +298,7 @@ format_instr_anno_1(Anno) ->
0 ->
[];
_ ->
- [io_lib:format(" %% Anno: ~p\n", [Anno])]
+ [io_lib:format(" %% Anno: ~kp\n", [Anno])]
end.
format_live_interval(#b_var{}=Dst, #{live_intervals:=Intervals}) ->
@@ -292,6 +313,8 @@ format_live_interval(#b_var{}=Dst, #{live_intervals:=Intervals}) ->
end;
format_live_interval(_, _) -> [].
+-spec format_type(type()) -> iolist().
+
format_type(any) ->
"any()";
format_type(#t_atom{elements=any}) ->
@@ -301,6 +324,8 @@ format_type(#t_atom{elements=Es}) ->
|| E <- ordsets:to_list(Es)], " | ");
format_type(#t_bs_matchable{tail_unit=U}) ->
io_lib:format("bs_matchable(~p)", [U]);
+format_type(#t_bitstring{size_unit=S,appendable=true}) ->
+ io_lib:format("bitstring(~p,appendable)", [S]);
format_type(#t_bitstring{size_unit=S}) ->
io_lib:format("bitstring(~p)", [S]);
format_type(#t_bs_context{tail_unit=U}) ->
@@ -333,6 +358,12 @@ format_type(#t_integer{elements={X,X}}) ->
io_lib:format("~p", [X]);
format_type(#t_integer{elements={Low,High}}) ->
io_lib:format("~p..~p", [Low,High]);
+format_type(#t_number{elements=any}) ->
+ "number()";
+format_type(#t_number{elements={X,X}}) ->
+ io_lib:format("number(~p)", [X]);
+format_type(#t_number{elements={Low,High}}) ->
+ io_lib:format("number(~p, ~p)", [Low,High]);
format_type(#t_list{type=ET,terminator=nil}) ->
["list(", format_type(ET), ")"];
format_type(#t_list{type=ET,terminator=TT}) ->
@@ -347,12 +378,16 @@ format_type(#t_tuple{elements=Es,exact=Ex,size=S}) ->
["{",
string:join(format_tuple_elems(S, Ex, Es, 1), ", "),
"}"];
+format_type(other) ->
+ "other()";
format_type(pid) ->
"pid()";
format_type(port) ->
"pid()";
format_type(reference) ->
"reference()";
+format_type(identifier) ->
+ "identifier()";
format_type(none) ->
"none()";
format_type(#t_union{atom=A,list=L,number=N,tuple_set=Ts,other=O}) ->