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