From bb5ffaeb457fc70bff055054fe4093f268bc0e8c Mon Sep 17 00:00:00 2001
From: Valentin Perrelle <valentin.perrelle@cea.fr>
Date: Tue, 18 Dec 2018 14:22:58 +0100
Subject: [PATCH] [Aorai] Simplify the smart constructors handling global
 variables

- use more Cil smart constructors
- use an optional parameter for global variable initial values
- factorisation of common code
---
 src/plugins/aorai/aorai_utils.ml | 78 ++++++++++++--------------------
 1 file changed, 28 insertions(+), 50 deletions(-)

diff --git a/src/plugins/aorai/aorai_utils.ml b/src/plugins/aorai/aorai_utils.ml
index 9d1f4b36412..274932dd15c 100644
--- a/src/plugins/aorai/aorai_utils.ml
+++ b/src/plugins/aorai/aorai_utils.ml
@@ -674,46 +674,28 @@ let flush_globals () =
   Kernel_function.clear_sid_info ();
   globals_queue := []
 
-let mk_global glob = globals_queue := glob :: !globals_queue
+let add_global glob = globals_queue := glob :: !globals_queue
 
 (* Utilities for global variables *)
-let mk_global_c_initialized_vars name ty ini=
-  let vi = (Cil.makeGlobalVar name ty) in
-  vi.vghost<-true;
-  mk_global (GVar(vi,ini,vi.vdecl));
-  Globals.Vars.add vi ini;
-  set_varinfo name vi
-
-let mk_global_var_init vi ini =
-  vi.vghost<-true;
-  mk_global (GVar(vi,ini,vi.vdecl));
-  Globals.Vars.add vi ini;
+let add_gvar ?init vi =
+  let initinfo = {Cil_types.init} in
+  vi.vghost <- true;
+  add_global (GVar(vi,initinfo,vi.vdecl));
+  Globals.Vars.add vi initinfo;
   set_varinfo vi.vname vi
 
-let mk_global_var vi =
-  let ini =
-    {Cil_types.init=Some(Cil.makeZeroInit ~loc:(CurrentLoc.get()) vi.vtype)}
-  in
-  mk_global_var_init vi ini
+let add_gvar_zeroinit vi =
+  add_gvar ~init:(Cil.makeZeroInit ~loc:(CurrentLoc.get()) vi.vtype) vi
 
-let mk_global_c_var_init name init =
-  let ty = Cil.typeOf init in
+let mk_gvar ?init ~ty name =
   let vi = Cil.makeGlobalVar name ty in
-  vi.vghost <- true;
-  let ini = { Cil_types.init = Some(SingleInit init) } in
-  mk_global(GVar(vi,ini,vi.vdecl));
-  Globals.Vars.add vi ini;
-  set_varinfo name vi
-
-let mk_int_const value =
-  new_exp
-    ~loc:(CurrentLoc.get())
-    (Const(
-        CInt64(
-          Integer.of_int (value),
-          IInt,
-          Some(string_of_int(value))
-        )))
+  add_gvar ?init vi
+
+let mk_gvar_scalar ~init ?(ty = Cil.typeOf init) name =
+  mk_gvar ~init:(SingleInit init) ~ty name
+
+let mk_integer value =
+  Cil.integer ~loc:(CurrentLoc.get()) value
 
 (* Utilities for global enumerations *)
 let mk_global_c_enum_type_tagged name elements_l =
@@ -730,14 +712,14 @@ let mk_global_c_enum_type_tagged name elements_l =
       (fun (e,i) ->
          { eiorig_name = e;
            einame = e;
-           eival = mk_int_const i;
+           eival = mk_integer i;
            eiloc = Location.unknown;
            eihost = einfo})
       elements_l
   in
   einfo.eitems <- l;
   set_usedinfo name einfo;
-  mk_global (GEnumTag(einfo, Location.unknown));
+  add_global (GEnumTag(einfo, Location.unknown));
   einfo
 
 let mk_global_c_enum_type name elements =
@@ -747,12 +729,8 @@ let mk_global_c_enum_type name elements =
   (* no need to rev the list, as the elements got their value already *)
   ignore (mk_global_c_enum_type_tagged name elements)
 
-let mk_global_c_initialized_enum name name_enuminfo ini =
-  mk_global_c_initialized_vars name (TEnum(get_usedinfo name_enuminfo,[])) ini
-
-let mk_global_c_enum name name_enuminfo =
-  let init = {Cil_types.init=None} in
-  mk_global_c_initialized_enum name name_enuminfo init
+let mk_gvar_enum ?init name name_enuminfo =
+  mk_gvar ?init ~ty:(TEnum(get_usedinfo name_enuminfo,[])) name
 
 
 (* ************************************************************************* *)
@@ -885,7 +863,7 @@ let is_out_of_state_exp state loc =
 
 (* Utilities for other globals *)
 
-let mk_global_comment txt = mk_global (GText (txt))
+let mk_global_comment txt = add_global (GText (txt))
 
 (* ************************************************************************* *)
 (** {b Initialization management / computation} *)
@@ -905,7 +883,7 @@ let mk_global_states_init root =
        in
        let init = SingleInit init in
        let var = Data_for_aorai.get_state_var state in
-       mk_global_var_init var { Cil_types.init = Some init})
+       add_gvar ~init var)
     states
 
 class visit_decl_loops_init () =
@@ -1126,17 +1104,17 @@ let initGlobals root complete =
     (List.map
        (fun kf -> func_to_op_func (Kernel_function.get_name kf))
        (getObservablesFunctions() @ getIgnoredFunctions()));
-  mk_global_c_enum curOp listOp;
+  mk_gvar_enum curOp listOp;
   mk_global_c_enum_type  listStatus (callStatus::[termStatus]);
-  mk_global_c_enum curOpStatus listStatus;
+  mk_gvar_enum curOpStatus listStatus;
 
   mk_global_comment "//* ";
   mk_global_comment "//* States and Trans Variables";
   if Aorai_option.Deterministic.get () then begin
-    mk_global_c_var_init curState (getInitialState());
+    mk_gvar_scalar ~init:(getInitialState()) curState;
     let init = getInitialState() (* TODO a distinct initial value for history *)
     and history = Data_for_aorai.whole_history () in
-    List.iter (fun name -> mk_global_c_var_init name init) history
+    List.iter (fun name -> mk_gvar_scalar ~init name) history
   end else
     mk_global_states_init root;
 
@@ -1150,14 +1128,14 @@ let initGlobals root complete =
   mk_global_comment "//****************** ";
   mk_global_comment "//* Auxiliary variables used in transition conditions";
   mk_global_comment "//*";
-  List.iter mk_global_var (Data_for_aorai.aux_variables());
+  List.iter add_gvar_zeroinit (Data_for_aorai.aux_variables());
 
   let auto = Data_for_aorai.getAutomata () in
   mk_global_comment "//* ";
   mk_global_comment "//****************** ";
   mk_global_comment "//* Metavariables";
   mk_global_comment "//*";
-  Datatype.String.Map.iter (fun _ -> mk_global_var) auto.metavariables;
+  Datatype.String.Map.iter (fun _ -> add_gvar_zeroinit) auto.metavariables;
 
   if Aorai_option.Deterministic.get () then begin
     (* must flush now previous globals which are used in the lemmas in order to
-- 
GitLab