diff --git a/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml b/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml index c9b710bc924f95102ee9ab0a3773537682fe278d..371c3b8dfbf8f81e55b0f76b0403b40bbff700ff 100644 --- a/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml +++ b/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml @@ -203,8 +203,8 @@ let index_from_sizes_and_shifts ~loc sizes_and_shifts = in sum -let put_block_at_label env block label = - let stmt = Label.get_stmt label in +let put_block_at_label env kf block label = + let stmt = Label.get_stmt kf label in let env_ref = ref env in let o = object inherit Visitor.frama_c_inplace @@ -336,7 +336,7 @@ let to_exp ~loc kf env pot label = Env.After in (* Put at label *) - let env = put_block_at_label env storing_loops_block label in + let env = put_block_at_label env kf storing_loops_block label in (* Returning *) let lval_at_index, env = lval_at_index ~loc kf env (e_at, vi_at, t_index) in let e = Cil.new_exp ~loc (Lval lval_at_index) in diff --git a/src/plugins/e-acsl/src/code_generator/env.ml b/src/plugins/e-acsl/src/code_generator/env.ml index b6c1f7742c8938d5d927fc025b0512df3cf10956..1042770c680c09015d363bdb5eb04e2bbd8b685e 100644 --- a/src/plugins/e-acsl/src/code_generator/env.ml +++ b/src/plugins/e-acsl/src/code_generator/env.ml @@ -311,23 +311,15 @@ module Logic_scope = struct else env end -let _emitter = (* [TODO ARCHI] *) +let emitter = Emitter.create "E_ACSL" [ Emitter.Code_annot ] ~correctness:[ Options.Gmp_only.parameter ] ~tuning:[] -(* [TODO ARCHI] to be reimplemented *) -let add_assert _env _stmt _annot = assert false -(*match current_kf env with - | None -> assert false - | Some _kf -> -(* Queue.add - (fun () -> Annotations.add_assert emitter ~kf stmt annot) - env.visitor#get_filling_actions - *)*) - +(* [TODO ARCHI] to be inlined? *) +let add_assert kf stmt annot = Annotations.add_assert emitter ~kf stmt annot let add_stmt ?(post=false) ?before env kf stmt = if not post then diff --git a/src/plugins/e-acsl/src/code_generator/env.mli b/src/plugins/e-acsl/src/code_generator/env.mli index bfc4a75da8cf0c9ca2ca94ad774b9e4b301246d8..489a6907275b71b32cb6b5b14c5133d4866a97c6 100644 --- a/src/plugins/e-acsl/src/code_generator/env.mli +++ b/src/plugins/e-acsl/src/code_generator/env.mli @@ -75,7 +75,7 @@ module Logic_binding: sig end -val add_assert: t -> stmt -> predicate -> unit +val add_assert: kernel_function -> stmt -> predicate -> unit (** [add_assert env s p] associates the assertion [p] to the statement [s] in the environment [env]. *) diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml index e52e2631f6aaf968c16282f58d3d4582c28eee15..a4503120fd679521759deba4890bcadfa59decf7 100644 --- a/src/plugins/e-acsl/src/code_generator/injector.ml +++ b/src/plugins/e-acsl/src/code_generator/injector.ml @@ -426,12 +426,13 @@ let rec inject_in_substmt env kf stmt = match stmt.skind with let env = inject_in_block env kf blk2 in skind, env - | TryExcept(blk1, (instrs, e), blk2, loc) -> - let env = inject_in_block env kf blk1 in + | TryExcept(_blk1, (_instrs, _e), _blk2, _loc) -> + Error.not_yet "try ... except ..." +(* let env = inject_in_block env kf blk1 in let e, env = replace_literal_string_in_exp false env kf e in let env = inject_in_block env kf blk2 in ignore (assert false) (* TODO ARCHI: instrs *); - TryExcept(blk1, (instrs, e), blk2, loc), env + TryExcept(blk1, (instrs, e), blk2, loc), env*) (* nothing to do: *) | Throw(None, _) diff --git a/src/plugins/e-acsl/src/code_generator/label.ml b/src/plugins/e-acsl/src/code_generator/label.ml index f6638213b5a6a709d1a21b0bfda26048d0671a99..fbbb0c6b4dcbf3d63968e68b452a9534dea2b180 100644 --- a/src/plugins/e-acsl/src/code_generator/label.ml +++ b/src/plugins/e-acsl/src/code_generator/label.ml @@ -69,19 +69,15 @@ let move kf ~old new_stmt = in List.iter mv_labels f.sallstmts -(* [TODO ARCHI] reimplement it *) -let get_stmt = function +let get_stmt kf = function | StmtLabel { contents = stmt } -> stmt - | BuiltinLabel Here -> -(* (match vis#current_stmt with - | None -> Error.not_yet "label \"Here\" in function contract" - | Some s -> s)*) assert false + | BuiltinLabel Here -> Error.not_yet "Label 'Here'" | BuiltinLabel(Old | Pre) -> -(* (try Kernel_function.find_first_stmt (Extlib.the vis#current_kf) - with Kernel_function.No_Statement -> assert false)*)assert false + (try Kernel_function.find_first_stmt kf + with Kernel_function.No_Statement -> assert false) | BuiltinLabel(Post) -> -(* (try Kernel_function.find_return (Extlib.the vis#current_kf) - with Kernel_function.No_Statement -> assert false)*) assert false + (try Kernel_function.find_return kf + with Kernel_function.No_Statement -> assert false) | BuiltinLabel _ | FormalLabel _ -> assert false (* diff --git a/src/plugins/e-acsl/src/code_generator/label.mli b/src/plugins/e-acsl/src/code_generator/label.mli index 194e2d2589e71afdb5052025317b6ff10c09c6a6..33cda6f389600a2953097308a4d3fb5bbc826a0b 100644 --- a/src/plugins/e-acsl/src/code_generator/label.mli +++ b/src/plugins/e-acsl/src/code_generator/label.mli @@ -26,7 +26,7 @@ val move: kernel_function -> old:stmt -> stmt -> unit (** Move all labels of the [old] stmt onto the new [stmt]. Both stmts must be in the new project. *) -val get_stmt: logic_label -> stmt +val get_stmt: kernel_function -> logic_label -> stmt (** @return the statement where the logic label points to. *) val new_labeled_stmt: stmt -> stmt diff --git a/src/plugins/e-acsl/src/code_generator/logic_functions.ml b/src/plugins/e-acsl/src/code_generator/logic_functions.ml index 8ac2421c992837dd13ee58d2289c55b71f4c397a..066849bd09a4573576c97d5e4876c2a6fc96c188 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_functions.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_functions.ml @@ -177,10 +177,8 @@ let generate_kf ~loc fname env ret_ty params_ty li = in Cil.setMaxId fundec; let spec = Cil.empty_funspec () in - (*[TODO ARCHI] reimplement *) -(* Queue.add - (fun () -> Globals.Functions.replace_by_definition spec fundec loc) - (Env.get_visitor env)#get_filling_actions;*) + (* register the definition *) + Globals.Functions.replace_by_definition spec fundec loc; (* create the kernel function itself *) let kf = { fundec = Definition(fundec, loc); spec } in (* closure generating the function's body. diff --git a/src/plugins/e-acsl/src/code_generator/translate.ml b/src/plugins/e-acsl/src/code_generator/translate.ml index 9433bd739e7fa507c0aa3edb577138cb1eb5feb5..b87da402318bb6e13171e6734d5e8e77da87756d 100644 --- a/src/plugins/e-acsl/src/code_generator/translate.ml +++ b/src/plugins/e-acsl/src/code_generator/translate.ml @@ -369,7 +369,7 @@ and context_insensitive_term_to_exp kf env t = guard (Logic_const.prel ~loc (Req, t2, zero)) in - Env.add_assert env cond (Logic_const.prel (Rneq, t2, zero)); + Env.add_assert kf cond (Logic_const.prel (Rneq, t2, zero)); let instr = Misc.mk_call ~loc name [ e; e1; e2 ] in [ cond; instr ] in @@ -619,7 +619,7 @@ and comparison_to_exp Error.not_yet "comparison involving real numbers" and at_to_exp_no_lscope env kf t_opt label e = - let stmt = E_acsl_label.get_stmt label in + let stmt = E_acsl_label.get_stmt kf label in (* generate a new variable denoting [\at(t',label)]. That is this variable which is the resulting expression. ACSL typing rule ensures that the type of this variable is the same as @@ -660,9 +660,10 @@ and at_to_exp_no_lscope env kf t_opt label e = Cil.ChangeTo stmt end in - let _new_stmt = Visitor.visitFramacStmt o stmt in - (* [TODO ARCHI] reimplement *) - (*Visitor_behavior.Set.stmt bhv stmt new_stmt;*) + (* [TODO ARCHI] is it still useful? *) + ignore (Visitor.visitFramacStmt o stmt); + (*let _new_stmt = Visitor.visitFramacStmt o stmt in + Visitor_behavior.Set.stmt bhv stmt new_stmt;*) res, !env_ref, C_number and env_of_li li kf env loc =