[sledge] Additional tracing

Reviewed By: jvillard

Differential Revision: D25756575

fbshipit-source-id: be732fecd
master
Josh Berdine 4 years ago committed by Facebook GitHub Bot
parent a18165c553
commit c065e6f384

@ -720,6 +720,10 @@ let exec_specs pre specs =
*) *)
let assume pre cnd = let assume pre cnd =
[%trace]
~call:(fun {pf} -> pf "%a" Formula.pp cnd)
~retn:(fun {pf} -> pf "%a" pp)
@@ fun () ->
let post = Sh.and_ cnd pre in let post = Sh.and_ cnd pre in
if Sh.is_unsat post then None else Some post if Sh.is_unsat post then None else Some post

@ -49,6 +49,8 @@ struct
Format.fprintf ppf "@[<2>%a@]" pp_num num Format.fprintf ppf "@[<2>%a@]" pp_num num
else Format.fprintf ppf "@[<2>(%a%a)@]" pp_num num pp_den den else Format.fprintf ppf "@[<2>(%a%a)@]" pp_num num pp_den den
let pp = ppx (fun _ -> None)
(** [one] is the empty product Πᵢ₌₁⁰ xᵢ^pᵢ *) (** [one] is the empty product Πᵢ₌₁⁰ xᵢ^pᵢ *)
let one = Prod.empty let one = Prod.empty
@ -317,6 +319,16 @@ struct
(** [solve_for_mono r c m p] solves [0 = r + (c×m) + p] as [m = q] (** [solve_for_mono r c m p] solves [0 = r + (c×m) + p] as [m = q]
([Some (m, q)]) such that [r + (c×m) + p = m - q] *) ([Some (m, q)]) such that [r + (c×m) + p = m - q] *)
let solve_for_mono rejected_poly coeff mono poly = let solve_for_mono rejected_poly coeff mono poly =
[%trace]
~call:(fun {pf} ->
pf "0 = %a + (%a×%a) + %a" pp rejected_poly Q.pp coeff Mono.pp
mono pp poly )
~retn:(fun {pf} s ->
pf "%a"
(Option.pp "%a" (fun fs (v, q) ->
Format.fprintf fs "%a ↦ %a" pp v pp q ))
s )
@@ fun () ->
if Mono.equal_one mono || exists_fv_in (Mono.fv mono) poly then None if Mono.equal_one mono || exists_fv_in (Mono.fv mono) poly then None
else else
Some Some

