From 21c818478cae5d06ab446234c0984709e3dcb90b Mon Sep 17 00:00:00 2001
From: Thibault Martin <thi.martin.pro@pm.me>
Date: Thu, 21 Sep 2023 09:34:58 +0200
Subject: [PATCH] Registering a new ACSL extension requires plugin's name

---
 .../ast_queries/acsl_extension.ml             | 36 ++++++++++++-------
 .../ast_queries/acsl_extension.mli            | 21 +++++++----
 src/kernel_services/ast_queries/dyncall.ml    |  6 ++--
 src/kernel_services/ast_queries/logic_env.ml  |  8 +++--
 src/kernel_services/ast_queries/logic_env.mli |  4 +++
 src/plugins/eva/domains/taint_domain.ml       |  4 +--
 src/plugins/eva/utils/eva_annotations.ml      |  2 +-
 src/plugins/eva/utils/widen_hints_ext.ml      |  2 +-
 src/plugins/wp/Probe.ml                       |  2 +-
 src/plugins/wp/ProofStrategy.ml               |  4 +--
 src/plugins/wp/RefUsage.ml                    |  2 +-
 src/plugins/wp/RegionAnnot.ml                 |  2 +-
 12 files changed, 61 insertions(+), 32 deletions(-)

diff --git a/src/kernel_services/ast_queries/acsl_extension.ml b/src/kernel_services/ast_queries/acsl_extension.ml
index 9593eeb1eb7..b22e748f786 100644
--- a/src/kernel_services/ast_queries/acsl_extension.ml
+++ b/src/kernel_services/ast_queries/acsl_extension.ml
@@ -52,6 +52,7 @@ type extension_common = {
   visitor: extension_visitor ;
   printer: extension_printer ;
   short_printer: extension_printer ;
+  plugin: string;
 }
 
 let default_printer printer fmt = function
@@ -64,6 +65,7 @@ let default_printer printer fmt = function
 let default_short_printer name _printer fmt _ext_kind = Format.fprintf fmt "%s" name
 
 let make
+    ~plugin
     name category
     ?(preprocessor=Fun.id)
     typer
@@ -71,9 +73,11 @@ let make
     ?(printer=default_printer)
     ?(short_printer=default_short_printer name)
     status : extension_single*extension_common =
-  { preprocessor; typer; status},{ category; visitor; printer; short_printer }
+  { preprocessor; typer; status},
+  { category; visitor; printer; short_printer; plugin }
 
 let make_block
+    ~plugin
     name category
     ?(preprocessor=Fun.id)
     typer
@@ -81,7 +85,8 @@ let make_block
     ?(printer=default_printer)
     ?(short_printer=default_short_printer name)
     status : extension_block*extension_common =
-  { preprocessor; typer; status},{ category; visitor; printer; short_printer }
+  { preprocessor; typer; status},
+  { category; visitor; printer; short_printer; plugin }
 
 module Extensions = struct
   (*hash table for  category, visitor, printer and short_printer of extensions*)
@@ -113,10 +118,11 @@ module Extensions = struct
 
   let is_extension_block = Hashtbl.mem ext_block_tbl
 
-  let register
-      cat name ?preprocessor typer ?visitor ?printer ?short_printer status =
+  let register cat ~plugin name
+      ?preprocessor typer ?visitor ?printer ?short_printer status =
     let info1,info2 =
-      make name cat ?preprocessor typer ?visitor ?printer ?short_printer status
+      make ~plugin name cat ?preprocessor typer
+        ?visitor ?printer ?short_printer status
     in
     if is_extension name then
       Kernel.warning ~wkey:Kernel.wkey_acsl_extension
@@ -128,10 +134,11 @@ module Extensions = struct
         Hashtbl.add ext_tbl name info2
       end
 
-  let register_block
-      cat name ?preprocessor typer ?visitor ?printer ?short_printer status =
+  let register_block cat ~plugin name
+      ?preprocessor typer ?visitor ?printer ?short_printer status =
     let info1,info2 =
-      make_block name cat ?preprocessor typer ?visitor ?printer ?short_printer status
+      make_block ~plugin name cat ?preprocessor typer
+        ?visitor ?printer ?short_printer status
     in
     if is_extension name then
       Kernel.warning ~wkey:Kernel.wkey_acsl_extension
