From 147821416040afe78e4cec6d0a8b9c0c614e4373 Mon Sep 17 00:00:00 2001 From: Valentin Perrelle <valentin.perrelle@cea.fr> Date: Thu, 4 Nov 2021 15:40:02 +0100 Subject: [PATCH] [Eva] api Add Eva.Results.callsites_per_caller --- src/plugins/value/Eva.mli | 3 ++- src/plugins/value/utils/results.ml | 15 ++++++++++++++- src/plugins/value/utils/results.mli | 3 ++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/plugins/value/Eva.mli b/src/plugins/value/Eva.mli index 1c4b9b634e0..33ff0496971 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 40c3097ace6..9cb35d245f0 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 051d79b605a..3d13c3c74d0 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] -- GitLab