let process_call data_after stmt lvaloption funcexp args =
let funcexp_dpds, called_functions =
!Db.Value.expr_to_kernel_function ~with_alarms:CilE.warn_none_mode
(Kstmt stmt) ~deps:(Some Data.bottom) funcexp
in
let used, data =
try
let froms = !Db.From.Callwise.find (Kstmt stmt) in
process_one_call data_after stmt lvaloption froms
with Not_found ->
let do_call kf acc =
(process_one_call data_after stmt lvaloption (!Db.From.get kf))::acc
in
let l = Kernel_function.Set.fold do_call called_functions []
in
List.fold_left
(fun (acc_u,acc_d) (u,d) -> (acc_u || u), Data.merge acc_d d)
(false, Data.bottom) l
in if used then
let data =
Kernel_function.Set.fold
(fun kf data -> process_call_args data kf stmt args)
called_functions
data
in
let data = Data.merge funcexp_dpds data in
used, data
else begin
assert (R.verify (Data.equal data data_after)
"if statement not used, data doesn't change !");
used, data
end