@@ -182,16 +189,20 @@ module Extensions = struct
   let visit name = (find_common name).visitor
 
   let print name printer fmt kind =
-    let pp = (find_common name).printer printer in
+    let ext_common = find_common name in
+    let plugin = ext_common.plugin in
+    let pp = ext_common.printer printer in
     match kind with
     | Ext_annot (id,_) ->
-      Format.fprintf fmt "@[<v 2>@[%s %s {@]@\n%a}@]" name id pp kind
+      Format.fprintf fmt "@[<v 2>@[\\%s::%s %s {@]@\n%a}@]" plugin name id pp kind
     | _ ->
-      Format.fprintf fmt "@[<hov 2>%s %a;@]" name pp kind
+      Format.fprintf fmt "@[<hov 2>\\%s::%s %a;@]" plugin name pp kind
 
   let short_print name printer fmt kind =
     let pp = (find_common name).short_printer in
     Format.fprintf fmt "%a" (pp printer) kind
+
+  let extension_from name = (find_common name).plugin
 end
 
 (* Registration functions *)
@@ -219,7 +230,8 @@ let () =
     ~is_extension: Extensions.is_extension
     ~preprocess: Extensions.preprocess
     ~is_extension_block: Extensions.is_extension_block
-    ~preprocess_block: Extensions.preprocess_block;
+    ~preprocess_block: Extensions.preprocess_block
+    ~extension_from:Extensions.extension_from;
   Logic_typing.set_extension_handler
     ~is_extension: Extensions.is_extension
     ~typer: Extensions.typing
diff --git a/src/kernel_services/ast_queries/acsl_extension.mli b/src/kernel_services/ast_queries/acsl_extension.mli
index 935ba239ef0..1744a487853 100644
--- a/src/kernel_services/ast_queries/acsl_extension.mli
+++ b/src/kernel_services/ast_queries/acsl_extension.mli
@@ -98,7 +98,8 @@ type extension_printer =
     @see <https://frama-c.com/download/frama-c-plugin-development-guide.pdf>
 *)
 val register_behavior:
-  string -> ?preprocessor:extension_preprocessor -> extension_typer ->
+  plugin:string -> string ->
+  ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
@@ -108,7 +109,8 @@ val register_behavior:
     @see <https://frama-c.com/download/frama-c-plugin-development-guide.pdf>
 *)
 val register_global:
-  string -> ?preprocessor:extension_preprocessor -> extension_typer ->
+  plugin:string -> string ->
+  ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
@@ -118,7 +120,8 @@ val register_global:
     @see <https://frama-c.com/download/frama-c-plugin-development-guide.pdf>
 *)
 val register_global_block:
-  string -> ?preprocessor:extension_preprocessor_block -> extension_typer_block ->
+  plugin:string -> string ->
+  ?preprocessor:extension_preprocessor_block -> extension_typer_block ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
@@ -129,7 +132,8 @@ val register_global_block:
     @see <https://frama-c.com/download/frama-c-plugin-development-guide.pdf>
 *)
 val register_code_annot:
-  string -> ?preprocessor:extension_preprocessor -> extension_typer ->
+  plugin:string -> string ->
+  ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
@@ -140,7 +144,8 @@ val register_code_annot:
     @see <https://frama-c.com/download/frama-c-plugin-development-guide.pdf>
 *)
 val register_code_annot_next_stmt:
-  string -> ?preprocessor:extension_preprocessor -> extension_typer ->
+  plugin:string -> string ->
+  ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
@@ -150,7 +155,8 @@ val register_code_annot_next_stmt:
     @see <https://frama-c.com/download/frama-c-plugin-development-guide.pdf>
 *)
 val register_code_annot_next_loop:
-  string -> ?preprocessor:extension_preprocessor -> extension_typer ->
+  plugin:string -> string ->
+  ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
@@ -161,7 +167,8 @@ val register_code_annot_next_loop:
     @see <https://frama-c.com/download/frama-c-plugin-development-guide.pdf>
 *)
 val register_code_annot_next_both:
-  string -> ?preprocessor:extension_preprocessor -> extension_typer ->
+  plugin:string -> string ->
+  ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
diff --git a/src/kernel_services/ast_queries/dyncall.ml b/src/kernel_services/ast_queries/dyncall.ml
index 388a233b910..dd04b7a66a2 100644
--- a/src/kernel_services/ast_queries/dyncall.ml
+++ b/src/kernel_services/ast_queries/dyncall.ml
@@ -255,8 +255,10 @@ let register =
   fun () ->
     if (not !once) then begin
       once := true;
