From 40720b2a3041241860a96e1a36ac299fd21c6dba Mon Sep 17 00:00:00 2001
From: Julien Signoles <julien.signoles@cea.fr>
Date: Wed, 4 Dec 2019 19:38:32 +0100
Subject: [PATCH] [e-acsl] do not monitor compiler built-ins

---
 src/plugins/e-acsl/doc/Changelog                   |  2 ++
 .../e-acsl/src/code_generator/global_observer.ml   | 14 +++++++++-----
 src/plugins/e-acsl/src/code_generator/injector.ml  |  4 ++--
 src/plugins/e-acsl/src/libraries/misc.ml           | 10 +++++++++-
 src/plugins/e-acsl/src/libraries/misc.mli          |  4 +++-
 .../src/project_initializer/dup_functions.ml       |  4 ++--
 .../e-acsl/src/project_initializer/prepare_ast.ml  |  2 +-
 7 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog
index 79d17b198b1..78572f83775 100644
--- a/src/plugins/e-acsl/doc/Changelog
+++ b/src/plugins/e-acsl/doc/Changelog
@@ -19,6 +19,8 @@
 #   configure	configure
 ###############################################################################
 
+-* E-ACSL       [2019/12/04] Fix bug with compiler built-ins.
+
 ############################
 Plugin E-ACSL 20.0 (Calcium)
 ############################
diff --git a/src/plugins/e-acsl/src/code_generator/global_observer.ml b/src/plugins/e-acsl/src/code_generator/global_observer.ml
index a3ab2f4e946..7f3fe8cab77 100644
--- a/src/plugins/e-acsl/src/code_generator/global_observer.ml
+++ b/src/plugins/e-acsl/src/code_generator/global_observer.ml
@@ -111,10 +111,12 @@ let mk_init_function () =
   let stmts =
     Varinfo.Hashtbl.fold_sorted
       (fun vi _ stmts ->
-         (* a global is both allocated and initialized *)
-         Constructor.mk_store_stmt vi
-         :: Constructor.mk_initialize ~loc:Location.unknown (Cil.var vi)
-         :: stmts)
+         if Misc.is_fc_or_compiler_builtin vi then stmts
+         else
+           (* a global is both allocated and initialized *)
+           Constructor.mk_store_stmt vi
+           :: Constructor.mk_initialize ~loc:Location.unknown (Cil.var vi)
+           :: stmts)
       tbl
       stmts
   in
@@ -173,7 +175,9 @@ let mk_init_function () =
 
 let mk_delete_stmts stmts =
   Varinfo.Hashtbl.fold_sorted
-    (fun vi _l acc -> Constructor.mk_delete_stmt vi :: acc)
+    (fun vi _l acc ->
+       if Misc.is_fc_or_compiler_builtin vi then acc
+       else Constructor.mk_delete_stmt vi :: acc)
     tbl
     stmts
 
diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml
index 8714ac2538b..c125b9875c9 100644
--- a/src/plugins/e-acsl/src/code_generator/injector.ml
+++ b/src/plugins/e-acsl/src/code_generator/injector.ml
@@ -593,12 +593,12 @@ let inject_in_global (env, main) = function
 
   (* Cil built-ins and other library globals: nothing to do *)
   | GVarDecl(vi, _) | GVar(vi, _, _) | GFun({ svar = vi }, _)
-    when Cil.is_builtin vi ->
+    when Misc.is_fc_or_compiler_builtin vi ->
     env, main
   | g when Misc.is_library_loc (Global.loc g) ->
     env, main
 
-  (* variables and functions declarations *)
+  (* variable declarations *)
   | GVarDecl(vi, _) | GFunDecl(_, vi, _) ->
     (* do not convert extern ghost variables, because they can't be linked,
        see bts #1392 *)
diff --git a/src/plugins/e-acsl/src/libraries/misc.ml b/src/plugins/e-acsl/src/libraries/misc.ml
index cbc9e16e284..31d7d92833c 100644
--- a/src/plugins/e-acsl/src/libraries/misc.ml
+++ b/src/plugins/e-acsl/src/libraries/misc.ml
@@ -46,6 +46,14 @@ let register_library_function vi =
 
 let reset () = Datatype.String.Hashtbl.clear library_functions
 
+let is_fc_or_compiler_builtin vi =
+  Cil.is_builtin vi
+  ||
+  (String.length vi.vname >= 10
+   &&
+   let prefix = String.sub vi.vname 0 10 in
+   Datatype.String.equal prefix "__builtin_")
+
 (* ************************************************************************** *)
 (** {2 Builders} *)
 (* ************************************************************************** *)
@@ -215,6 +223,6 @@ let name_of_binop = function
 
 (*
 Local Variables:
-compile-command: "make -C ../.."
+compile-command: "make -C ../../../../.."
 End:
 *)
diff --git a/src/plugins/e-acsl/src/libraries/misc.mli b/src/plugins/e-acsl/src/libraries/misc.mli
index c1dafb633c9..59ee66f1faf 100644
--- a/src/plugins/e-acsl/src/libraries/misc.mli
+++ b/src/plugins/e-acsl/src/libraries/misc.mli
@@ -51,6 +51,8 @@ val is_library_loc: location -> bool
 val register_library_function: varinfo -> unit
 val reset: unit -> unit
 
+val is_fc_or_compiler_builtin: varinfo -> bool
+
 (* ************************************************************************** *)
 (** {2 Other stuff} *)
 (* ************************************************************************** *)
@@ -102,6 +104,6 @@ val finite_min_and_max: Ival.t -> Integer.t * Integer.t
 
 (*
 Local Variables:
-compile-command: "make -C ../.."
+compile-command: "make -C ../../../../.."
 End:
 *)
diff --git a/src/plugins/e-acsl/src/project_initializer/dup_functions.ml b/src/plugins/e-acsl/src/project_initializer/dup_functions.ml
index a0e7efedc5e..64fc328a712 100644
--- a/src/plugins/e-acsl/src/project_initializer/dup_functions.ml
+++ b/src/plugins/e-acsl/src/project_initializer/dup_functions.ml
@@ -305,7 +305,7 @@ class dup_functions_visitor prj = object (self)
         (* it is duplicable *)
         && self#is_unvariadic_function vi (* it is not a variadic function *)
         && not (Misc.is_library_loc loc) (* it is not in the E-ACSL's RTL *)
-        && not (Cil.is_builtin vi) (* it is not a Frama-C built-in *)
+        && not (Misc.is_fc_or_compiler_builtin vi) (* it is not a built-in *)
         &&
         (let kf =
            try Globals.Functions.get vi with Not_found -> assert false
@@ -387,7 +387,7 @@ if there are memory-related annotations.@]"
                     but reading some libc code *));
     Cil.JustCopy
   | GVarDecl(vi, _) | GFunDecl(_, vi, _) | GFun({ svar = vi }, _)
-      when Cil.is_builtin vi ->
+      when Misc.is_fc_or_compiler_builtin vi ->
     self#next ();
     Cil.JustCopy
   | _ ->
diff --git a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
index 035f8c083dd..1eee37987db 100644
--- a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
+++ b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
@@ -198,7 +198,7 @@ class prepare_visitor prj = object (self)
     | GVarDecl(vi, loc) | GFunDecl(_, vi, loc) | GFun({ svar = vi }, loc)
       when self#is_unvariadic_function vi
         && not (Misc.is_library_loc loc)
-        && not (Cil.is_builtin vi)
+        && not (Misc.is_fc_or_compiler_builtin vi)
       ->
       let kf = Extlib.the self#current_kf in
       let s = Annotations.funspec ~populate:false kf in
-- 
GitLab