let get_call_output_marks ?(spare_info=None) call_info =
let sig_call = CallInfo.get_call_sig call_info in
let add1 acc (k,m) = (k,m)::acc in
let call_out_marks = PdgIndex.Signature.fold_all_outputs add1 [] sig_call in
match spare_info with
| None -> call_out_marks
| Some (ff_call, call) ->
let pdg = M.get_ff_pdg ff_call in
let spare = Marks.mk_gen_spare in
let rec add2 marks n =
match !Db.Pdg.node_key n with
| PdgIndex.Key.SigCallKey (_, (PdgIndex.Signature.In _)) ->
marks
| PdgIndex.Key.SigCallKey (_, (PdgIndex.Signature.Out key)) ->
begin
match marks with
| [] -> [(key, spare)]
| (k, m):: marks ->
if PdgIndex.Signature.equal_out_key k key then
let m =
if Marks.is_bottom_mark m then spare else m
in (k, m):: marks
else (k, m)::(add2 marks n)
end
| _ -> assert false
in
PdgTypes.Pdg.fold_call_nodes add2 call_out_marks pdg call