diff --git a/src/backends/C/c_backend_common.ml b/src/backends/C/c_backend_common.ml index 310bc7e31079f520feff8cd0b14cffb6675de5d3..f26b7eb1e0ccb32af497b88cea5948ae0a0f0287 100644 --- a/src/backends/C/c_backend_common.ml +++ b/src/backends/C/c_backend_common.ml @@ -61,6 +61,9 @@ let mk_mem_out = mk_local "mem_out" let mk_mem_in_c = mk_local "mem_in_c" let mk_mem_out_c = mk_local "mem_out_c" let mk_mem_reset = mk_local "mem_reset" +let mk_main_mem_ghost = mk_local "main_mem_ghost" +let mk_main_mem_ghost_c = mk_local "main_mem_ghost_c" +let mk_k = mk_local "k" (* Generation of a non-clashing name for the instance variable of static allocation macro *) diff --git a/src/backends/C/c_backend_common.mli b/src/backends/C/c_backend_common.mli index a9fc7f8e261f977e982106e2be7a50f1cd2e775f..7ebacfec68623b699bf0a237a7e85ec14b926b93 100644 --- a/src/backends/C/c_backend_common.mli +++ b/src/backends/C/c_backend_common.mli @@ -186,6 +186,9 @@ val mk_mem_out : machine_t -> ident val mk_mem_in_c : machine_t -> ident val mk_mem_out_c : machine_t -> ident val mk_mem_reset : machine_t -> ident +val mk_main_mem_ghost : machine_t -> ident +val mk_main_mem_ghost_c : machine_t -> ident +val mk_k : machine_t -> ident (* Generation of a non-clashing name for the attribute variable of static allocation macro *) diff --git a/src/backends/C/c_backend_main.ml b/src/backends/C/c_backend_main.ml index 88271a178619f9520f2cef78bce0f9422f4d937b..5228ef9416fbfd90a09a859cc4ab90d4f1982ba0 100644 --- a/src/backends/C/c_backend_main.ml +++ b/src/backends/C/c_backend_main.ml @@ -19,8 +19,13 @@ module Mpfr = Lustrec_mpfr module type MODIFIERS_MAINSRC = sig val pp_import_spec_prototype : formatter -> dep_t -> unit - val pp_declare_ghost_state : machine_t option -> formatter -> ident -> unit - val pp_ghost_state_parameter : formatter -> machine_t option -> unit + + val pp_declare_ghost_state : + machine_t -> machine_t option -> formatter -> ident -> unit + + val pp_ghost_state_parameter : + machine_t -> formatter -> machine_t option -> unit + val pp_main_spec : formatter -> unit val pp_main_loop_invariants : @@ -29,17 +34,17 @@ module type MODIFIERS_MAINSRC = sig val pp_main_loop_end : ident -> machine_t list -> formatter -> machine_t -> unit - val pp_reset_contract : formatter -> machine_t -> unit + val pp_reset_contract : machine_t -> formatter -> machine_t -> unit end module EmptyMod = struct let pp_import_spec_prototype _ _ = () - let pp_declare_ghost_state _ _ _ = () - let pp_ghost_state_parameter _ _ = () + let pp_declare_ghost_state _ _ _ _ = () + let pp_ghost_state_parameter _ _ _ = () let pp_main_spec _ = () let pp_main_loop_invariants _ _ _ _ = () let pp_main_loop_end _ _ _ _ = () - let pp_reset_contract _ _ = () + let pp_reset_contract _ _ _ = () end module Main (Mod : MODIFIERS_MAINSRC) = struct @@ -122,14 +127,14 @@ module Main (Mod : MODIFIERS_MAINSRC) = struct pp_machine_alloc_name mname) () - (Mod.pp_declare_ghost_state m_c) + (Mod.pp_declare_ghost_state m m_c) mname pp_machine_set_reset_name mname main_mem - Mod.pp_ghost_state_parameter + (Mod.pp_ghost_state_parameter m) None - (pp_print_option Mod.pp_reset_contract) + (pp_print_option (Mod.pp_reset_contract m)) m_c let pp_global_initialize fmt basename = @@ -302,7 +307,7 @@ module Main (Mod : MODIFIERS_MAINSRC) = struct (pp_outputs ~pp_eol:pp_print_comma) outputs self - Mod.pp_ghost_state_parameter + (Mod.pp_ghost_state_parameter m) m_c let pp_main_loop mname main_mem machines m_c fmt m = diff --git a/src/backends/C/c_backend_main.mli b/src/backends/C/c_backend_main.mli index 3fa1d45ab0508edd29a200e143a80c77a9f3b9f4..c8a7cbe44c0245c94c86222d12f8579e8eaeb622 100644 --- a/src/backends/C/c_backend_main.mli +++ b/src/backends/C/c_backend_main.mli @@ -5,8 +5,13 @@ open Machine_code_types module type MODIFIERS_MAINSRC = sig val pp_import_spec_prototype : formatter -> dep_t -> unit - val pp_declare_ghost_state : machine_t option -> formatter -> ident -> unit - val pp_ghost_state_parameter : formatter -> machine_t option -> unit + + val pp_declare_ghost_state : + machine_t -> machine_t option -> formatter -> ident -> unit + + val pp_ghost_state_parameter : + machine_t -> formatter -> machine_t option -> unit + val pp_main_spec : formatter -> unit val pp_main_loop_invariants : @@ -15,7 +20,7 @@ module type MODIFIERS_MAINSRC = sig val pp_main_loop_end : ident -> machine_t list -> formatter -> machine_t -> unit - val pp_reset_contract : formatter -> machine_t -> unit + val pp_reset_contract : machine_t -> formatter -> machine_t -> unit end module EmptyMod : MODIFIERS_MAINSRC diff --git a/src/backends/C/c_backend_spec.ml b/src/backends/C/c_backend_spec.ml index 70dc1070856f4de9ab3bae11b635b4fe16891ac3..28d7ef8c8db4881626dd79fb98a9c23cda6a8ae6 100644 --- a/src/backends/C/c_backend_spec.ml +++ b/src/backends/C/c_backend_spec.ml @@ -1605,10 +1605,10 @@ end module MainMod = struct let pp_import_spec_prototype = SrcMod.pp_import_spec_prototype - let main_mem_ghost = "main_mem_ghost" - let main_mem_ghost_c = "main_mem_ghost_c" + (* let main_mem_ghost = "main_mem_ghost" *) + (* let main_mem_ghost_c = "main_mem_ghost_c" *) - let pp_reset_contract fmt m_c = + let pp_reset_contract m fmt m_c = let stateless_c = fst (get_stateless_status m_c) in let name_c = m_c.mname.node_id in pp_print_only_if @@ -1625,11 +1625,11 @@ module MainMod = struct pp_machine_set_reset_name name_c pp_ref' - main_mem_ghost_c)))) + (mk_main_mem_ghost_c m))))) fmt () - let pp_declare_ghost_state m_c fmt name = + let pp_declare_ghost_state m m_c fmt name = fprintf fmt "%a%a@;" @@ -1640,7 +1640,7 @@ module MainMod = struct "%a(,%s);" (pp_machine_static_alloc_name ~ghost:true) name - main_mem_ghost))) + (mk_main_mem_ghost m)))) () (pp_print_option (fun fmt m_c -> let stateless_c = fst (get_stateless_status m_c) in @@ -1655,7 +1655,7 @@ module MainMod = struct (pp_acsl_line'_cut (pp_ghost (fun fmt -> fprintf fmt "%a;" (pp_machine_decl' ~ghost:true)))))) - (name_c, main_mem_ghost_c) + (name_c, mk_main_mem_ghost_c m) (pp_acsl (pp_ghost (pp_print_list @@ -1666,11 +1666,11 @@ module MainMod = struct m_c.mstep.step_outputs)) m_c - let pp_ghost_state_parameter fmt m_c = + let pp_ghost_state_parameter m fmt m_c = GhostProto.pp_ghost_parameters ~cut:false fmt - ((main_mem_ghost, pp_ref pp_print_string) + ((mk_main_mem_ghost m, pp_ref pp_print_string) :: (match m_c with | None -> @@ -1683,7 +1683,7 @@ module MainMod = struct m_c.mstep.step_outputs in if stateless_c then l - else (main_mem_ghost_c, pp_ref pp_print_string) :: l)) + else (mk_main_mem_ghost_c m, pp_ref pp_print_string) :: l)) let k_induction_of machines m = match contract_of machines m with @@ -1696,6 +1696,7 @@ module MainMod = struct let name = m.mname.node_id in let insts = instances machines m in let m_c_k = k_induction_of machines m in + let var_k = mk_k m in fprintf fmt "%a%a" @@ -1703,8 +1704,8 @@ module MainMod = struct fprintf fmt "%a@," - (pp_acsl_line (pp_ghost pp_print_string)) - "int __k = 0;")) + (pp_acsl_line (pp_ghost (fun fmt -> fprintf fmt "int %s = 0;"))) + var_k)) m_c_k (pp_acsl_cut (fun fmt () -> fprintf @@ -1714,13 +1715,13 @@ module MainMod = struct (name, main_mem) (pp_loop_invariant (pp_memory_pack_aux pp_print_string pp_print_string)) - (name, main_mem_ghost, main_mem) + (name, mk_main_mem_ghost m, main_mem) (pp_loop_invariant (pp_separated (pp_paren pp_print_string) pp_ref' (pp_ref pp_var_decl))) - (main_mem, main_mem_ghost, insts, m.mstep.step_outputs) + (main_mem, mk_main_mem_ghost m, insts, m.mstep.step_outputs) (pp_loop_invariant (pp_or (pp_valid_read pp_stdout) (pp_equal pp_stdout pp_null))) ((), ((), ())) @@ -1731,7 +1732,7 @@ module MainMod = struct fmt "@,%a@,%a" (pp_loop_invariant (pp_gequal pp_print_string pp_print_int)) - ("__k", 0) + (var_k, 0) (pp_loop_invariant (pp_and_l (fun fmt k' -> pp_paren @@ -1749,7 +1750,7 @@ module MainMod = struct pp_reset_set' fmt ( (name, mem), - (name_c, main_mem_ghost_c) ) + (name_c, mk_main_mem_ghost_c m) ) else pp_k_induction_case (k' < k) @@ -1762,9 +1763,9 @@ module MainMod = struct pp_open_hovbox fmt 0) (fun fmt _ -> pp_true_c_bool fmt ())) fmt - (k', mem, main_mem_ghost_c))) + (k', mem, mk_main_mem_ghost_c m))) fmt - (("__k", k'), main_mem_ghost)))) + ((var_k, k'), mk_main_mem_ghost m)))) (List.init (k + 1) Fun.id))) m_c_k)) () @@ -1777,8 +1778,8 @@ module MainMod = struct fprintf fmt "%a@,%a" - (pp_acsl_line (pp_ghost pp_print_string)) - "__k++;" + (pp_acsl_line (pp_ghost (fun fmt -> fprintf fmt "%s++;"))) + (mk_k m) (pp_acsl_line (pp_assert (pp_and_l (fun fmt v ->