From 812a7bc4799cea0032840292503c31e385b7d511 Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Mon, 31 Jan 2022 17:48:55 +0100
Subject: [PATCH] [C translation] preliminary options for obtaining reparseable
 output

---
 frama_Clang_option.ml   |  8 ++++++++
 frama_Clang_option.mli  |  4 ++++
 frama_Clang_register.ml | 19 +++++++++++++++----
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/frama_Clang_option.ml b/frama_Clang_option.ml
index 12405a98..da1bb319 100644
--- a/frama_Clang_option.ml
+++ b/frama_Clang_option.ml
@@ -52,6 +52,7 @@ module Clang_extra_args =
 
 module Unmangling:
 sig
+  val add_hook_on_update: (unit -> unit) -> unit
   val set: string -> unit
   val get: unit -> string
   val clear: unit -> unit
@@ -66,6 +67,7 @@ end
                 let name = "Unmangling"
                 let default () = "short"
          end)
+    let add_hook_on_update f = Rep.add_hook_on_update (fun _ -> f ())
     let available_opt = Hashtbl.create 7
     let set s = if Hashtbl.mem available_opt s then Rep.set s
     let clear () = Rep.clear ()
@@ -113,6 +115,12 @@ let () =
   UnmanglingShort.add_set_hook (add_unmangling_option "short");
   UnmanglingNo.add_set_hook (add_unmangling_option "id");
 
+module ParseableOutput =
+  False(struct
+      let option_name = "-cxx-parseable-output"
+      let help = "set up Frama-C pretty-printer to output C code that can be reparsed by Frama-C"
+    end)
+
 module C_std_headers = 
   String(
     struct
diff --git a/frama_Clang_option.mli b/frama_Clang_option.mli
index 387872fc..75c4b4d1 100644
--- a/frama_Clang_option.mli
+++ b/frama_Clang_option.mli
@@ -30,11 +30,15 @@ module Clang_extra_args: Parameter_sig.String_list
 (** state of the demangling options. *)
 module Unmangling:
 sig
+  val add_hook_on_update: (unit -> unit) -> unit
   val set: string -> unit
   val get_val: unit -> (string -> string)
   val register_mangling_func: string -> (string->string) -> unit
 end
 
+(** -cxx-parseable-output *)
+module ParseableOutput: Parameter_sig.Bool
+
 (** -cxx-cstdlib-path option *)
 module C_std_headers: Parameter_sig.String
 
diff --git a/frama_Clang_register.ml b/frama_Clang_register.ml
index b277f812..e98a6524 100644
--- a/frama_Clang_register.ml
+++ b/frama_Clang_register.ml
@@ -127,14 +127,25 @@ end
 (* we avoid any side effect on the kernel unless we are parsing explicitly
    a C++ file. *)
 
+let is_cxx_printer_initialized = ref false
+
+let init_cxx_printer () =
+  if not !is_cxx_printer_initialized then begin
+      is_cxx_printer_initialized := true;
+      Cil_printer.register_shallow_attribute Convert.fc_implicit_attr;
+      Cil_printer.register_shallow_attribute Convert.fc_pure_template_decl_attr;
+      Printer.update_printer (module Cxx_printer);
+    end
+
+let () =
+  Frama_Clang_option.Unmangling.add_hook_on_update init_cxx_printer
+
 let is_initialized = ref false
 
 let init_cxx_normalization () =
   if not !is_initialized then begin
       is_initialized:=true;
-      Cil_printer.register_shallow_attribute Convert.fc_implicit_attr;
-      Cil_printer.register_shallow_attribute Convert.fc_pure_template_decl_attr;
-      Printer.update_printer (module Cxx_printer);
+      init_cxx_printer ();
       (* enable exception removal unless it has explicitely been set to false
          on the command line.
        *)
@@ -145,7 +156,7 @@ let init_cxx_normalization () =
       (* C++ allows this *)
       Cil.set_acceptEmptyCompinfo ()
     end
-      
+
 let parse_cxx file =
   init_cxx_normalization ();
   Frama_Clang_option.feedback
-- 
GitLab