diff --git a/src/plugins/e-acsl/src/analyses/analyses_datatype.ml b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml index b638097ad1f4515525721ceb90d1be5a8e13b1b8..ffb904087359dd972d010edb545b309d3435e2c7 100644 --- a/src/plugins/e-acsl/src/analyses/analyses_datatype.ml +++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml @@ -25,6 +25,24 @@ open Cil_datatype open Analyses_types +module Annotation_kind = + Datatype.Make + (struct + type t = annotation_kind + let name = "E_ACSL.Annotation_kind" + let reprs = [ Assertion ] + include Datatype.Undefined + + let pretty fmt akind = + match akind with + | Assertion -> Format.fprintf fmt "Assertion" + | Precondition -> Format.fprintf fmt "Precondition" + | Postcondition -> Format.fprintf fmt "Postcondition" + | Invariant -> Format.fprintf fmt "Invariant" + | Variant -> Format.fprintf fmt "Variant" + | RTE -> Format.fprintf fmt "RTE" + end) + module PredOrTerm = Datatype.Make_with_collections (struct diff --git a/src/plugins/e-acsl/src/analyses/analyses_datatype.mli b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli index 212b5887cd5e0eec1b4acbb766b7b28a05ef1c75..481963ab89cc7ba832e28937849520e27b719e72 100644 --- a/src/plugins/e-acsl/src/analyses/analyses_datatype.mli +++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli @@ -24,4 +24,6 @@ open Analyses_types +module Annotation_kind: Datatype.S with type t = annotation_kind + module PredOrTerm: Datatype.S_with_collections with type t = pred_or_term diff --git a/src/plugins/e-acsl/src/analyses/analyses_types.mli b/src/plugins/e-acsl/src/analyses/analyses_types.mli index d670f9d0e2052217223c588532bda38eb7f278e4..e2aafb100a6489a88157b845531077040462dc07 100644 --- a/src/plugins/e-acsl/src/analyses/analyses_types.mli +++ b/src/plugins/e-acsl/src/analyses/analyses_types.mli @@ -35,3 +35,11 @@ type lscope = lscope_var list type pred_or_term = | PoT_pred of predicate | PoT_term of term + +type annotation_kind = + | Assertion + | Precondition + | Postcondition + | Invariant + | Variant + | RTE diff --git a/src/plugins/e-acsl/src/code_generator/assert.ml b/src/plugins/e-acsl/src/code_generator/assert.ml index f2528e9c6dfabee5d8a98719a5063c08ee2abc38..578413dccb4b506917fbb5c0c8a30a30a5f1ec05 100644 --- a/src/plugins/e-acsl/src/code_generator/assert.ml +++ b/src/plugins/e-acsl/src/code_generator/assert.ml @@ -24,6 +24,8 @@ general functions to create assertion statements. *) open Cil_types +open Analyses_types +open Analyses_datatype (** Type holding information about the C variable representing the assertion data. *) @@ -186,7 +188,7 @@ let register_term ~loc env ?force t e adata = register ~loc env name ?force e adata let register_pred ~loc env ?force p e adata = - if Env.annotation_kind env == Smart_stmt.RTE then + if Env.annotation_kind env == RTE then (* When translating RTE, we do not want to print the result of the predicate because they should be the only predicate in an assertion clause. *) adata, env @@ -197,13 +199,7 @@ let register_pred ~loc env ?force p e adata = let kind_to_string loc k = Cil.mkString ~loc - (match k with - | Smart_stmt.Assertion -> "Assertion" - | Smart_stmt.Precondition -> "Precondition" - | Smart_stmt.Postcondition -> "Postcondition" - | Smart_stmt.Invariant -> "Invariant" - | Smart_stmt.Variant -> "Variant" - | Smart_stmt.RTE -> "RTE") + (Format.asprintf "%a" Annotation_kind.pretty k) let runtime_check_with_msg ~adata ~loc ?(name="") msg ~pred_kind kind kf env predicate_e = let env = Env.push env in diff --git a/src/plugins/e-acsl/src/code_generator/assert.mli b/src/plugins/e-acsl/src/code_generator/assert.mli index 30ae0b268d0f09f5e14dbea4654f98576a5fdbe5..787c5854c02ebf09fca172df256686d3224c0e93 100644 --- a/src/plugins/e-acsl/src/code_generator/assert.mli +++ b/src/plugins/e-acsl/src/code_generator/assert.mli @@ -24,6 +24,7 @@ general functions to create assertion statements. *) open Cil_types +open Analyses_types type t (** Type to hold the data contributing to an assertion. *) @@ -99,7 +100,7 @@ val register_pred: val runtime_check: adata:t -> pred_kind:predicate_kind -> - Smart_stmt.annotation_kind -> + annotation_kind -> kernel_function -> Env.t -> exp -> @@ -121,7 +122,7 @@ val runtime_check_with_msg: ?name:string -> string -> pred_kind:predicate_kind -> - Smart_stmt.annotation_kind -> + annotation_kind -> kernel_function -> Env.t -> exp -> diff --git a/src/plugins/e-acsl/src/code_generator/contract.ml b/src/plugins/e-acsl/src/code_generator/contract.ml index 69d7b48a5e6034bc13368eb23ce15ea6384c1a8c..879ee0ceadfc5a822ca7515f0b529720b7ff8d18 100644 --- a/src/plugins/e-acsl/src/code_generator/contract.ml +++ b/src/plugins/e-acsl/src/code_generator/contract.ml @@ -374,7 +374,7 @@ let check_other_requires kf env contract = Assert.runtime_check ~adata ~pred_kind - Smart_stmt.Precondition + Precondition kf env requires_e @@ -697,7 +697,7 @@ let check_post_conds kf env contract = Assert.runtime_check ~adata ~pred_kind - Smart_stmt.Postcondition + Postcondition kf env post_cond_e @@ -754,7 +754,7 @@ let check_post_conds kf env contract = contract.spec.spec_behavior let translate_preconditions kf env contract = - let env = Env.set_annotation_kind env Smart_stmt.Precondition in + let env = Env.set_annotation_kind env Precondition in let env = Env.push_contract env contract in let env = init kf env contract in (* Start with translating the requires predicate of the default behavior. *) @@ -775,7 +775,7 @@ let translate_preconditions kf env contract = Env.handle_error do_it env let translate_postconditions kf env = - let env = Env.set_annotation_kind env Smart_stmt.Postcondition in + let env = Env.set_annotation_kind env Postcondition in let contract, env = Env.pop_and_get_contract env in let do_it env = let env = check_post_conds kf env contract in diff --git a/src/plugins/e-acsl/src/code_generator/env.ml b/src/plugins/e-acsl/src/code_generator/env.ml index a090072fb28e3b72c263c20a6e231490bb921049..95a7715b97a71943b225cb0cbffc4c558786b3ba 100644 --- a/src/plugins/e-acsl/src/code_generator/env.ml +++ b/src/plugins/e-acsl/src/code_generator/env.ml @@ -23,6 +23,7 @@ module E_acsl_label = Label open Cil_types open Cil_datatype +open Analyses_types open Contract_types module Error = Translation_error @@ -63,7 +64,7 @@ type loop_env = { type t = { lscope: Lscope.t; lscope_reset: bool; - annotation_kind: Smart_stmt.annotation_kind; + annotation_kind: annotation_kind; new_global_vars: (varinfo * localized_scope) list; (* generated variables. The scope indicates the level where the variable should be added. *) @@ -104,7 +105,7 @@ let empty_loop_env = let empty = { lscope = Lscope.empty; lscope_reset = true; - annotation_kind = Smart_stmt.Assertion; + annotation_kind = Assertion; new_global_vars = []; global_mp_tbl = empty_mp_tbl; env_stack = []; diff --git a/src/plugins/e-acsl/src/code_generator/env.mli b/src/plugins/e-acsl/src/code_generator/env.mli index 29e34613a77f4c50e93b1c5b87dd77d7216e5bdf..13e604e25c74c171062fc9e1b5bd672651dd9d73 100644 --- a/src/plugins/e-acsl/src/code_generator/env.mli +++ b/src/plugins/e-acsl/src/code_generator/env.mli @@ -152,8 +152,8 @@ end (** {2 Current annotation kind} *) (* ************************************************************************** *) -val annotation_kind: t -> Smart_stmt.annotation_kind -val set_annotation_kind: t -> Smart_stmt.annotation_kind -> t +val annotation_kind: t -> annotation_kind +val set_annotation_kind: t -> annotation_kind -> t (* ************************************************************************** *) (** {2 Loop annotations} *) diff --git a/src/plugins/e-acsl/src/code_generator/libc.ml b/src/plugins/e-acsl/src/code_generator/libc.ml index 9214791359cf7aea33e40780c45623d6a4f7c4a4..2121d7141963e9c668069251db79a57dbd062707 100644 --- a/src/plugins/e-acsl/src/code_generator/libc.ml +++ b/src/plugins/e-acsl/src/code_generator/libc.ml @@ -229,7 +229,7 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = Assert.runtime_check ~adata ~pred_kind:Assert - Smart_stmt.RTE + RTE kf env lower_guard @@ -256,7 +256,7 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = Assert.runtime_check ~adata ~pred_kind:Assert - Smart_stmt.RTE + RTE kf env upper_guard diff --git a/src/plugins/e-acsl/src/code_generator/logic_array.ml b/src/plugins/e-acsl/src/code_generator/logic_array.ml index d9a75dce63582b6e62faef1a030c5c4b0bfbf77d..a156e946340427dfc179e1dc8d4b500aef6f8805 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_array.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_array.ml @@ -249,7 +249,7 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 = Assert.register ~loc env "current length" len_orig adata in let stmt, env = - Assert.runtime_check ~adata ~pred_kind:Assert Smart_stmt.RTE kf env e p + Assert.runtime_check ~adata ~pred_kind:Assert RTE kf env e p in stmt :: stmts, env in diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml index 0166604f9e73e238d5b69042cee73d2e2d39b218..44d5e8fdc770257ba1368a413631d1b127aafd78 100644 --- a/src/plugins/e-acsl/src/code_generator/loops.ml +++ b/src/plugins/e-acsl/src/code_generator/loops.ml @@ -64,7 +64,7 @@ let handle_annotations env kf stmt = (fun (stmts, env, _) -> match Env.top_loop_variant env with | Some (t, measure_opt) -> - let env = Env.set_annotation_kind env Smart_stmt.Variant in + let env = Env.set_annotation_kind env Variant in let env = Env.push env in (* There cannot be bound logical variables since we cannot write loops inside logic functions or predicates, hence lenv is []*) @@ -98,7 +98,7 @@ let handle_annotations env kf stmt = let rec aux (stmts, env) = function | [] -> begin (* No statements remaining in the loop: variant check *) - let env = Env.set_annotation_kind env Smart_stmt.Variant in + let env = Env.set_annotation_kind env Variant in let lenv = Env.Local_vars.get env in match variant with | Some (t, e_old, Some measure) -> @@ -153,7 +153,7 @@ let handle_annotations env kf stmt = ~loc msg ~pred_kind:Assert - Smart_stmt.Variant + Variant kf env e_tapp @@ -194,7 +194,7 @@ let handle_annotations env kf stmt = ~loc msg1 ~pred_kind:Assert - Smart_stmt.Variant + Variant kf env variant_pos_e @@ -236,7 +236,7 @@ let handle_annotations env kf stmt = ~loc msg2 ~pred_kind:Assert - Smart_stmt.Variant + Variant kf env variant_dec_e @@ -258,7 +258,7 @@ let handle_annotations env kf stmt = (* Last statement of the loop: invariant check *) (* Optimisation to only verify invariant on a non-empty body loop. *) let invariants = Env.top_loop_invariants env in - let env = Env.set_annotation_kind env Smart_stmt.Invariant in + let env = Env.set_annotation_kind env Invariant in let env = Env.push env in let env = let translate_named_predicate = !translate_predicate_ref in @@ -392,7 +392,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = Assert.runtime_check ~adata ~pred_kind:Assert - Smart_stmt.RTE + RTE kf env e diff --git a/src/plugins/e-acsl/src/code_generator/smart_stmt.ml b/src/plugins/e-acsl/src/code_generator/smart_stmt.ml index 6bcc645ed33146fae568d5f28a990776299f511a..e76366fa4ce2ca8d087bd63fb7b84d4b05fa98cb 100644 --- a/src/plugins/e-acsl/src/code_generator/smart_stmt.ml +++ b/src/plugins/e-acsl/src/code_generator/smart_stmt.ml @@ -210,14 +210,6 @@ let mark_readonly vi = let loc = vi.vdecl in rtl_call ~loc "mark_readonly" [ Cil.evar ~loc vi ] -type annotation_kind = - | Assertion - | Precondition - | Postcondition - | Invariant - | Variant - | RTE - (* Local Variables: compile-command: "make -C ../../../../.." diff --git a/src/plugins/e-acsl/src/code_generator/smart_stmt.mli b/src/plugins/e-acsl/src/code_generator/smart_stmt.mli index 165e815258911e1370a11a8796656f7a13749fe5..887cf852e0adfe9266f87387e661b7f0d693e917 100644 --- a/src/plugins/e-acsl/src/code_generator/smart_stmt.mli +++ b/src/plugins/e-acsl/src/code_generator/smart_stmt.mli @@ -109,14 +109,6 @@ val mark_readonly: varinfo -> stmt (** Same as [store_stmt] for [__e_acsl_markreadonly] that observes the read-onlyness of the given varinfo. *) -type annotation_kind = - | Assertion - | Precondition - | Postcondition - | Invariant - | Variant - | RTE - (* Local Variables: compile-command: "make -C ../../../../.." diff --git a/src/plugins/e-acsl/src/code_generator/translate_annots.ml b/src/plugins/e-acsl/src/code_generator/translate_annots.ml index a1d1cfb14b6e6fdd0a37f9550faf6ce526faa0b7..bc00c99360a6a95884679508a1908f1fb4da7ccd 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_annots.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_annots.ml @@ -70,7 +70,7 @@ let pre_code_annotation kf stmt env annot = | AAssert(l, p) -> if Translate_utils.must_translate (Property.ip_of_code_annot_single kf stmt annot) then - let env = Env.set_annotation_kind env Smart_stmt.Assertion in + let env = Env.set_annotation_kind env Assertion in if l <> [] then Env.not_yet env "@[assertion applied only on some behaviors@]"; Env.with_params @@ -93,7 +93,7 @@ let pre_code_annotation kf stmt env annot = | AInvariant(l, loop_invariant, p) -> if Translate_utils.must_translate (Property.ip_of_code_annot_single kf stmt annot) then - let env = Env.set_annotation_kind env Smart_stmt.Invariant in + let env = Env.set_annotation_kind env Invariant in if l <> [] then Env.not_yet env "@[invariant applied only on some behaviors@]"; let env = diff --git a/src/plugins/e-acsl/src/code_generator/translate_rtes.ml b/src/plugins/e-acsl/src/code_generator/translate_rtes.ml index cb05e6165e836d1d4af09838076e50a3e24df24c..8e76febe0cc5a5403e3088fff370b91a1504f631 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_rtes.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_rtes.ml @@ -27,7 +27,7 @@ let dkey = Options.Dkey.translation let rte_annots pp elt kf env l = let old_kind = Env.annotation_kind env in - let env = Env.set_annotation_kind env Smart_stmt.RTE in + let env = Env.set_annotation_kind env RTE in let env = List.fold_left (fun env a -> match a.annot_content with diff --git a/src/plugins/e-acsl/src/code_generator/translate_terms.ml b/src/plugins/e-acsl/src/code_generator/translate_terms.ml index a1e55e5d0eb17749669e4a9642917b3f3e50c198..c569adf41cdebbafa46c15fa9895132f410f3b71 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_terms.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_terms.ml @@ -525,7 +525,7 @@ and context_insensitive_term_to_exp ~adata kf env t = Assert.runtime_check ~adata:adata2 ~pred_kind:Assert - Smart_stmt.RTE + RTE kf env coerce_guard @@ -605,7 +605,7 @@ and context_insensitive_term_to_exp ~adata kf env t = Assert.runtime_check ~adata:adata1 ~pred_kind:Assert - Smart_stmt.RTE + RTE kf env e1_guard diff --git a/src/plugins/e-acsl/src/code_generator/translate_utils.ml b/src/plugins/e-acsl/src/code_generator/translate_utils.ml index 89fe539c7f5edc1fc697376d49c057f9becc6d76..9a26a8cc21a5c9af89ae93402de0a7a810850b01 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_utils.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_utils.ml @@ -100,7 +100,7 @@ let gmp_to_sizet ~adata ~loc ~name ?(check_lower_bound=true) ?pp kf env t = Assert.runtime_check ~adata:adata_lower_guard ~pred_kind:Assert - Smart_stmt.RTE + RTE kf env lower_guard @@ -130,7 +130,7 @@ let gmp_to_sizet ~adata ~loc ~name ?(check_lower_bound=true) ?pp kf env t = Assert.runtime_check ~adata:adata_upper_guard ~pred_kind:Assert - Smart_stmt.RTE + RTE kf env upper_guard