let choose_f_to_call fbase_to_call call_info =
SlicingParameters.debug ~level:2 "[Fct_Slice.choose_f_to_call]";
let choose_min_slice fi_to_call =
SlicingParameters.debug ~level:2 "MinimizeNbSlice -> choose_min_slice";
let slices = M.fi_slices fi_to_call in
match slices with
| [] -> make_new_ff fi_to_call true
| ff :: [] -> ff, []
| _ ->
Extlib.not_yet_implemented "choose_min_slice with several slices"
in
let choose_full_slice fi_to_call =
SlicingParameters.debug ~level:2 "PropagateMarksOnly -> choose_full_slice";
match M.fi_slices fi_to_call with
| [] -> make_new_ff fi_to_call true
| ff :: [] -> ff, []
| _ ->
Extlib.not_yet_implemented "choose_full_slice with several slices"
in
let to_call, new_filters = match fbase_to_call with
| None ->
SlicingParameters.debug ~level:1 "unknown called function -> keep src";
T.CallSrc None, []
| Some fi_to_call ->
try
let slicing_level = M.fi_slicing_level fi_to_call in
SlicingParameters.debug ~level:1 "choose_call with level %s"
(M.str_level_option slicing_level);
match slicing_level with
| T.DontSlice ->
SlicingParameters.debug ~level:2 "DontSliceCalls -> call src";
T.CallSrc fbase_to_call, []
| T.DontSliceButComputeMarks ->
let ff_to_call, new_filters = choose_full_slice fi_to_call in
(T.CallSlice ff_to_call), new_filters
| T.MinNbSlice ->
let ff_to_call, new_filters = choose_min_slice fi_to_call in
(T.CallSlice ff_to_call), new_filters
| T.MaxNbSlice ->
let ff_to_call, new_filters =
choose_precise_slice fi_to_call call_info in
(T.CallSlice ff_to_call), new_filters
with SlicingTypes.NoPdg ->
SlicingParameters.feedback
"unable to compute %s PDG : call source function"
(M.fi_name fi_to_call);
T.CallSrc None, []
in to_call, new_filters