|  |  | @ -20,8 +20,6 @@ type struct_init_mode = | 
			
		
	
		
		
			
				
					
					|  |  |  |   | No_init |  |  |  |   | No_init | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Fld_init |  |  |  |   | Fld_init | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | let cil_exp_compare (e1: Sil.exp) (e2: Sil.exp) = Pervasives.compare e1 e2 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let unSome = function |  |  |  | let unSome = function | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Some x -> x |  |  |  |   | Some x -> x | 
			
		
	
		
		
			
				
					
					|  |  |  |   | _ -> assert false |  |  |  |   | _ -> assert false | 
			
		
	
	
		
		
			
				
					|  |  | @ -107,10 +105,6 @@ let pp_footprint _pe f fp = | 
			
		
	
		
		
			
				
					
					|  |  |  |   if fp.foot_pi != [] || fp.foot_sigma != [] then |  |  |  |   if fp.foot_pi != [] || fp.foot_sigma != [] then | 
			
		
	
		
		
			
				
					
					|  |  |  |     F.fprintf f "@\n[footprint@\n  @[%a%a@]  ]" pp_pi () (pp_semicolon_seq pe (Sil.pp_hpred pe)) fp.foot_sigma |  |  |  |     F.fprintf f "@\n[footprint@\n  @[%a%a@]  ]" pp_pi () (pp_semicolon_seq pe (Sil.pp_hpred pe)) fp.foot_sigma | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | let pp_lseg_kind f = function |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Sil.Lseg_NE -> F.fprintf f "ne" |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Sil.Lseg_PE -> F.fprintf f "" |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let pp_texp_simple pe = match pe.pe_opt with |  |  |  | let pp_texp_simple pe = match pe.pe_opt with | 
			
		
	
		
		
			
				
					
					|  |  |  |   | PP_SIM_DEFAULT -> Sil.pp_texp pe |  |  |  |   | PP_SIM_DEFAULT -> Sil.pp_texp pe | 
			
		
	
		
		
			
				
					
					|  |  |  |   | PP_SIM_WITH_TYP -> Sil.pp_texp_full pe |  |  |  |   | PP_SIM_WITH_TYP -> Sil.pp_texp_full pe | 
			
		
	
	
		
		
			
				
					|  |  | @ -398,24 +392,6 @@ let prop_fpv prop = | 
			
		
	
		
		
			
				
					
					|  |  |  |   (sigma_fpv prop.foot_sigma) @ |  |  |  |   (sigma_fpv prop.foot_sigma) @ | 
			
		
	
		
		
			
				
					
					|  |  |  |   (sigma_fpv prop.sigma) |  |  |  |   (sigma_fpv prop.sigma) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | (** {1 Functions for computing free or bound non-program variables} *) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let pi_av_add fav pi = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   IList.iter (Sil.atom_av_add fav) pi |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let sigma_av_add fav sigma = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   IList.iter (Sil.hpred_av_add fav) sigma |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let prop_av_add fav prop = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   Sil.sub_av_add fav prop.sub; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   pi_av_add fav prop.pi; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   sigma_av_add fav prop.sigma; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   pi_av_add fav prop.foot_pi; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   sigma_av_add fav prop.foot_sigma |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let prop_av = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   Sil.fav_imperative_to_functional prop_av_add |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | (** {2 Functions for Subsitition} *) |  |  |  | (** {2 Functions for Subsitition} *) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | let pi_sub (subst: Sil.subst) pi = |  |  |  | let pi_sub (subst: Sil.subst) pi = | 
			
		
	
	
		
		
			
				
					|  |  | @ -1070,14 +1046,6 @@ let atom_negate = function | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Sil.Aeq (e1, e2) -> Sil.Aneq (e1, e2) |  |  |  |   | Sil.Aeq (e1, e2) -> Sil.Aneq (e1, e2) | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Sil.Aneq (e1, e2) -> Sil.Aeq (e1, e2) |  |  |  |   | Sil.Aneq (e1, e2) -> Sil.Aeq (e1, e2) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | let rec remove_duplicates_from_sorted special_equal = function |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | [] -> [] |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | [x] -> [x] |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | x:: y:: l -> |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (special_equal x y) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       then remove_duplicates_from_sorted special_equal (y:: l) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       else x:: (remove_duplicates_from_sorted special_equal (y:: l)) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let rec strexp_normalize sub se = |  |  |  | let rec strexp_normalize sub se = | 
			
		
	
		
		
			
				
					
					|  |  |  |   match se with |  |  |  |   match se with | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Sil.Eexp (e, inst) -> |  |  |  |   | Sil.Eexp (e, inst) -> | 
			
		
	
	
		
		
			
				
					|  |  | @ -1443,12 +1411,6 @@ let replace_pi pi eprop = | 
			
		
	
		
		
			
				
					
					|  |  |  | let replace_sigma sigma eprop = |  |  |  | let replace_sigma sigma eprop = | 
			
		
	
		
		
			
				
					
					|  |  |  |   { eprop with sigma = sigma } |  |  |  |   { eprop with sigma = sigma } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | exception No_Footprint |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let unSome_footprint = function |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | None -> raise No_Footprint |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Some fp -> fp |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let replace_sigma_footprint sigma (prop : 'a t) : exposed t = |  |  |  | let replace_sigma_footprint sigma (prop : 'a t) : exposed t = | 
			
		
	
		
		
			
				
					
					|  |  |  |   { prop with foot_sigma = sigma } |  |  |  |   { prop with foot_sigma = sigma } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -1472,11 +1434,6 @@ let prop_is_emp p = match p.sigma with | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | (** {2 Functions for changing and generating propositions} *) |  |  |  | (** {2 Functions for changing and generating propositions} *) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | (** Replace the sub part of [prop]. *) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let prop_replace_sub sub p = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   let nsub = sub_normalize sub in |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   { p with sub = nsub } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | (** Sil.Construct a disequality. *) |  |  |  | (** Sil.Construct a disequality. *) | 
			
		
	
		
		
			
				
					
					|  |  |  | let mk_neq e1 e2 = |  |  |  | let mk_neq e1 e2 = | 
			
		
	
		
		
			
				
					
					|  |  |  |   run_with_abs_val_eq_zero |  |  |  |   run_with_abs_val_eq_zero | 
			
		
	
	
		
		
			
				
					|  |  | @ -1493,10 +1450,6 @@ let mk_eq e1 e2 = | 
			
		
	
		
		
			
				
					
					|  |  |  |        let ne2 = exp_normalize Sil.sub_empty e2 in |  |  |  |        let ne2 = exp_normalize Sil.sub_empty e2 in | 
			
		
	
		
		
			
				
					
					|  |  |  |        atom_normalize Sil.sub_empty (Sil.Aeq (ne1, ne2))) |  |  |  |        atom_normalize Sil.sub_empty (Sil.Aeq (ne1, ne2))) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | let unstructured_type = function |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | Sil.Tstruct _ | Sil.Tarray _ -> false |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | _ -> true |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | (** Construct a points-to predicate for a single program variable. |  |  |  | (** Construct a points-to predicate for a single program variable. | 
			
		
	
		
		
			
				
					
					|  |  |  |     If [expand_structs] is true, initialize the fields of structs with fresh variables. *) |  |  |  |     If [expand_structs] is true, initialize the fields of structs with fresh variables. *) | 
			
		
	
		
		
			
				
					
					|  |  |  | let mk_ptsto_lvar tenv expand_structs inst ((pvar: Sil.pvar), texp, expo) : Sil.hpred = |  |  |  | let mk_ptsto_lvar tenv expand_structs inst ((pvar: Sil.pvar), texp, expo) : Sil.hpred = | 
			
		
	
	
		
		
			
				
					|  |  | @ -2226,11 +2179,6 @@ let prop_rename_array_indices prop = | 
			
		
	
		
		
			
				
					
					|  |  |  |     apply_reindexing subst prop |  |  |  |     apply_reindexing subst prop | 
			
		
	
		
		
			
				
					
					|  |  |  |   end |  |  |  |   end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | let rec pp_ren pe f = function |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | [] -> () |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | [(i, x)] -> F.fprintf f "%a->%a" (Ident.pp pe) i (Ident.pp pe) x |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   | (i, x):: ren -> F.fprintf f "%a->%a, %a" (Ident.pp pe) i (Ident.pp pe) x (pp_ren pe) ren |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let compute_renaming fav = |  |  |  | let compute_renaming fav = | 
			
		
	
		
		
			
				
					
					|  |  |  |   let ids = Sil.fav_to_list fav in |  |  |  |   let ids = Sil.fav_to_list fav in | 
			
		
	
		
		
			
				
					
					|  |  |  |   let ids_primed, ids_nonprimed = IList.partition Ident.is_primed ids in |  |  |  |   let ids_primed, ids_nonprimed = IList.partition Ident.is_primed ids in | 
			
		
	
	
		
		
			
				
					|  |  | @ -2406,11 +2354,6 @@ let prop_rename_primed_footprint_vars p = | 
			
		
	
		
		
			
				
					
					|  |  |  | let mem_idlist i l = |  |  |  | let mem_idlist i l = | 
			
		
	
		
		
			
				
					
					|  |  |  |   IList.exists (fun id -> Ident.equal i id) l |  |  |  |   IList.exists (fun id -> Ident.equal i id) l | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | let id_exp_compare (id1, e1) (id2, e2) = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   let n = Sil.exp_compare e1 e2 in |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   if n <> 0 then n |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   else Ident.compare id1 id2 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let expose (p : normal t) : exposed t = Obj.magic p |  |  |  | let expose (p : normal t) : exposed t = Obj.magic p | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | (** normalize a prop *) |  |  |  | (** normalize a prop *) | 
			
		
	
	
		
		
			
				
					|  |  | @ -2771,11 +2714,6 @@ let prop_case_split prop = | 
			
		
	
		
		
			
				
					
					|  |  |  |     (IList.fold_left prop_atom_and prop' pi):: props_acc in |  |  |  |     (IList.fold_left prop_atom_and prop' pi):: props_acc in | 
			
		
	
		
		
			
				
					
					|  |  |  |   IList.fold_left f [] pi_sigma_list |  |  |  |   IList.fold_left f [] pi_sigma_list | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | (** Raise an exception if the prop is not normalized *) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let check_prop_normalized prop = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   let sigma' = sigma_normalize_prop prop prop.sigma in |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   if sigma_equal prop.sigma sigma' == false then assert false |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | let prop_expand prop = |  |  |  | let prop_expand prop = | 
			
		
	
		
		
			
				
					
					|  |  |  |   (* |  |  |  |   (* | 
			
		
	
		
		
			
				
					
					|  |  |  |   let _ = check_prop_normalized prop in |  |  |  |   let _ = check_prop_normalized prop in | 
			
		
	
	
		
		
			
				
					|  |  | @ -2885,7 +2823,21 @@ end = struct | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   let pi_size pi = pi_weight * IList.length pi |  |  |  |   let pi_size pi = pi_weight * IList.length pi | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   (** Compute a size value for the prop, which indicates its | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       complexity *) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   let prop_size p = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     let size_current = sigma_size p.sigma in | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     let size_footprint = sigma_size p.foot_sigma in | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     max size_current size_footprint | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   (** Approximate the size of the longest chain by counting the max | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       number of |-> with the same type and whose lhs is primed or | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       footprint *) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   let prop_chain_size p = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     let fp_size = pi_size p.foot_pi + sigma_size p.foot_sigma in | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     pi_size p.pi + sigma_size p.sigma + fp_size | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | (* | 
			
		
	
		
		
			
				
					
					|  |  |  |   (** Approximate the size of the longest chain by counting the max |  |  |  |   (** Approximate the size of the longest chain by counting the max | 
			
		
	
		
		
			
				
					
					|  |  |  |       number of |-> with the same type and whose lhs is primed or |  |  |  |       number of |-> with the same type and whose lhs is primed or | 
			
		
	
		
		
			
				
					
					|  |  |  |       footprint *) |  |  |  |       footprint *) | 
			
		
	
	
		
		
			
				
					|  |  | @ -2908,20 +2860,7 @@ end = struct | 
			
		
	
		
		
			
				
					
					|  |  |  |     let size = ref 0 in |  |  |  |     let size = ref 0 in | 
			
		
	
		
		
			
				
					
					|  |  |  |     Sil.ExpMap.iter (fun t n -> size := max n !size) !tbl; |  |  |  |     Sil.ExpMap.iter (fun t n -> size := max n !size) !tbl; | 
			
		
	
		
		
			
				
					
					|  |  |  |     !size |  |  |  |     !size | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | *) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   (** Compute a size value for the prop, which indicates its |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       complexity *) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   let prop_size p = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     let size_current = sigma_size p.sigma in |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     let size_footprint = sigma_size p.foot_sigma in |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     max size_current size_footprint |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   (** Approximate the size of the longest chain by counting the max |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       number of |-> with the same type and whose lhs is primed or |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       footprint *) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   let prop_chain_size p = |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     let fp_size = pi_size p.foot_pi + sigma_size p.foot_sigma in |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     pi_size p.pi + sigma_size p.sigma + fp_size |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | end |  |  |  | end | 
			
		
	
		
		
			
				
					
					|  |  |  | (*** END of module Metrics ***) |  |  |  | (*** END of module Metrics ***) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -2976,3 +2915,57 @@ module CategorizePreconditions = struct | 
			
		
	
		
		
			
				
					
					|  |  |  |     | _:: _, [], [] -> |  |  |  |     | _:: _, [], [] -> | 
			
		
	
		
		
			
				
					
					|  |  |  |         DataConstraints |  |  |  |         DataConstraints | 
			
		
	
		
		
			
				
					
					|  |  |  | end |  |  |  | end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | (* | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let pp_lseg_kind f = function | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | Sil.Lseg_NE -> F.fprintf f "ne" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | Sil.Lseg_PE -> F.fprintf f "" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let pi_av_add fav pi = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   IList.iter (Sil.atom_av_add fav) pi | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let sigma_av_add fav sigma = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   IList.iter (Sil.hpred_av_add fav) sigma | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let prop_av_add fav prop = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   Sil.sub_av_add fav prop.sub; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   pi_av_add fav prop.pi; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   sigma_av_add fav prop.sigma; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   pi_av_add fav prop.foot_pi; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   sigma_av_add fav prop.foot_sigma | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let prop_av = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   Sil.fav_imperative_to_functional prop_av_add | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let rec remove_duplicates_from_sorted special_equal = function | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | [] -> [] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | [x] -> [x] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | x:: y:: l -> | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if (special_equal x y) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       then remove_duplicates_from_sorted special_equal (y:: l) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       else x:: (remove_duplicates_from_sorted special_equal (y:: l)) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | (** Replace the sub part of [prop]. *) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let prop_replace_sub sub p = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   let nsub = sub_normalize sub in | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   { p with sub = nsub } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let unstructured_type = function | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | Sil.Tstruct _ | Sil.Tarray _ -> false | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | _ -> true | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let rec pp_ren pe f = function | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | [] -> () | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | [(i, x)] -> F.fprintf f "%a->%a" (Ident.pp pe) i (Ident.pp pe) x | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   | (i, x):: ren -> F.fprintf f "%a->%a, %a" (Ident.pp pe) i (Ident.pp pe) x (pp_ren pe) ren | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let id_exp_compare (id1, e1) (id2, e2) = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   let n = Sil.exp_compare e1 e2 in | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if n <> 0 then n | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   else Ident.compare id1 id2 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | (** Raise an exception if the prop is not normalized *) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | let check_prop_normalized prop = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   let sigma' = sigma_normalize_prop prop prop.sigma in | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if sigma_equal prop.sigma sigma' == false then assert false | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | *) | 
			
		
	
	
		
		
			
				
					|  |  | 
 |