let compute kf stmt lval =
debug1 "[Defs.compute] for %a at sid:%d in '%a'@."
!Ast_printer.d_lval lval stmt.sid Kernel_function.pretty kf;
try
let pdg = !Db.Pdg.get kf in
let zone = !Db.Value.lval_to_zone (Kstmt stmt)
~with_alarms:CilE.warn_none_mode lval
in
let nodes, undef =
!Db.Pdg.find_location_nodes_at_stmt pdg stmt ~before:true zone
in
let nodes =
if Interproc.get () then
begin
let caller_nodes =
add_caller_nodes kf nodes
((match undef with None -> Locations.Zone.bottom | Some z -> z),
nodes)
in add_callee_nodes caller_nodes caller_nodes
end
else nodes
in
let add_node defs (node,_z) =
match PdgIndex.Key.stmt (!Db.Pdg.node_key node) with
| None -> defs
| Some s -> Stmt.Set.add s defs
in
let defs = List.fold_left add_node Stmt.Set.empty nodes in
Some (defs, undef)
with Db.Pdg.Bottom | Db.Pdg.Top | Not_found ->
None