let find_call_out_nodes_to_select pdg_called called_selected_nodes
pdg_caller call_stmt =
Pdg_parameters.debug ~level:2
"[pdg:find_call_out_nodes_to_select] for call sid:%d@."
call_stmt.sid;
let _, call_sgn =
FI.find_call (PdgTypes.Pdg.get_index pdg_caller) call_stmt
in
let called_selected_nodes_set =
PdgTypes.NodeSet.add_list called_selected_nodes in
let test_out acc (out_key, call_out_node) =
let called_out_nodes, _undef = find_output_nodes pdg_called out_key in
let intersect =
List.exists
(fun (n,_z) -> PdgTypes.NodeSet.mem n called_selected_nodes_set)
called_out_nodes
in
if intersect then begin
Pdg_parameters.debug ~level:2
"\t+ n_%a@." Macros.pretty_node call_out_node;
call_out_node::acc
end else
acc
in
PdgIndex.Signature.fold_all_outputs test_out [] call_sgn