diff --git a/src/plugins/e-acsl/src/code_generator/gmp.ml b/src/plugins/e-acsl/src/code_generator/gmp.ml index efc72c375b0559a68b2db7706a817f0444aaf640..38608a2fddc9289e35c1a72413c5ddc0f3e8b591 100644 --- a/src/plugins/e-acsl/src/code_generator/gmp.ml +++ b/src/plugins/e-acsl/src/code_generator/gmp.ml @@ -106,40 +106,6 @@ let generic_affect ~loc fname lv ev e = end else Smart_stmt.assigns ~loc:e.eloc ~result:lv e -let init_set ~loc lv ev e = - let fname = - let ty = Cil.typeOf ev in - if Gmp_types.Z.is_t ty then - "__gmpz_init_set" - else if Gmp_types.Q.is_t ty then - Options.fatal "no __gmpq_init_set: init then set separately" - else - "" - in - try generic_affect ~loc fname lv ev e - with - | Longlong IULongLong -> - (match e.enode with - | Lval elv -> - assert (Gmp_types.Z.is_t (Cil.typeOf ev)); - let call = - Smart_stmt.rtl_call ~loc - ~prefix:"" - "__gmpz_import" - [ ev; - Cil.one ~loc; - Cil.one ~loc; - Cil.sizeOf ~loc (TInt(IULongLong, [])); - Cil.zero ~loc; - Cil.zero ~loc; - Cil.mkAddrOf ~loc elv ] - in - Smart_stmt.block_stmt (Cil.mkBlock [ init ~loc ev; call ]) - | _ -> - Error.not_yet "unsigned long long expression requiring GMP") - | Longlong ILongLong -> - Error.not_yet "long long requiring GMP" - let affect ~loc lv ev e = let fname = let ty = Cil.typeOf ev in @@ -151,6 +117,43 @@ let affect ~loc lv ev e = with Longlong _ -> Error.not_yet "quantification over long long and requiring GMP" +let init_set ~loc lv ev e = + let mpz_init_set fname = + try generic_affect ~loc fname lv ev e + with + | Longlong IULongLong -> + (match e.enode with + | Lval elv -> + assert (Gmp_types.Z.is_t (Cil.typeOf ev)); + let call = + Smart_stmt.rtl_call ~loc + ~prefix:"" + "__gmpz_import" + [ ev; + Cil.one ~loc; + Cil.one ~loc; + Cil.sizeOf ~loc (TInt(IULongLong, [])); + Cil.zero ~loc; + Cil.zero ~loc; + Cil.mkAddrOf ~loc elv ] + in + Smart_stmt.block_stmt (Cil.mkBlock [ init ~loc ev; call ]) + | _ -> + Error.not_yet "unsigned long long expression requiring GMP") + | Longlong ILongLong -> + Error.not_yet "long long requiring GMP" + in + let ty = Cil.typeOf ev in + if Gmp_types.Z.is_t ty then + mpz_init_set "__gmpz_init_set" + else if Gmp_types.Q.is_t ty then + Smart_stmt.block_stmt + (Cil.mkBlock + [ init ~loc ev ; + affect ~loc lv ev e ]) + else + mpz_init_set "" + (* Local Variables: compile-command: "make -C ../../../../.." 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 791fcf4ee83b89aa508ceffb48c13272cf13cb4f..861672fca4f8924e8b715a2947c25673ab164c1d 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_functions.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_functions.ml @@ -62,7 +62,7 @@ let result_as_extra_argument typ = | TInt _ | TVoid _ | TFloat _ | TFun _ | TNamed _ | TEnum _ | TBuiltin_va_list _ -> false in - Gmp_types.Z.is_t typ || Gmp_types.Q.is_t typ || is_composite typ + Gmp_types.is_t typ || is_composite typ (*****************************************************************************) (****************** Generation of function bodies ****************************) @@ -105,7 +105,7 @@ let pred_to_block ~loc kf env ret_vi p = generate_return_block ~loc env ret_vi e (* Generate the function's body for terms. *) -let term_to_block ~loc ~is_mpq kf env ret_ty ret_vi t = +let term_to_block ~loc kf env ret_ty ret_vi t = let e, _, env = !term_to_exp_ref ~adata:Assert.no_data kf env t in if Cil.isVoidType ret_ty then (* if the function's result is a GMP, it is the first parameter of the @@ -113,9 +113,7 @@ let term_to_block ~loc ~is_mpq kf env ret_ty ret_vi t = let set = let lv_star_ret = Cil.mkMem ~addr:(Cil.evar ~loc ret_vi) ~off:NoOffset in let star_ret = Smart_exp.lval ~loc lv_star_ret in - if is_mpq - then Rational.init_set ~loc lv_star_ret star_ret e - else Gmp.init_set ~loc lv_star_ret star_ret e + Gmp.init_set ~loc lv_star_ret star_ret e in let return_void = Cil.mkStmt ~valid_sid:true (Return (None, loc)) in let b, env = Env.pop_and_get env set ~global_clear:false Env.Middle in @@ -125,8 +123,8 @@ let term_to_block ~loc ~is_mpq kf env ret_ty ret_vi t = else generate_return_block ~loc env ret_vi e -let generate_body ~loc ~is_mpq kf env ret_ty ret_vi = function - | LBterm t -> term_to_block ~loc ~is_mpq kf env ret_ty ret_vi t +let generate_body ~loc kf env ret_ty ret_vi = function + | LBterm t -> term_to_block ~loc kf env ret_ty ret_vi t | LBpred p -> pred_to_block ~loc kf env ret_vi p | LBnone |LBreads _ | LBinductive _ -> assert false @@ -158,8 +156,7 @@ let generate_kf ~loc fname env ret_ty params_ty params_ival li = in (* build the varinfo storing the result *) let res_as_extra_arg = result_as_extra_argument ret_ty in - let is_mpz = Gmp_types.Z.is_t ret_ty in - let is_mpq = Gmp_types.Q.is_t ret_ty in + let is_gmp = Gmp_types.is_t ret_ty in let ret_vi, ret_ty, params_with_ret, params_ty_with_ret = let vname = "__retres" in if res_as_extra_arg then @@ -218,7 +215,7 @@ let generate_kf ~loc fname env ret_ty params_ty params_ival li = let assigned_var = Logic_const.new_identified_term (if res_as_extra_arg then - Assigns.get_assigned_var ~loc ~is_gmp:(is_mpz || is_mpq) ret_vi + Assigns.get_assigned_var ~loc ~is_gmp ret_vi else Logic_const.tresult fundec.svar.vtype) in @@ -240,7 +237,7 @@ let generate_kf ~loc fname env ret_ty params_ty params_ival li = kf (Writes [ assigned_var , From assigns_from]); end; - let b, env = generate_body ~loc ~is_mpq kf env ret_ty ret_vi li.l_body in + let b, env = generate_body ~loc kf env ret_ty ret_vi li.l_body in fundec.sbody <- b; (* add the generated variables in the necessary lists *) (* TODO: factorized the code below that add the generated vars with method diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml index 904f1c9fb591cb72f64869f322dd1d5f438134fd..102ac515432819a2f174fadaff5cb929c186b07a 100644 --- a/src/plugins/e-acsl/src/code_generator/loops.ml +++ b/src/plugins/e-acsl/src/code_generator/loops.ml @@ -412,11 +412,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = let ty = Typing.get_typ ~logic_env t in let vi_of_lv, exp_of_lv, env = Env.Logic_binding.add ~ty env kf lv in let e, _, env = term_to_exp kf env t in - let ty = Cil.typeOf e in - let init_set = - if Gmp_types.Q.is_t ty then Rational.init_set else Gmp.init_set - in - let let_stmt = init_set ~loc (Cil.var vi_of_lv) exp_of_lv e in + let let_stmt = Gmp.init_set ~loc (Cil.var vi_of_lv) exp_of_lv e in let stmts, env = mk_nested_loops ~loc mk_innermost_block kf env lscope_vars' in diff --git a/src/plugins/e-acsl/src/code_generator/rational.ml b/src/plugins/e-acsl/src/code_generator/rational.ml index 4e11ce0f4e4a79c512b78f656aec5700dd1cce3a..4f385a6ff5df6ed5010a860c2cda9c12f3e08730 100644 --- a/src/plugins/e-acsl/src/code_generator/rational.ml +++ b/src/plugins/e-acsl/src/code_generator/rational.ml @@ -22,13 +22,6 @@ open Cil_types -(* No init_set for GMPQ: init then set separately *) -let init_set ~loc lval vi_e e = - Smart_stmt.block_stmt - (Cil.mkBlock - [ Gmp.init ~loc vi_e ; - Gmp.affect ~loc lval vi_e e ]) - let create ~loc ?name e env kf t_opt = let ty = Cil.typeOf e in if Gmp_types.Q.is_t ty then diff --git a/src/plugins/e-acsl/src/code_generator/rational.mli b/src/plugins/e-acsl/src/code_generator/rational.mli index 84f197cab38f15517f4b84fb2dc11ed975dfab9d..72e4a5a2b555da0634d08adc0df440aeca31f995 100644 --- a/src/plugins/e-acsl/src/code_generator/rational.mli +++ b/src/plugins/e-acsl/src/code_generator/rational.mli @@ -33,11 +33,6 @@ val create: exp * Env.t (** Create a real *) -(* TODO: change the call convention *) -val init_set: loc:location -> lval -> exp -> exp -> stmt -(** [init_set lval lval_as_exp exp] sets [lval] to [exp] while guranteeing that - [lval] is properly initialized wrt the underlying real library. *) - val normalize_str: string -> string (** Normalize the string so that it fits the representation used by the underlying real library. For example, "0.1" is a real number in ACSL diff --git a/src/plugins/e-acsl/src/code_generator/translate_ats.ml b/src/plugins/e-acsl/src/code_generator/translate_ats.ml index cf14ab17aa83a48331f6ebf86548c3b230534d5f..654ff848a0f0518204f319e010983f731fda1728 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_ats.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_ats.ml @@ -282,10 +282,7 @@ let pretranslate_to_exp ~loc kf env pot = t_opt ty (fun var_vi var_e -> - let init_set = - if Gmp_types.Q.is_t ty then Rational.init_set else Gmp.init_set - in - [ init_set ~loc (Cil.var var_vi) var_e e ]) + [ Gmp.init_set ~loc (Cil.var var_vi) var_e e ]) in var_vi, env 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 5b6f157fc6c94f5b8c41fc08f5624e2c122cea64..665dd752c4410b6b117afb4504cd20b7581668f4 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_utils.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_utils.ml @@ -284,8 +284,7 @@ let env_of_li ~adata ~loc kf env li = let stmt = match Typing.get_number_ty ~logic_env t with | C_integer _ | C_float _ | Nan -> Smart_stmt.assigns ~loc ~result:(Cil.var vi) e - | Gmpz -> Gmp.init_set ~loc (Cil.var vi) vi_e e - | Rational -> Rational.init_set ~loc (Cil.var vi) vi_e e + | Gmpz | Rational -> Gmp.init_set ~loc (Cil.var vi) vi_e e | Real -> Error.not_yet "real number" in adata, Env.add_stmt env stmt