From 2f276a0cf29c8b8541d44c26cd85c7db827123a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Wed, 15 Jan 2025 14:57:00 +0100
Subject: [PATCH] [kernel] Moves new parameter "-memory-footprint" in the
 kernel.

Configures the OCaml garbage collector in the first parsing stage of the
command line.
---
 .../cmdline_parameters/cmdline.ml             | 13 +++++++++++
 .../plugin_entry_points/kernel.ml             | 23 +++++++++++++++++++
 src/plugins/eva/engine/analysis.ml            | 12 ----------
 src/plugins/eva/parameters.ml                 | 14 -----------
 src/plugins/eva/parameters.mli                |  2 --
 5 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/src/kernel_services/cmdline_parameters/cmdline.ml b/src/kernel_services/cmdline_parameters/cmdline.ml
index 944dd8dba3c..2d518f7f43e 100644
--- a/src/kernel_services/cmdline_parameters/cmdline.ml
+++ b/src/kernel_services/cmdline_parameters/cmdline.ml
@@ -380,6 +380,18 @@ let parse known_options_list then_expected options_list =
 
 let non_initial_options_ref = ref []
 
+(* Configure the OCaml Garbage Collector. *)
+let configure_ocaml_gc n =
+  if n < 1 || n > 10 then
+    Kernel_log.warning "Ignoring option -memory-footprint %i, \
+                        its argument should be between 1 and 10." n
+  else
+    let gc_control = Gc.get () in
+    let values = [| 24; 30; 40; 60; 90; 120; 150; 190; 240; 300 |] in
+    let space_overhead = values.(n-1) in
+    if space_overhead <> gc_control.space_overhead then
+      Gc.set { gc_control with space_overhead }
+
 let () =
   let first_parsing_stage () =
     parse
@@ -394,6 +406,7 @@ let () =
         "-kernel-debug", Int (fun n -> Kernel_debug_level.set n);
         "-deterministic", Unit (fun () -> deterministic := true);
         "-permissive", Unit (fun () -> permissive := true);
+        "-memory-footprint", Int configure_ocaml_gc
       ]
       false
       all_options
diff --git a/src/kernel_services/plugin_entry_points/kernel.ml b/src/kernel_services/plugin_entry_points/kernel.ml
index e0c936d92f5..cabf7da511d 100644
--- a/src/kernel_services/plugin_entry_points/kernel.ml
+++ b/src/kernel_services/plugin_entry_points/kernel.ml
@@ -1824,6 +1824,29 @@ module TypeCheck =
     let help = "forces typechecking of the source files"
   end)
 
+(* ************************************************************************* *)
+(** {2 Performance options} *)
+(* ************************************************************************* *)
+
+let performance = add_group "Performance"
+
+let () = Parameter_customize.set_group performance
+let () = Parameter_customize.do_not_projectify ()
+let () = Parameter_customize.set_cmdline_stage Cmdline.Early
+module MemoryFootprint =
+  Int
+    (struct
+      let module_name = "MemoryFootprint"
+      let default = 6
+      let option_name = "-memory-footprint"
+      let arg_name = "n"
+      let help =
+        "Control the memory usage of Frama-C. \
+         With smaller values, analyses consume much less memory but are \
+         also slightly slower. Must be between 1 and 10; default is 6."
+    end)
+let () = MemoryFootprint.set_range ~min:1 ~max:10
+
 (* ************************************************************************* *)
 (** {2 Other options} *)
 (* ************************************************************************* *)
diff --git a/src/plugins/eva/engine/analysis.ml b/src/plugins/eva/engine/analysis.ml
index 5bf496db627..c0ea1e2ca83 100644
--- a/src/plugins/eva/engine/analysis.ml
+++ b/src/plugins/eva/engine/analysis.ml
@@ -177,20 +177,8 @@ let () =
     ~user_only:true (fun _ -> reset_analyzer ());
   Project.register_after_global_load_hook reset_analyzer
 
-(* Configure the OCaml Garbage Collector according to the
-   -eva-memory-footprint parameter (only if it has been set). *)
-let configure_ocaml_gc () =
-  if Parameters.MemoryFootprint.is_set () then
-    let gc_control = Gc.get () in
-    let n = Parameters.MemoryFootprint.get () in
-    let values = [| 24; 30; 40; 60; 90; 120; 150; 190; 240; 300 |] in
-    let space_overhead = values.(n-1) in
-    if space_overhead <> gc_control.space_overhead then
-      Gc.set { gc_control with space_overhead }
-
 (* Builds the analyzer if needed, and run the analysis. *)
 let force_compute () =
-  configure_ocaml_gc ();
   Ast.compute ();
   Parameters.configure_precision ();
   if not (Kernel.AuditCheck.is_empty ()) then
diff --git a/src/plugins/eva/parameters.ml b/src/plugins/eva/parameters.ml
index 06b181cb86f..620f41b7048 100644
--- a/src/plugins/eva/parameters.ml
+++ b/src/plugins/eva/parameters.ml
@@ -398,20 +398,6 @@ module JoinResults =
       let default = true
     end)
 
-let () = Parameter_customize.set_group performance
-module MemoryFootprint =
-  Int
-    (struct
-      let default = 6
-      let option_name = "-eva-memory-footprint"
-      let arg_name = "n"
-      let help =
-        "Control the memory usage of the analysis. \
-         With smaller values, the analysis consumes much less memory but is \
-         also slightly slower. Must be between 1 and 10; default is 6."
-    end)
-let () = MemoryFootprint.set_range ~min:1 ~max:10
-
 (* ------------------------------------------------------------------------- *)
 (* --- Non-standard alarms                                               --- *)
 (* ------------------------------------------------------------------------- *)
diff --git a/src/plugins/eva/parameters.mli b/src/plugins/eva/parameters.mli
index ca654e78209..90225279e44 100644
--- a/src/plugins/eva/parameters.mli
+++ b/src/plugins/eva/parameters.mli
@@ -58,8 +58,6 @@ module ResultsAll: Parameter_sig.Bool
 
 module JoinResults: Parameter_sig.Bool
 
-module MemoryFootprint: Parameter_sig.Int
-
 module WarnSignedConvertedDowncast: Parameter_sig.Bool
 module WarnPointerSubstraction: Parameter_sig.Bool
 module WarnCopyIndeterminate: Parameter_sig.Kernel_function_set
-- 
GitLab