From 49d848e794e2997c63607b14da638d07d95ed6ea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Fri, 10 Jan 2025 11:30:31 +0100
Subject: [PATCH] [Eva] New parameter -eva-memory-footprint to configure the
 ocaml gc.

---
 src/plugins/eva/engine/analysis.ml | 17 +++++++++++------
 src/plugins/eva/parameters.ml      | 14 ++++++++++++++
 src/plugins/eva/parameters.mli     |  2 ++
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/src/plugins/eva/engine/analysis.ml b/src/plugins/eva/engine/analysis.ml
index 3ba7dcb4234..5bf496db627 100644
--- a/src/plugins/eva/engine/analysis.ml
+++ b/src/plugins/eva/engine/analysis.ml
@@ -177,16 +177,21 @@ let () =
     ~user_only:true (fun _ -> reset_analyzer ());
   Project.register_after_global_load_hook reset_analyzer
 
-let tune_gc () =
-  if Sys.ocaml_release.major >= 5 then
-    let minor_heap_size = 8192000 in
-    let space_overhead = 40 in
-    Gc.(set { (get ()) with minor_heap_size; space_overhead; })
+(* 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 ();
-  tune_gc ();
   Parameters.configure_precision ();
   if not (Kernel.AuditCheck.is_empty ()) then
     Eva_audit.check_configuration (Kernel.AuditCheck.get ());
diff --git a/src/plugins/eva/parameters.ml b/src/plugins/eva/parameters.ml
index 620f41b7048..06b181cb86f 100644
--- a/src/plugins/eva/parameters.ml
+++ b/src/plugins/eva/parameters.ml
@@ -398,6 +398,20 @@ 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 90225279e44..ca654e78209 100644
--- a/src/plugins/eva/parameters.mli
+++ b/src/plugins/eva/parameters.mli
@@ -58,6 +58,8 @@ 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