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 =
process_one_call data_after stmt lvaloption (!Db.From.get kf)
in
let l = List.map 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 =
List.fold_left (fun data kf -> process_call_args data kf stmt args)
data called_functions 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