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