From b41f2b87bf15570ea54edc552b74c2da2bc1f3bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Fri, 12 Feb 2021 11:51:11 +0100
Subject: [PATCH] [wp] pool tasks

---
 src/plugins/wp/cfgGenerator.ml | 110 ++++++++++++++++++---------------
 1 file changed, 61 insertions(+), 49 deletions(-)

diff --git a/src/plugins/wp/cfgGenerator.ml b/src/plugins/wp/cfgGenerator.ml
index 64f55b7007d..800ecb3a4f9 100644
--- a/src/plugins/wp/cfgGenerator.ml
+++ b/src/plugins/wp/cfgGenerator.ml
@@ -29,7 +29,7 @@ open Wp_parameters
 
 module KFmap = Kernel_function.Map
 
-type task = {
+type pool = {
   mutable modes: CfgCalculus.mode list KFmap.t ;
   mutable props: CfgCalculus.props ;
   mutable lemmas: LogicUsage.logic_lemma list ;
@@ -41,10 +41,6 @@ let empty () = {
   props = `All;
 }
 
-(* -------------------------------------------------------------------------- *)
-(* --- Property Guided Selection                                          --- *)
-(* -------------------------------------------------------------------------- *)
-
 let get_kf_infos model kf ?bhv ?prop () =
   let missing = WpRTE.missing_guards model kf in
   if missing && Wp_parameters.RTE.get () then
@@ -58,6 +54,10 @@ let get_kf_infos model kf ?bhv ?prop () =
     Wp_parameters.warning ~current:false ~once:true "Missing RTE guards" ;
   infos
 
+(* -------------------------------------------------------------------------- *)
+(* --- Behavior Selection                                                 --- *)
+(* -------------------------------------------------------------------------- *)
+
 let empty_default_behavior : funbehavior = {
   b_name = Cil.default_behavior_name ;
   b_requires = [] ;
@@ -81,12 +81,16 @@ let select kf bnames =
           (fun b -> List.mem b.b_name bnames)
           bhvs
 
-let lemma task ?(prop=[]) l =
+(* -------------------------------------------------------------------------- *)
+(* --- Elementary Tasks                                                   --- *)
+(* -------------------------------------------------------------------------- *)
+
+let add_lemma pool ?(prop=[]) l =
   if l.LogicUsage.lem_kind <> `Axiom &&
      (prop=[] || WpPropId.select_by_name prop (WpPropId.mk_lemma_id l))
-  then task.lemmas <- l :: task.lemmas
+  then pool.lemmas <- l :: pool.lemmas
 
-let apply model task ~kf ?infos ?bhvs ?target () =
+let add_funtask model pool ~kf ?infos ?bhvs ?target () =
   let infos = match infos with
     | Some infos -> infos
     | None -> get_kf_infos model kf () in
@@ -97,26 +101,30 @@ let apply model task ~kf ?infos ?bhvs ?target () =
         if List.exists (Cil.is_default_behavior) bhvs then bhvs
         else empty_default_behavior :: bhvs in
   let add_mode kf m =
-    let ms = try KFmap.find kf task.modes with Not_found -> [] in
-    task.modes <- KFmap.add kf (m :: ms) task.modes in
+    let ms = try KFmap.find kf pool.modes with Not_found -> [] in
+    pool.modes <- KFmap.add kf (m :: ms) pool.modes in
   begin
     List.iter (fun bhv -> add_mode kf CfgCalculus.{ infos ; kf ; bhv }) bhvs ;
-    Option.iter (fun ip -> task.props <- `PropId ip) target ;
+    Option.iter (fun ip -> pool.props <- `PropId ip) target ;
   end
 
 let notyet prop =
   Wp_parameters.warning ~once:true
     "Not yet implemented wp for '%a'" Property.pretty prop
 
-let rec strategy_ip model task target =
+(* -------------------------------------------------------------------------- *)
+(* --- Property Tasks                                                     --- *)
+(* -------------------------------------------------------------------------- *)
+
+let rec strategy_ip model pool target =
   let open Property in
   match target with
   | IPLemma { il_name } ->
-      lemma task (LogicUsage.logic_lemma il_name)
+      add_lemma pool (LogicUsage.logic_lemma il_name)
   | IPAxiomatic { iax_props } ->
-      List.iter (strategy_ip model task) iax_props
+      List.iter (strategy_ip model pool) iax_props
   | IPBehavior { ib_kf = kf ; ib_bhv = bhv } ->
-      apply model task ~kf ~bhvs:[bhv] ()
+      add_funtask model pool ~kf ~bhvs:[bhv] ()
   | IPPredicate { ip_kf = kf ; ip_kind ; ip_kinstr = ki } ->
       begin match ip_kind with
         | PKAssumes _ -> ()
@@ -124,37 +132,37 @@ let rec strategy_ip model task target =
             begin
               match ki with
               | Kglobal -> (*TODO*) notyet target
-              | Kstmt _ -> apply model task ~kf ~bhvs:[bhv] ~target ()
+              | Kstmt _ -> add_funtask model pool ~kf ~bhvs:[bhv] ~target ()
             end
         | PKEnsures(bhv,_) ->
-            apply model task ~kf ~bhvs:[bhv] ~target ()
+            add_funtask model pool ~kf ~bhvs:[bhv] ~target ()
         | PKTerminates ->
-            apply model task ~kf ~bhvs:(default kf) ~target ()
+            add_funtask model pool ~kf ~bhvs:(default kf) ~target ()
       end
   | IPDecrease { id_kf = kf } ->
-      apply model task ~kf ~bhvs:(default kf) ~target ()
+      add_funtask model pool ~kf ~bhvs:(default kf) ~target ()
   | IPAssigns { ias_kf=kf ; ias_bhv=Id_loop ca }
   | IPAllocation { ial_kf=kf ; ial_bhv=Id_loop ca } ->
       let bhvs = match ca.annot_content with
         | AAssigns(bhvs,_) | AAllocation(bhvs,_) -> bhvs
         | _ -> [] in
-      apply model task ~kf ~bhvs:(select kf bhvs) ~target ()
+      add_funtask model pool ~kf ~bhvs:(select kf bhvs) ~target ()
   | IPAssigns { ias_kf=kf ; ias_bhv=Id_contract(_,bhv) }
   | IPAllocation { ial_kf=kf ; ial_bhv=Id_contract(_,bhv) }
-    -> apply model task ~kf ~bhvs:[bhv] ~target ()
+    -> add_funtask model pool ~kf ~bhvs:[bhv] ~target ()
   | IPCodeAnnot { ica_kf = kf ; ica_ca = ca } ->
       begin match ca.annot_content with
         | AExtended _ | APragma _ -> ()
         | AStmtSpec(fors,_) ->
             (*TODO*) notyet target ;
-            apply model task ~kf ~bhvs:(select kf fors) ()
+            add_funtask model pool ~kf ~bhvs:(select kf fors) ()
         | AVariant _ ->
-            apply model task ~kf ~target ()
+            add_funtask model pool ~kf ~target ()
         | AAssert(fors, _)
         | AInvariant(fors, _, _)
         | AAssigns(fors, _)
         | AAllocation(fors, _) ->
-            apply model task ~kf ~bhvs:(select kf fors) ~target ()
+            add_funtask model pool ~kf ~bhvs:(select kf fors) ~target ()
       end
   | IPComplete _ -> (*TODO*) notyet target
   | IPDisjoint _ -> (*TODO*) notyet target
@@ -162,19 +170,23 @@ let rec strategy_ip model task target =
   | IPPropertyInstance _ -> notyet target (* ? *)
   | IPExtended _ | IPAxiom _ | IPOther _ -> ()
 
-let strategy_main model task ?(fct=Fct_all) ?(bhv=[]) ?(prop=[]) () =
+(* -------------------------------------------------------------------------- *)
+(* --- Function Strategy Tasks                                            --- *)
+(* -------------------------------------------------------------------------- *)
+
+let strategy_main model pool ?(fct=Fct_all) ?(bhv=[]) ?(prop=[]) () =
   begin
     if fct = Fct_all && bhv = [] then
-      LogicUsage.iter_lemmas (lemma task ~prop) ;
+      LogicUsage.iter_lemmas (add_lemma pool ~prop) ;
     Wp_parameters.iter_fct
       (fun kf ->
          let infos = get_kf_infos model kf ~bhv ~prop () in
          if CfgInfos.annots infos then
            if bhv=[]
-           then apply model task ~infos ~kf ()
-           else apply model task ~infos ~kf ~bhvs:(select kf bhv) ()
+           then add_funtask model pool ~infos ~kf ()
+           else add_funtask model pool ~infos ~kf ~bhvs:(select kf bhv) ()
       ) fct ;
-    task.props <- (if prop=[] then `All else `Names prop);
+    pool.props <- (if prop=[] then `All else `Names prop);
   end
 
 (* -------------------------------------------------------------------------- *)
@@ -186,11 +198,11 @@ struct
 
   module WP = CfgCalculus.Make(VCG)
 
-  let compute model task =
+  let compute model pool =
     begin
       let collection = ref Bag.empty in
       Lang.F.release () ;
-      if task.lemmas <> [] then
+      if pool.lemmas <> [] then
         WpContext.on_context (model,WpContext.Global)
           begin fun () ->
             LogicUsage.iter_lemmas VCG.register_lemma ;
@@ -198,7 +210,7 @@ struct
                 if l.LogicUsage.lem_kind <> `Axiom then
                   let wpo = VCG.compile_lemma l in
                   collection := Bag.add wpo !collection
-              ) task.lemmas ;
+              ) pool.lemmas ;
           end () ;
       KFmap.iter
         (fun _ modes ->
@@ -211,23 +223,23 @@ struct
                      if Cil.is_default_behavior mode.bhv then None
                      else Some mode.bhv.b_name in
                    let index = Wpo.Function(mode.kf,bhv) in
-                   let props = task.props in
+                   let props = pool.props in
                    let wp = WP.compute ~mode ~props in
                    let wcs = VCG.compile_wp index wp in
                    collection := Bag.concat !collection wcs
                  end ()
              end
              (List.rev modes)
-        ) task.modes ;
+        ) pool.modes ;
       CfgAnnot.clear () ;
       CfgInfos.clear () ;
       !collection
     end
 
   let compute_ip model ip =
-    let task = empty () in
-    strategy_ip model task ip ;
-    compute model task
+    let pool = empty () in
+    strategy_ip model pool ip ;
+    compute model pool
 
   let compute_call _model _stmt =
     Wp_parameters.warning
@@ -235,9 +247,9 @@ struct
     Bag.empty
 
   let compute_main model ?fct ?bhv ?prop () =
-    let task = empty () in
-    strategy_main model task ?fct ?bhv ?prop () ;
-    compute model task
+    let pool = empty () in
+    strategy_main model pool ?fct ?bhv ?prop () ;
+    compute model pool
 
 end
 
@@ -267,9 +279,9 @@ let generator setup driver =
 (* --- Dumper                                                             --- *)
 (* -------------------------------------------------------------------------- *)
 
-let dump task =
+let dump pool =
   let module WP = CfgCalculus.Make(CfgDump) in
-  let props = task.props in
+  let props = pool.props in
   KFmap.iter
     (fun _ modes ->
        List.iter
@@ -286,7 +298,7 @@ let dump task =
              raise err
          end
          (List.rev modes)
-    ) task.modes
+    ) pool.modes
 
 let dumper setup driver =
   let model = Factory.instance setup driver in
@@ -294,14 +306,14 @@ let dumper setup driver =
     object
       method model = model
       method compute_ip ip =
-        let task = empty () in
-        strategy_ip model task ip ;
-        dump task ; Bag.empty
+        let pool = empty () in
+        strategy_ip model pool ip ;
+        dump pool ; Bag.empty
       method compute_call _ = Bag.empty
       method compute_main ?fct ?bhv ?prop () =
-        let task = empty () in
-        strategy_main model task ?fct ?bhv ?prop () ;
-        dump task ; Bag.empty
+        let pool = empty () in
+        strategy_main model pool ?fct ?bhv ?prop () ;
+        dump pool ; Bag.empty
     end
   in generator
 
-- 
GitLab