@ -177,6 +177,11 @@ end = struct
and ν are maximal where ks. ν is universally valid, xs ks and and ν are maximal where ks. ν is universally valid, xs ks and
ks fv(τ) = . *) ks fv(τ) = . *)
let partition_valid xs s = let partition_valid xs s =
[%trace]
~call:(fun {pf} -> pf "%a@ %a" Var.Set.pp_xs xs pp s)
~retn:(fun {pf} (t, ks, u) ->
pf "%a@ %a@ %a" pp t Var.Set.pp_xs ks pp u )
@@ fun () ->
(* Move equations e=f from s to t when ∃ks.e=f fails to be provably (* Move equations e=f from s to t when ∃ks.e=f fails to be provably
valid. When moving an equation, reduce ks by fv(e=f) to maintain ks valid. When moving an equation, reduce ks by fv(e=f) to maintain ks
fv(t) = . This reduction may cause equations in s to no longer be fv(t) = . This reduction may cause equations in s to no longer be
@ -258,6 +263,15 @@ let solve_poly ?f p q s =
(* α[o,l) = β ==> l = |β| ∧ α = (⟨n,c⟩[0,o) ^ β ^ ⟨n,c⟩[o+l,n-o-l)) where n (* α[o,l) = β ==> l = |β| ∧ α = (⟨n,c⟩[0,o) ^ β ^ ⟨n,c⟩[o+l,n-o-l)) where n
= |α| and c fresh *) = |α| and c fresh *)
let rec solve_extract ?f a o l b s = let rec solve_extract ?f a o l b s =
[%trace]
~call:(fun {pf} ->
pf "%a = %a@ %a%a" Trm.pp
(Trm.extract ~seq:a ~off:o ~len:l)
Trm.pp b Var.Set.pp_xs (snd3 s) Subst.pp (trd3 s) )
~retn:(fun {pf} -> function
| Some (_, xs, s) -> pf "%a%a" Var.Set.pp_xs xs Subst.pp s
| None -> pf "false" )
@@ fun () ->
let n = Trm.seq_size_exn a in let n = Trm.seq_size_exn a in
let c, s = fresh "c" s in let c, s = fresh "c" s in
let n_c = Trm.sized ~siz:n ~seq:c in let n_c = Trm.sized ~siz:n ~seq:c in
@ -275,6 +289,14 @@ let rec solve_extract ?f a o l b s =
(* α₀^…^αᵢ^αⱼ^…^αᵥ = β ==> |α₀^…^αᵥ| = |β| ∧ … ∧ αⱼ = β[n₀+…+nᵢ,nⱼ) ∧ … (* α₀^…^αᵢ^αⱼ^…^αᵥ = β ==> |α₀^…^αᵥ| = |β| ∧ … ∧ αⱼ = β[n₀+…+nᵢ,nⱼ) ∧ …
where n |α| and m = |β| *) where n |α| and m = |β| *)
and solve_concat ?f a0V b m s = and solve_concat ?f a0V b m s =
[%trace]
~call:(fun {pf} ->
pf "%a = %a@ %a%a" Trm.pp (Trm.concat a0V) Trm.pp b Var.Set.pp_xs
(snd3 s) Subst.pp (trd3 s) )
~retn:(fun {pf} -> function
| Some (_, xs, s) -> pf "%a%a" Var.Set.pp_xs xs Subst.pp s
| None -> pf "false" )
@@ fun () ->
Iter.fold_until (Array.to_iter a0V) (s, Trm.zero) Iter.fold_until (Array.to_iter a0V) (s, Trm.zero)
~f:(fun aJ (s, oI) -> ~f:(fun aJ (s, oI) ->
let nJ = Trm.seq_size_exn aJ in let nJ = Trm.seq_size_exn aJ in

@ -630,6 +630,7 @@ module Func = struct
let invariant func = let invariant func =
assert (func == func.entry.parent) ; assert (func == func.entry.parent) ;
let@ () = Invariant.invariant [%here] func [%sexp_of: t] in let@ () = Invariant.invariant [%here] func [%sexp_of: t] in
try
match Function.typ func.name with match Function.typ func.name with
| Pointer {elt= Function {return; _}; _} -> | Pointer {elt= Function {return; _}; _} ->
assert ( assert (
@ -642,6 +643,10 @@ module Func = struct
) ; ) ;
iter_term func ~f:(fun term -> Term.invariant ~parent:func term) iter_term func ~f:(fun term -> Term.invariant ~parent:func term)
| _ -> assert false | _ -> assert false
with exc ->
let bt = Printexc.get_raw_backtrace () in
[%Trace.info "%a" pp func] ;
Printexc.raise_with_backtrace exc bt
let find name functions = let find name functions =
Function.Map.find (Function.counterfeit name) functions Function.Map.find (Function.counterfeit name) functions

@ -290,7 +290,7 @@ let rec invariant q =
invariant sjn ) ) invariant sjn ) )
with exc -> with exc ->
let bt = Printexc.get_raw_backtrace () in let bt = Printexc.get_raw_backtrace () in
[%Trace.info "%a" pp q] ; [%Trace.info "%a" pp_raw q] ;
Printexc.raise_with_backtrace exc bt Printexc.raise_with_backtrace exc bt
(** Quantification and Vocabulary *) (** Quantification and Vocabulary *)
@ -446,9 +446,14 @@ let and_ctx ctx q =
invariant q] invariant q]
let star q1 q2 = let star q1 q2 =
[%Trace.call fun {pf} -> pf "(%a)@ (%a)" pp q1 pp q2] [%trace]
; ~call:(fun {pf} -> pf "(%a)@ (%a)" pp q1 pp q2)
( match (q1, q2) with ~retn:(fun {pf} q ->
pf "%a" pp q ;
invariant q ;
assert (Var.Set.equal q.us (Var.Set.union q1.us q2.us)) )
@@ fun () ->
match (q1, q2) with
| {djns= [[]]; _}, _ | _, {djns= [[]]; _} -> | {djns= [[]]; _}, _ | _, {djns= [[]]; _} ->
false_ (Var.Set.union q1.us q2.us) false_ (Var.Set.union q1.us q2.us)
| {us= _; xs= _; ctx; pure; heap= []; djns= []}, _ | {us= _; xs= _; ctx; pure; heap= []; djns= []}, _
@ -479,12 +484,7 @@ let star q1 q2 =
; ctx ; ctx
; pure ; pure
; heap= List.append h1 h2 ; heap= List.append h1 h2
; djns= List.append d1 d2 } ) ; djns= List.append d1 d2 }
|>
[%Trace.retn fun {pf} q ->
pf "%a" pp q ;
invariant q ;
assert (Var.Set.equal q.us (Var.Set.union q1.us q2.us))]
let starN = function let starN = function
| [] -> emp | [] -> emp
@ -725,6 +725,10 @@ let pp_vss fs vss =
vss vss
let remove_absent_xs ks q = let remove_absent_xs ks q =
[%trace]
~call:(fun {pf} -> pf "%a%a" Var.Set.pp_xs ks pp q)
~retn:(fun {pf} -> pf "%a" pp)
@@ fun () ->
let ks = Var.Set.inter ks q.xs in let ks = Var.Set.inter ks q.xs in
if Var.Set.is_empty ks then q if Var.Set.is_empty ks then q
else else

Loading…
Cancel
Save