let update_actions_return_func kf ki tr =
let ret_ki = Kstmt (Kernel_function.find_return kf) in
let auto = Data_for_aorai.getAutomata () in
let treat_one_trans pre_state idx status =
let trans = Data_for_aorai.getTransition idx in
let map = Data_for_aorai.get_action_bindings kf ki pre_state trans.start in
if status then begin
Aorai_option.debug ~dkey:"action"
"Return statement of %a: treating transition %s -> %s from initial state %s"
Kernel_function.pretty kf
trans.start.Promelaast.name trans.stop.Promelaast.name
pre_state.Promelaast.name;
Cil_datatype.Term.Map.iter
(fun l _ -> Aorai_option.debug ~dkey:"action"
"Got binding for %a" Cil_datatype.Term.pretty l)
map;
let actions = actions_to_range_step kf ki pre_state trans in
let map =
List.fold_left
(fun map (l, (b,r)) ->
Aorai_option.debug ~dkey:"action" "%a <- %a + %a"
Cil_datatype.Term.pretty l Cil_datatype.Term.pretty b
Data_for_aorai.Range.pretty r;
let bindings =
try Cil_datatype.Term.Map.find l map
with Not_found -> Cil_datatype.Term.Map.empty
in
Cil_datatype.Term.Map.add
l (Cil_datatype.Term.Map.add b r bindings) map)
map actions
in
Data_for_aorai.merge_action_bindings kf ret_ki pre_state trans.stop map
end
in
let treat_one_pre_trans trans =
Array.iteri (treat_one_trans trans.start) tr.(trans.stop.nums)
in
let treat_one_state pre_state =
let my_trans = Path_analysis.get_transitions_of_state pre_state auto in
List.iter treat_one_pre_trans my_trans
in
let pre_states = active_before_call kf in
Data_for_aorai.Aorai_state.Set.iter treat_one_state pre_states