-      Acsl_extension.register_code_annot_next_stmt "calls" typecheck true ;
-      Acsl_extension.register_behavior "instanceof" typecheck true ;
+      Acsl_extension.register_code_annot_next_stmt ~plugin:"kernel"
+        "calls" typecheck true ;
+      Acsl_extension.register_behavior ~plugin:"kernel"
+        "instanceof" typecheck true ;
     end
 
 let () = Cmdline.run_after_configuring_stage register
diff --git a/src/kernel_services/ast_queries/logic_env.ml b/src/kernel_services/ast_queries/logic_env.ml
index cee9bf044d5..4e39e5d4304 100644
--- a/src/kernel_services/ast_queries/logic_env.ml
+++ b/src/kernel_services/ast_queries/logic_env.ml
@@ -31,9 +31,10 @@ module Extensions = struct
   let ref_preprocess = ref (fun _ -> assert false)
   let ref_is_extension_block = ref (fun _ -> assert false)
   let ref_preprocess_block = ref (fun _ -> assert false)
+  let ref_extension_from = ref (fun _ -> assert false)
 
-  let set_extension_handler
-      ~category ~is_extension ~preprocess ~is_extension_block ~preprocess_block =
+  let set_extension_handler ~category ~is_extension ~preprocess
+      ~is_extension_block ~preprocess_block ~extension_from =
     assert (not !initialized) ;
     ref_is_extension := is_extension ;
     ref_category := category ;
@@ -41,6 +42,7 @@ module Extensions = struct
     ref_is_extension_block := is_extension_block;
     ref_preprocess_block := preprocess_block;
     initialized := true ;
+    ref_extension_from := extension_from;
     ()
 
   let is_extension s = !ref_is_extension s
@@ -48,6 +50,7 @@ module Extensions = struct
   let category s = !ref_category s
   let preprocess s = !ref_preprocess s
   let preprocess_block s = !ref_preprocess_block s
+  let extension_from s = !ref_extension_from s
 end
 let set_extension_handler = Extensions.set_extension_handler
 let is_extension = Extensions.is_extension
@@ -55,6 +58,7 @@ let is_extension_block = Extensions.is_extension_block
 let extension_category = Extensions.category
 let preprocess_extension = Extensions.preprocess
 let preprocess_extension_block = Extensions.preprocess_block
+let extension_from = Extensions.extension_from
 
 module CurrentLoc = Cil_const.CurrentLoc
 
diff --git a/src/kernel_services/ast_queries/logic_env.mli b/src/kernel_services/ast_queries/logic_env.mli
index efbcc9e7914..377fe8b74d8 100644
--- a/src/kernel_services/ast_queries/logic_env.mli
+++ b/src/kernel_services/ast_queries/logic_env.mli
@@ -39,6 +39,9 @@ val preprocess_extension:
 val preprocess_extension_block:
   string -> string * Logic_ptree.extended_decl list -> string * Logic_ptree.extended_decl list
 
+(** Return the plugin name of the extension *)
+val extension_from : string -> string
+
 (** {2 Global Tables} *)
 module Logic_info: State_builder.Hashtbl
   with type key = string and type data = Cil_types.logic_info list
@@ -221,6 +224,7 @@ val set_extension_handler:
   preprocess_block:
     (string -> string * Logic_ptree.extended_decl list ->
      string * Logic_ptree.extended_decl list) ->
