let addr_lvar ~create lv =
let logic_var = true in
try Hashtbl.find var_addr (logic_var, lv.lv_id)
with Not_found ->
let var_addr_name vname = "addr_"^vname in
let addr_name = var_addr_name lv.lv_name in
if not create then raise (No_addr)
else
let addr_type = Types.ltype_ptr lv.lv_type in
let addr_lv = Cil_const.make_logic_var addr_name addr_type in
let addr_fol_var =
Fol.mk_lvar_variable addr_lv (Types.mk_ltype addr_type) in
Wp_parameters.debug ~level:3 "[wp-fol] add addr lv %a for %a@."
pp_lv addr_lv pp_lv lv;
let glob_addr_added =
match lv.lv_origin with None -> false
| Some v -> if v.vglob then add_glob_var addr_lv else false
in
if glob_addr_added then
begin
let ax_name = Format.sprintf "base_id_%s" lv.lv_name in
add_axiom ax_name (Why_ops.base_id (Fol.Tvar addr_fol_var) lv.lv_id);
end;
Hashtbl.add var_addr (logic_var, lv.lv_id) addr_fol_var;
addr_fol_var