From f53e7dc4dddfcb18979ce18454be03f060db0e62 Mon Sep 17 00:00:00 2001
From: Maxime Jacquemin <maxime2.jacquemin@gmail.com>
Date: Fri, 26 Mar 2021 11:01:57 +0100
Subject: [PATCH] [Eva] api: Something bothered me

The evaluation could only contain unrestricted_response evaluation,
which was quite bothering as it makes the GADT useless.
I've modified it to be able to represent restricted_to_callstack
evaluation as well.
The modification is propagated to eval_lval and eval_exp.
---
 src/plugins/value/utils/results.ml | 38 ++++++++++++++++++++----------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/plugins/value/utils/results.ml b/src/plugins/value/utils/results.ml
index acd45de0ea3..a9ea9e29922 100644
--- a/src/plugins/value/utils/results.ml
+++ b/src/plugins/value/utils/results.ml
@@ -337,8 +337,9 @@ let as_cvalue_model req =
 
 module type Evaluation =
 sig
-  type 'callstack evaluation
-  val v : unrestricted_response evaluation
+  type 'a evaluation
+  type restriction
+  val v : restriction evaluation
   val as_cvalue : 'callstack evaluation -> Main_values.CVal.t result
   val as_functions : 'callstack evaluation ->
       Cil_types.kernel_function list result
@@ -347,21 +348,32 @@ end
 type evaluation = (module Evaluation)
 type lvaluation
 
-let eval_lval lval req =
-  (module struct
-    include Make ()
-    let v = eval_lval lval req
-  end : Evaluation)
+let eval_lval, eval_exp =
+  let module M = Make () in
+  let open Response in
+  let build = function
+    | `LValue (_, Consolidated _)
+    | `Value (Consolidated _) as eval ->
+      (module struct
+        include M
+        type restriction = unrestricted_response
+        let v = eval
+      end : Evaluation)
+    | `LValue (_, (ByCallstack _ | Top | Bottom))
+    | `Value (ByCallstack _ | Top | Bottom) as eval ->
+      (module struct
+        include M
+        type restriction = restricted_to_callstack
+        let v = eval
+      end : Evaluation)
+  in
+  let eval_lval lval req = build @@ M.eval_lval lval req in
+  let eval_exp exp req = build @@ M.eval_exp exp req in
+  eval_lval, eval_exp
 
 let eval_var vi req =
   eval_lval (Cil.var vi) req
 
-let eval_exp exp req =
-  (module struct
-    include Make ()
-    let v = eval_exp exp req
-  end : Evaluation)
-
 let eval_address _lval _req =
   raise Not_implemented
 
-- 
GitLab