diff --git a/src/plugins/value/Eva.mli b/src/plugins/value/Eva.mli index 1c4b9b634e0cdd9ea1211a770d700d4c8186835e..33ff0496971c28ca22f56a4f9d2be0b4f147f483 100644 --- a/src/plugins/value/Eva.mli +++ b/src/plugins/value/Eva.mli @@ -84,7 +84,8 @@ module Results: sig (* Callers / callsites *) val callers : Cil_types.kernel_function -> Cil_types.kernel_function list val callsites : Cil_types.kernel_function -> Cil_types.stmt list - + val callsites_per_caller : Cil_types.kernel_function -> + (Cil_types.kernel_function * Cil_types.stmt list) list end module Value_results: sig diff --git a/src/plugins/value/utils/results.ml b/src/plugins/value/utils/results.ml index 40c3097ace67488459b6438a9ae62376ac54aec0..9cb35d245f0a712d43f3ef2b53e281c8fa642686 100644 --- a/src/plugins/value/utils/results.ml +++ b/src/plugins/value/utils/results.ml @@ -685,10 +685,23 @@ let callers kf = at_start_of kf |> callstacks |> List.filter_map f |> List.sort_uniq Kernel_function.compare +let uniq_sites = List.sort_uniq Cil_datatype.Stmt.compare + let callsites kf = let f = function | [] | (_,Cil_types.Kglobal) :: _ -> None | (_,Kstmt stmt) :: _-> Some stmt in at_start_of kf |> callstacks |> - List.filter_map f |> List.sort_uniq Cil_datatype.Stmt.compare + List.filter_map f |> uniq_sites + +let callsites_per_caller kf = + let module Map = Kernel_function.Map in + let f acc = function + | [] | (_,Cil_types.Kglobal) :: _ -> acc + | (kf,Kstmt stmt) :: _-> + Map.update kf (fun old -> Some (stmt :: Option.value ~default:[] old)) acc + in + at_start_of kf |> callstacks |> + List.fold_left f Map.empty |> Map.to_seq |> List.of_seq |> + List.map (fun (kf,sites) -> kf, uniq_sites sites) diff --git a/src/plugins/value/utils/results.mli b/src/plugins/value/utils/results.mli index 051d79b605a8185b5706d82325ee0291c0c59cd2..3d13c3c74d0172125fef7e3bd2a15a5831536a50 100644 --- a/src/plugins/value/utils/results.mli +++ b/src/plugins/value/utils/results.mli @@ -104,5 +104,6 @@ val is_reachable : Cil_types.stmt -> bool (* reachable by the analysis, not by t (* Callers / callsites *) val callers : Cil_types.kernel_function -> Cil_types.kernel_function list val callsites : Cil_types.kernel_function -> Cil_types.stmt list - +val callsites_per_caller : Cil_types.kernel_function -> + (Cil_types.kernel_function * Cil_types.stmt list) list [@@@ api_end]