From 1c7649c398fd08293d4ca7f4328cc30dce0e97e1 Mon Sep 17 00:00:00 2001 From: Jan Rochel <jan.rochel@cea.fr> Date: Tue, 26 Sep 2023 13:24:26 +0200 Subject: [PATCH] [e-acsl] move Typed_number.strnum to Analyses_types --- .../src/code_generator/logic_functions.ml | 2 +- .../code_generator/translate_predicates.ml | 2 +- .../src/code_generator/translate_terms.ml | 96 +++++++++---------- .../e-acsl/src/code_generator/typed_number.ml | 6 +- .../src/code_generator/typed_number.mli | 10 +- .../e-acsl/src/libraries/analyses_types.ml | 8 ++ 6 files changed, 60 insertions(+), 64 deletions(-) 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 9dcb920b211..71c2b7bef62 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_functions.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_functions.ml @@ -488,7 +488,7 @@ let app_to_exp ~adata ~loc ?tapp kf env ?eargs li targs = env kf (Some ty) - Typed_number.C_number + Analyses_types.C_number (Some targ) earg with Typing.Not_a_number -> diff --git a/src/plugins/e-acsl/src/code_generator/translate_predicates.ml b/src/plugins/e-acsl/src/code_generator/translate_predicates.ml index 39286fcdf9e..45c63bdac6a 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_predicates.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_predicates.ml @@ -335,7 +335,7 @@ and to_exp ~adata ?inplace ?name kf ?rte env p = env kf None - Typed_number.C_number + Analyses_types.C_number None e) ) 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 ab384697b41..e457b6cef17 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_terms.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_terms.ml @@ -48,7 +48,7 @@ let translate_rte_exp_ref let constant_to_exp ~loc env t c = let mk_real s = let s = Gmp.Q.normalize_str s in - Cil.mkString ~loc s, Typed_number.Str_R + Cil.mkString ~loc s, Analyses_types.Str_R in match c with | Integer(n, _repr) -> @@ -58,7 +58,7 @@ let constant_to_exp ~loc env t c = | Nan -> assert false | Real -> Error.not_yet "real number constant" | Rational -> mk_real (Integer.to_string n) - | Gmpz -> Cil.mkString ~loc (Integer.to_string n), Typed_number.Str_Z + | Gmpz -> Cil.mkString ~loc (Integer.to_string n), Analyses_types.Str_Z (* too large integer *) | C_float fkind -> Cil.kfloat ~loc fkind (Int64.to_float (Integer.to_int64_exn n)), C_number @@ -67,7 +67,7 @@ let constant_to_exp ~loc env t c = match cast, kind with | Some ty, (ILongLong | IULongLong) when Gmp_types.Z.is_t ty -> (* too large integer *) - Cil.mkString ~loc (Integer.to_string n), Typed_number.Str_Z + Cil.mkString ~loc (Integer.to_string n), Analyses_types.Str_Z | Some ty, _ when Gmp_types.Q.is_t ty -> mk_real (Integer.to_string n) | (None | Some _), _ -> @@ -77,15 +77,15 @@ let constant_to_exp ~loc env t c = long] addition and so [1LL]. If we keep the initial string representation, the kind would be ignored in the generated code and so [1] would be generated. *) - Cil.kinteger64 ~loc ~kind n, Typed_number.C_number) - | LStr s -> Cil.new_exp ~loc (Const (CStr s)), Typed_number.C_number - | LWStr s -> Cil.new_exp ~loc (Const (CWStr s)), Typed_number.C_number - | LChr c -> Cil.new_exp ~loc (Const (CChr c)), Typed_number.C_number + Cil.kinteger64 ~loc ~kind n, Analyses_types.C_number) + | LStr s -> Cil.new_exp ~loc (Const (CStr s)), Analyses_types.C_number + | LWStr s -> Cil.new_exp ~loc (Const (CWStr s)), Analyses_types.C_number + | LChr c -> Cil.new_exp ~loc (Const (CChr c)), Analyses_types.C_number | LReal lr -> if lr.r_lower = lr.r_upper - then Cil.kfloat ~loc FDouble lr.r_nearest, Typed_number.C_number + then Cil.kfloat ~loc FDouble lr.r_nearest, Analyses_types.C_number else mk_real lr.r_literal - | LEnum e -> Cil.new_exp ~loc (Const (CEnum e)), Typed_number.C_number + | LEnum e -> Cil.new_exp ~loc (Const (CEnum e)), Analyses_types.C_number (* Create and initialize a variable in the [env] according to [ty], [name] and [exp_init], return a tuple [varinfo * exp] and the [env] extended with the @@ -255,7 +255,7 @@ and extended_quantifier_to_exp ~adata ~loc kf env t t_min t_max lambda name = Env.Logic_binding.remove env k; let env = Env.add_stmt env (Smart_stmt.block_stmt final_stmt) in let adata = Assert.register_term ~loc t acc_as_exp adata in - acc_as_exp, adata, env, Typed_number.C_number, "" + acc_as_exp, adata, env, Analyses_types.C_number, "" | _ -> assert false @@ -270,29 +270,29 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let lv, env, name = tlval_to_lval kf env lv in let e = Smart_exp.lval ~loc lv in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, name + e, adata, env, Analyses_types.C_number, name | TSizeOf ty -> let e = Cil.sizeOf ~loc ty in let adata = Assert.register_term ~loc ~force:true t e adata in - e, adata, env, Typed_number.C_number, "sizeof" + e, adata, env, Analyses_types.C_number, "sizeof" | TSizeOfE t' -> let e', _, env = to_exp ~adata:Assert.no_data kf env t' in let e = Cil.sizeOf ~loc (Cil.typeOf e') in let adata = Assert.register_term ~loc ~force:true t e adata in - e, adata, env, Typed_number.C_number, "sizeof" + e, adata, env, Analyses_types.C_number, "sizeof" | TSizeOfStr s -> let e = Cil.new_exp ~loc (SizeOfStr s) in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, "sizeofstr" + e, adata, env, Analyses_types.C_number, "sizeofstr" | TAlignOf ty -> let e = Cil.new_exp ~loc (AlignOf ty) in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, "alignof" + e, adata, env, Analyses_types.C_number, "alignof" | TAlignOfE t' -> let e', _, env = to_exp ~adata:Assert.no_data kf env t' in let e = Cil.new_exp ~loc (AlignOfE e') in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, "alignof" + e, adata, env, Analyses_types.C_number, "alignof" | TUnOp(Neg | BNot as op, t') -> let ty = Typing.get_typ ~logic_env t in let e, adata, env = to_exp ~adata kf env t' in @@ -311,11 +311,11 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = (Some t) (fun _ ev -> [ Smart_stmt.rtl_call ~loc ~prefix:"" name [ ev; e ] ]) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else if Gmp_types.Q.is_t ty then Env.not_yet env "reals: Neg | BNot" else - Cil.new_exp ~loc (UnOp(op, e, ty)), adata, env, Typed_number.C_number, "" + Cil.new_exp ~loc (UnOp(op, e, ty)), adata, env, Analyses_types.C_number, "" | TUnOp(LNot, t) -> let t = Logic_normalizer.get_term t in let ty = Typing.get_effective_typ ~logic_env t in @@ -337,12 +337,12 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = zero (Some t) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else begin assert (Cil.isIntegralType ty); let e, adata, env = to_exp ~adata kf env t in let e = Smart_exp.lnot ~loc e in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" end | TBinOp(PlusA | MinusA | Mult as bop, t1, t2) -> let ty = Typing.get_typ ~logic_env t in @@ -350,14 +350,14 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let e2, adata, env = to_exp ~adata kf env t2 in if Gmp_types.Z.is_t ty then let e, env = Gmp.Z.binop ~loc (Some t) bop env kf e1 e2 in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else if Gmp_types.Q.is_t ty then let e, env = Gmp.Q.binop ~loc (Some t) bop env kf e1 e2 in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else begin assert (Logic_typing.is_integral_type t.term_type); let e = Cil.new_exp ~loc (BinOp(bop, e1, e2, ty)) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" end | TBinOp(Div | Mod as bop, t1, t2) -> let ty = Typing.get_typ ~logic_env t in @@ -416,17 +416,17 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = in let name = Misc.name_of_binop bop in let _, e, env = Gmp.Z.new_var ~loc ~name env kf t mk_stmts in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else if Gmp_types.Q.is_t ty then let e2, adata, env = t2_to_exp adata env in let e, env = Gmp.Q.binop ~loc (Some t) bop env kf e1 e2 in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else begin assert (Logic_typing.is_integral_type t.term_type); (* no guard required since RTEs are generated separately *) let e2, adata, env = t2_to_exp adata env in let e = Cil.new_exp ~loc (BinOp(bop, e1, e2, ty)) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" end | TBinOp(Lt | Gt | Le | Ge | Eq | Ne as bop, t1, t2) -> (* comparison operators *) @@ -449,7 +449,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = t2 (Some t) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | TBinOp((Shiftlt | Shiftrt) as bop, t1, t2) -> (* left/right shift *) let ty = Typing.get_typ ~logic_env t in @@ -625,13 +625,13 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = in let name = bop_name in let _, e, env = Gmp.Z.new_var ~loc ~name env kf t mk_stmts in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else begin assert (Logic_typing.is_integral_type t.term_type); let e1, adata, env = t1_to_exp adata env in let e2, adata, env = t2_to_exp adata env in let e = Cil.new_exp ~loc (BinOp(bop, e1, e2, ty)) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" end | TBinOp(LOr, t1, t2) -> (* t1 || t2 <==> if t1 then true else t2 *) @@ -653,7 +653,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = ) env) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | TBinOp(LAnd, t1, t2) -> (* t1 && t2 <==> if t1 then t2 else false *) let e, adata, env = @@ -674,7 +674,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = ) env) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | TBinOp((BOr | BXor | BAnd) as bop, t1, t2) -> (* other logic/arith operators *) let ty = Typing.get_typ ~logic_env t in @@ -689,11 +689,11 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let name = Misc.name_of_binop bop in let t = Some t in let _, e, env = Gmp.Z.new_var ~loc ~name env kf t mk_stmts in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" else begin assert (Logic_typing.is_integral_type t.term_type); let e = Cil.new_exp ~loc (BinOp(bop, e1, e2, ty)) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" end | TBinOp(PlusPI | MinusPI as bop, t1, t2) -> if Misc.is_set_of_ptr_or_array t1.term_type || @@ -710,7 +710,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let e1, adata, env = to_exp ~adata kf env t1 in let e2, adata, env = to_exp ~adata kf env t2 in let e = Cil.new_exp ~loc (BinOp(bop, e1, e2, ty)) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | TBinOp(MinusPP, t1, t2) -> begin match Typing.get_number_ty ~logic_env t with | C_integer _ -> @@ -718,7 +718,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let e2, adata, env = to_exp ~adata kf env t2 in let ty = Typing.get_typ ~logic_env t in let e = Cil.new_exp ~loc (BinOp(MinusPP, e1, e2, ty)) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | Gmpz -> Env.not_yet env "pointer subtraction resulting in gmp" | C_float _ | Rational | Real | Nan -> @@ -733,22 +733,22 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = env kf (Some ty) - Typed_number.C_number + Analyses_types.C_number (Some t) e in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | TLogic_coerce (_, t) -> context_insensitive_term_to_exp ~adata kf env t | TAddrOf lv -> let lv, env, _ = tlval_to_lval kf env lv in let e = Cil.mkAddrOf ~loc lv in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, "addrof" + e, adata, env, Analyses_types.C_number, "addrof" | TStartOf lv -> let lv, env, _ = tlval_to_lval kf env lv in let e = Cil.mkAddrOrStartOf ~loc lv in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, "startof" + e, adata, env, Analyses_types.C_number, "startof" | Tapp(li, _, [ t1; t2; {term_node = Tlambda([ _ ], _)} as lambda ]) when li.l_body = LBnone && (li.l_var_info.lv_name = "\\sum" || li.l_var_info.lv_name = "\\product")-> @@ -761,12 +761,12 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let e, adata, env = Logic_functions.app_to_exp ~adata ~loc ~tapp:t kf env li args in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, "app" + e, adata, env, Analyses_types.C_number, "app" | Tapp(_, _ :: _, _) -> Env.not_yet env "logic functions with labels" | Tlambda(_, lt) -> let exp, adata, env = to_exp ~adata kf env lt in - exp, adata, env, Typed_number.C_number, "" + exp, adata, env, Analyses_types.C_number, "" | TDataCons _ -> Env.not_yet env "constructor" | Tif(t1, t2, t3) -> let e, adata, env = @@ -795,7 +795,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = ) env) in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | Tat(t', label) -> let e, adata, env = if inplace then @@ -803,7 +803,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = else Translate_ats.to_exp ~loc ~adata kf env (PoT_term t) label in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" | Tbase_addr(BuiltinLabel Here, t') -> let name = "base_addr" in let e, _, env = @@ -817,7 +817,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = t' in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, name + e, adata, env, Analyses_types.C_number, name | Tbase_addr _ -> Env.not_yet env "labeled \\base_addr" | Toffset(BuiltinLabel Here, t') -> let size_t = Cil.theMachine.Cil.typeOfSizeOf in @@ -826,7 +826,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = Memory_translate.call ~adata ~loc kf name size_t env t' in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, name + e, adata, env, Analyses_types.C_number, name | Toffset _ -> Env.not_yet env "labeled \\offset" | Tblock_length(BuiltinLabel Here, t') -> let size_t = Cil.theMachine.Cil.typeOfSizeOf in @@ -835,11 +835,11 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = Memory_translate.call ~adata ~loc kf name size_t env t' in let adata = Assert.register_term ~loc t e adata in - e, adata, env, Typed_number.C_number, name + e, adata, env, Analyses_types.C_number, name | Tblock_length _ -> Env.not_yet env "labeled \\block_length" | Tnull -> let e = Smart_exp.null ~loc in - e, adata, env, Typed_number.C_number, "null" + e, adata, env, Analyses_types.C_number, "null" | TUpdate _ -> Env.not_yet env "functional update" | Ttypeof _ -> Env.not_yet env "typeof" | Ttype _ -> Env.not_yet env "C type" @@ -858,7 +858,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let e, adata, env = to_exp ~adata kf env t in (* Remove the logic var from the logic scope *) let env = Env.Logic_scope.remove env lvs in - e, adata, env, Typed_number.C_number, "" + e, adata, env, Analyses_types.C_number, "" (* Convert an ACSL term into a corresponding C expression (if any) in the given environment. Also extend this environment in order to include the generating diff --git a/src/plugins/e-acsl/src/code_generator/typed_number.ml b/src/plugins/e-acsl/src/code_generator/typed_number.ml index 81b9956f449..d9496e647c7 100644 --- a/src/plugins/e-acsl/src/code_generator/typed_number.ml +++ b/src/plugins/e-acsl/src/code_generator/typed_number.ml @@ -22,12 +22,8 @@ (** Manipulate the type of numbers. *) -type strnum = - | Str_Z (* integers *) - | Str_R (* reals *) - | C_number (* integers and floats included *) - let add_cast ~loc ?name env kf ctx strnum t_opt e = + let open Analyses_types in let e, env = match strnum with | Str_Z -> Gmp.Z.create ~loc ?name t_opt env kf e | Str_R -> Gmp.Q.create ~loc ?name t_opt env kf e diff --git a/src/plugins/e-acsl/src/code_generator/typed_number.mli b/src/plugins/e-acsl/src/code_generator/typed_number.mli index 5fedbcdfb8c..e91ebc76758 100644 --- a/src/plugins/e-acsl/src/code_generator/typed_number.mli +++ b/src/plugins/e-acsl/src/code_generator/typed_number.mli @@ -24,14 +24,6 @@ open Cil_types -(** Type of a string that represents a number. - Used when a string is required to encode a constant number because it is not - representable in any C type *) -type strnum = - | Str_Z (* integers *) - | Str_R (* reals *) - | C_number (* integers and floats included *) - (** [add_cast ~loc ?name env kf ctx sty t_opt e] convert number expression [e] in a way that it is compatible with the given typing context [ctx]. [sty] indicates if the expression is a string representing a number (integer @@ -43,7 +35,7 @@ val add_cast: Env.t -> kernel_function -> typ option -> - strnum -> + Analyses_types.strnum -> term option -> exp -> exp * Env.t diff --git a/src/plugins/e-acsl/src/libraries/analyses_types.ml b/src/plugins/e-acsl/src/libraries/analyses_types.ml index a5a1f12468a..fd52df4346b 100644 --- a/src/plugins/e-acsl/src/libraries/analyses_types.ml +++ b/src/plugins/e-acsl/src/libraries/analyses_types.ml @@ -92,3 +92,11 @@ type number_ty = | Rational | Real | Nan + +(** Type of a string that represents a number. + Used when a string is required to encode a constant number because it is not + representable in any C type *) +type strnum = + | Str_Z (* integers *) + | Str_R (* reals *) + | C_number (* integers and floats included *) -- GitLab