From 62c282b68cd59bd332cd2f5a10c394edad7e4d68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Thu, 9 Apr 2020 08:53:57 +0200
Subject: [PATCH] [Eva] Allows registering a dynamic abstraction with several
 possible values.

The function given to [dynamic_register] builds directly the flag instead of
only the abstraction.
---
 src/plugins/value/engine/abstractions.ml  | 23 ++++++-----------------
 src/plugins/value/engine/abstractions.mli |  3 +--
 2 files changed, 7 insertions(+), 19 deletions(-)

diff --git a/src/plugins/value/engine/abstractions.ml b/src/plugins/value/engine/abstractions.ml
index 5f568596c56..9e18ff813ba 100644
--- a/src/plugins/value/engine/abstractions.ml
+++ b/src/plugins/value/engine/abstractions.ml
@@ -71,10 +71,8 @@ module Config = struct
   let mem (Flag domain) =
     exists (fun (Flag flag, _mode) -> flag.name = domain.name)
 
-  type dynamic = Dynamic: (unit -> 'v abstraction) with_info -> dynamic
-
   let abstractions = ref []
-  let dynamic_abstractions : dynamic list ref = ref []
+  let dynamic_abstractions = ref []
 
   let register ~name ~descr ?(experimental=false) ?(priority=0) abstraction =
     let descr = if experimental then "Experimental. " ^ descr else descr in
@@ -83,18 +81,16 @@ module Config = struct
     abstractions := flag :: !abstractions;
     flag
 
-  let dynamic_register ~name ~descr ?(experimental=false) ?(priority=0) make =
-    let descr = if experimental then "Experimental. " ^ descr else descr in
+  let dynamic_register ~name ~descr make =
     Value_parameters.register_domain ~name ~descr;
-    let dynamic = Dynamic { name; experimental; priority; abstraction=make; } in
-    dynamic_abstractions := dynamic :: !dynamic_abstractions
+    dynamic_abstractions := (name, make) :: !dynamic_abstractions
 
   let configure () =
     let add_main_mode mode =
       let main, _ = Globals.entry_point () in
       (main, Domain_mode.Mode.all) :: mode
     in
-    let add config name make =
+    let add config (name, make) =
       let enabled = Value_parameters.Domains.mem name in
       try
         let mode = Value_parameters.DomainsFunction.find name in
@@ -104,17 +100,10 @@ module Config = struct
         if enabled then add (make (), None) config else config
     in
     let aux config (Flag domain as flag) =
-      add config domain.name (fun () -> flag)
+      add config (domain.name, (fun () -> flag))
     in
     let config = List.fold_left aux empty !abstractions in
-    let aux config (Dynamic { name; experimental; priority; abstraction; }) =
-      let make () =
-        let abstraction = abstraction () in
-        Flag { name; experimental; priority; abstraction; }
-      in
-      add config name make
-    in
-    List.fold_left aux config !dynamic_abstractions
+    List.fold_left add config !dynamic_abstractions
 
   (* --- Register default abstractions -------------------------------------- *)
 
diff --git a/src/plugins/value/engine/abstractions.mli b/src/plugins/value/engine/abstractions.mli
index 3f3ff8d674e..8c98ee9b149 100644
--- a/src/plugins/value/engine/abstractions.mli
+++ b/src/plugins/value/engine/abstractions.mli
@@ -94,8 +94,7 @@ val register:
     the last argument when starting an analysis, if the -eva-domains option
     has been set to [name]. See function {!register} for more details. *)
 val dynamic_register:
-  name:string -> descr:string -> ?experimental:bool -> ?priority:int ->
-  (unit -> 'v abstraction) -> unit
+  name:string -> descr:string -> (unit -> flag) -> unit
 
 (** Reduced product between two value abstractions, identified by their keys. *)
 type ('a, 'b) value_reduced_product =
-- 
GitLab