let data_nodes_visible ff (decl_nodes, (data_nodes, data_in)) =
let keep_annots = SlicingParameters.Mode.KeepAnnotations.get () in
SlicingParameters.debug ~level:2 "[SlicingTransform.Visibility.data_nodes_visible (with keep_annots = %s)] ?"
(if keep_annots then "true" else "false");
let is_data_visible visi (n,z) =
let key = PdgTypes.Node.elem_key n in
let key = match z, key with
| Some z, PdgIndex.Key.SigCallKey
(call, PdgIndex.Signature.Out
(PdgIndex.Signature.OutLoc out_z)) ->
let z = Locations.Zone.narrow z out_z in
PdgIndex.Key.call_output_key (PdgIndex.Key.call_from_id call) z
| _, _ -> key
in
let m = Fct_slice.get_node_key_mark ff key in
if !Db.Slicing.Mark.is_bottom m then
begin
SlicingParameters.debug ~level:2 "[SlicingTransform.Visibility.data_nodes_visible] node %a invisible"
(!Db.Pdg.pretty_node true) n;
false
end
else visi
in
let decls_visible = all_nodes_visible ff decl_nodes in
if keep_annots then decls_visible
else
let visible = decls_visible && data_in_visible ff data_in in
let data_visible = List.fold_left is_data_visible visible data_nodes in
data_visible