+  extension_from:(string -> string) ->
   unit
 (** Used to setup references related to the handling of ACSL extensions.
     If your name is not [Acsl_extension], do not call this
diff --git a/src/plugins/eva/domains/taint_domain.ml b/src/plugins/eva/domains/taint_domain.ml
index d87271e5fc7..fb392e0cca0 100644
--- a/src/plugins/eva/domains/taint_domain.ml
+++ b/src/plugins/eva/domains/taint_domain.ml
@@ -420,8 +420,8 @@ let () =
     let parse context = context.type_term context (get_state context) in
     Ext_terms (List.map (parse context) args)
   in
-  Acsl_extension.register_behavior "taints" (typer `Post) false;
-  Acsl_extension.register_code_annot_next_stmt "taint" (typer `Pre) false
+  Acsl_extension.register_behavior ~plugin:"eva" "taints" (typer `Post) false;
+  Acsl_extension.register_code_annot_next_stmt ~plugin:"eva" "taint" (typer `Pre) false
 
 (* Interpretation of logic by the taint domain, using the cvalue domain. *)
 module TaintLogic = struct
diff --git a/src/plugins/eva/utils/eva_annotations.ml b/src/plugins/eva/utils/eva_annotations.ml
index 8a626416fec..ceb834c1e97 100644
--- a/src/plugins/eva/utils/eva_annotations.ml
+++ b/src/plugins/eva/utils/eva_annotations.ml
@@ -99,7 +99,7 @@ struct
       | Stmt -> Acsl_extension.register_code_annot_next_stmt
       | Loop -> Acsl_extension.register_code_annot_next_loop
     in
-    register name typer ~printer false
+    register ~plugin:"eva" name typer ~printer false
 
   let get stmt =
     let filter_add _emitter annot acc =
diff --git a/src/plugins/eva/utils/widen_hints_ext.ml b/src/plugins/eva/utils/widen_hints_ext.ml
index 303056a3ad1..31ceab2ccc3 100644
--- a/src/plugins/eva/utils/widen_hints_ext.ml
+++ b/src/plugins/eva/utils/widen_hints_ext.ml
@@ -161,7 +161,7 @@ let printer _pp fmt ext =
 
 let () =
   Acsl_extension.register_code_annot_next_both
-    "widen_hints" typer ~printer false
+    ~plugin:"eva" "widen_hints" typer ~printer false
 
 let get_widen_hints_annots stmt =
   Annotations.fold_code_annot
diff --git a/src/plugins/wp/Probe.ml b/src/plugins/wp/Probe.ml
index 9c5aa89d7e3..4140b0ea540 100644
--- a/src/plugins/wp/Probe.ml
+++ b/src/plugins/wp/Probe.ml
@@ -99,7 +99,7 @@ let register () =
   if not !registered && Wp_parameters.Probes.get () then
     begin
       registered := true ;
-      Acsl_extension.register_code_annot "probe" parse_probe false ;
+      Acsl_extension.register_code_annot ~plugin:"wp" "probe" parse_probe false ;
     end
 
 let () = Cmdline.run_after_configuring_stage register
diff --git a/src/plugins/wp/ProofStrategy.ml b/src/plugins/wp/ProofStrategy.ml
index e4e46b8c140..a6552be06d3 100644
--- a/src/plugins/wp/ProofStrategy.ml
+++ b/src/plugins/wp/ProofStrategy.ml
@@ -319,9 +319,9 @@ let register () =
       let printer hmap pp _ fmt = function
         | Ext_id id -> Option.iter (pp fmt) (Hashtbl.find_opt hmap id)
         | _ -> () in
-      Acsl_extension.register_global "strategy"
+      Acsl_extension.register_global ~plugin:"wp" "strategy"
         ~printer:(printer sid pp_strategy) parse_strategy false ;
-      Acsl_extension.register_global "proof"
+      Acsl_extension.register_global ~plugin:"wp" "proof"
         ~printer:(printer hid pp_hint) parse_proofs false ;
     end
 
diff --git a/src/plugins/wp/RefUsage.ml b/src/plugins/wp/RefUsage.ml
index b6956f0222f..d34ad61347c 100644
--- a/src/plugins/wp/RefUsage.ml
+++ b/src/plugins/wp/RefUsage.ml
@@ -851,7 +851,7 @@ struct
   end
 
   let () =
-    Acsl_extension.register_behavior
+    Acsl_extension.register_behavior ~plugin:"wp"
       "wp_nullable_args" Nullable_extension.typer false
 
   module HasNullable =
diff --git a/src/plugins/wp/RegionAnnot.ml b/src/plugins/wp/RegionAnnot.ml
index d32aaf7a785..e01ea2a1535 100644
--- a/src/plugins/wp/RegionAnnot.ml
+++ b/src/plugins/wp/RegionAnnot.ml
@@ -498,7 +498,7 @@ let register () =
   then
     begin
       registered := true ;
-      Acsl_extension.register_behavior "region"
+      Acsl_extension.register_behavior ~plugin:"wp" "region"
         typecheck ~printer:pp_extension false
     end
 
-- 
GitLab