let choose_precise_slice fi_to_call call_info =
let out_call = FctMarks.get_call_output_marks call_info in
let rec find slices = match slices with
| [] ->
let ff, actions = make_new_ff fi_to_call true in
(*
let called_kf = M.get_fi_kf fi_to_call in
let new_actions = add_spare_call_inputs called_kf call_info in
let actions = new_actions @ actions in
*)
ff, actions
| ff :: slices ->
let _missing_outputs, more_outputs =
FctMarks.check_called_marks out_call ff
in
if more_outputs
then (* not enough outputs in [ff] *)
begin
SlicingParameters.debug ~level:2 "[Fct_Slice.choose_precise_slice] %s ? not enought outputs"
(M.ff_name ff);
find slices
end
else
begin
(*
let ff_marks = FctMarks.get_ff_marks ff in
let input_marks = FctMarks.get_all_input_marks ff_marks in
let (caller, call) = CallInfo.get_call_id call_info in
let pdg_caller = M.get_ff_pdg caller in
let caller_marks = FctMarks.get_ff_marks caller in
let _ , more_inputs =
FctMarks.marks_for_caller_inputs pdg_caller caller_marks
call input_marks fi_to_call
in
if more_inputs
then (* [ff] needs too many inputs *)
begin
SlicingKernel.debug ~level:2 "[Fct_Slice.choose_precise_slice] %s ? too many inputs"
(M.ff_name ff);
find slices
end
else
*)
begin
SlicingParameters.debug ~level:2 "[Fct_Slice.choose_precise_slice] %s ? ok" (M.ff_name ff);
ff , []
end
end
in
let slices = M.fi_slices fi_to_call in
find slices