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 (* TODO : change naming...? *) 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 -> (* assert *) false (*TODO : reorg *)
        | 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