Add instructions lines to the debugging result

This commit is contained in:
Gaith Hallak 2022-11-17 15:18:44 +03:00
parent f0d6031fd5
commit 363a550402
2 changed files with 59 additions and 9 deletions

View File

@ -119,7 +119,7 @@ from_string1(ContractString, Options) ->
, warnings := Warnings } = string_to_code(ContractString, Options), , warnings := Warnings } = string_to_code(ContractString, Options),
#{ child_con_env := ChildContracts } = FCodeEnv, #{ child_con_env := ChildContracts } = FCodeEnv,
SavedFreshNames = maps:get(saved_fresh_names, FCodeEnv, #{}), SavedFreshNames = maps:get(saved_fresh_names, FCodeEnv, #{}),
{FateCode, VarsRegs} = aeso_fcode_to_fate:compile(ChildContracts, FCode, SavedFreshNames, Options), {FateCode, VarsRegs, DbglocMap} = aeso_fcode_to_fate:compile(ChildContracts, FCode, SavedFreshNames, Options),
pp_assembler(FateCode, Options), pp_assembler(FateCode, Options),
ByteCode = aeb_fate_code:serialize(FateCode, []), ByteCode = aeb_fate_code:serialize(FateCode, []),
{ok, Version} = version(), {ok, Version} = version(),
@ -132,7 +132,8 @@ from_string1(ContractString, Options) ->
payable => maps:get(payable, FCode), payable => maps:get(payable, FCode),
warnings => Warnings warnings => Warnings
}, },
ResDbg = Res#{variables_registers => VarsRegs}, ResDbg = Res#{ variables_registers => VarsRegs,
instructions_lines => DbglocMap },
FinalRes = FinalRes =
case proplists:get_value(debug_info, Options, false) of case proplists:get_value(debug_info, Options, false) of
true -> ResDbg; true -> ResDbg;
@ -204,7 +205,7 @@ add_extra_call(Contract0, Call, Options) ->
#{fcode := OrgFcode #{fcode := OrgFcode
, fcode_env := #{child_con_env := ChildContracts} , fcode_env := #{child_con_env := ChildContracts}
, ast := Ast} = string_to_code(Contract0, Options), , ast := Ast} = string_to_code(Contract0, Options),
{FateCode, _} = aeso_fcode_to_fate:compile(ChildContracts, OrgFcode, #{}, []), {FateCode, _, _} = aeso_fcode_to_fate:compile(ChildContracts, OrgFcode, #{}, []),
%% collect all hashes and compute the first name without hash collision to %% collect all hashes and compute the first name without hash collision to
SymbolHashes = maps:keys(aeb_fate_code:symbols(FateCode)), SymbolHashes = maps:keys(aeb_fate_code:symbols(FateCode)),
CallName = first_none_match(?CALL_NAME, SymbolHashes, CallName = first_none_match(?CALL_NAME, SymbolHashes,

View File

@ -93,12 +93,57 @@ compile1(ChildContracts, FCode, SavedFreshNames, Options) ->
SFuns = functions_to_scode(ChildContracts, ContractName, Functions, SavedFreshNames, Options), SFuns = functions_to_scode(ChildContracts, ContractName, Functions, SavedFreshNames, Options),
SFuns1 = optimize_scode(SFuns, Options), SFuns1 = optimize_scode(SFuns, Options),
FateCode = to_basic_blocks(SFuns1), FateCode = to_basic_blocks(SFuns1),
?debug(compile, Options, "~s\n", [aeb_fate_asm:pp(FateCode)]), {FateCode1, DbglocMap} =
FateCode1 = case proplists:get_value(include_child_contract_symbols, Options, false) of case proplists:get_value(debug_info, Options, false) of
false -> FateCode; true -> remove_dbgloc(FateCode);
true -> add_child_symbols(ChildContracts, FateCode) false -> {FateCode, #{}}
end,
?debug(compile, Options, "~s\n", [aeb_fate_asm:pp(FateCode1)]),
FateCode2 = case proplists:get_value(include_child_contract_symbols, Options, false) of
false -> FateCode1;
true -> add_child_symbols(ChildContracts, FateCode1)
end, end,
{FateCode1, get_variables_registers()}. {FateCode2, get_variables_registers(), DbglocMap}.
-spec block_dbgloc_map(bcode()) -> DbglocMap when
DbglocMap :: #{integer() => integer()}.
block_dbgloc_map(BB) -> block_dbgloc_map(BB, 0, maps:new()).
-spec block_dbgloc_map(bcode(), integer(), DbglocMap) -> DbglocMap when
DbglocMap :: #{integer() => integer()}.
block_dbgloc_map([], _, DbglocMap) ->
DbglocMap;
block_dbgloc_map([{'DBGLOC', Line} | Rest], Index, DbglocMap) ->
block_dbgloc_map(Rest, Index, maps:put(Index, Line, DbglocMap));
block_dbgloc_map([_ | Rest], Index, DbglocMap) ->
block_dbgloc_map(Rest, Index + 1, DbglocMap).
-spec remove_dbgloc(aeb_fate_code:fcode()) -> {aeb_fate_code:fcode(), DbglocMap} when
DbglocMap :: #{integer() => integer()}.
remove_dbgloc(FateCode) ->
RemoveDbglocFromBBs =
fun(_, BB) ->
IsDbg = fun({'DBGLOC', _}) -> false;
(_) -> true
end,
lists:filter(IsDbg, BB)
end,
RemoveDbglocFromFuns =
fun(_, Fun = {_, _, BBs}) ->
NewBBs = maps:map(RemoveDbglocFromBBs, BBs),
setelement(3, Fun, NewBBs)
end,
DbglocMapFromBBs =
fun(_, {_, _, BBs}) ->
maps:map(fun(_, BB) -> block_dbgloc_map(BB) end, BBs)
end,
OldFuns = aeb_fate_code:functions(FateCode),
DbglocMap = maps:map(DbglocMapFromBBs, OldFuns),
NewFuns = maps:map(RemoveDbglocFromFuns, OldFuns),
{aeb_fate_code:update_functions(FateCode, NewFuns), DbglocMap}.
make_function_id(X) -> make_function_id(X) ->
aeb_fate_code:symbol_identifier(make_function_name(X)). aeb_fate_code:symbol_identifier(make_function_name(X)).
@ -760,7 +805,11 @@ tuple(N) -> aeb_fate_ops:tuple(?a, N).
dbgloc(Env, Ann) -> dbgloc(Env, Ann) ->
case proplists:get_value(debug_info, Env#env.options, false) of case proplists:get_value(debug_info, Env#env.options, false) of
false -> []; false -> [];
true -> [{'DBGLOC', proplists:get_value(line, Ann, -1)}] true ->
case proplists:get_value(line, Ann) of
undefined -> [];
Line -> [{'DBGLOC', Line}]
end
end. end.
%% -- Phase II --------------------------------------------------------------- %% -- Phase II ---------------------------------------------------------------