@ -21,9 +21,9 @@ let simplify q = if !simplify_states then Sh.simplify q else q
let init globals =
IArray . fold globals ~ init : Sh . emp ~ f : ( fun q -> function
| { Llair . Global . reg ; init = Some ( seq , siz ) } ->
let loc = Term . var ( Var . of_ reg reg ) in
let loc = Term . var ( Var _of_Llair . reg reg ) in
let len = Term . integer ( Z . of_int siz ) in
let seq = Term . of_ exp seq in
let seq = Term _of_Llair . exp seq in
Sh . star q ( Sh . seg { loc ; bas = loc ; len ; siz = len ; seq } )
| _ -> q )
@ -38,13 +38,14 @@ let is_false = Sh.is_false
let dnf = Sh . dnf
let exec_assume q b =
Exec . assume q ( Formula . of_ exp b ) | > Option . map ~ f : simplify
Exec . assume q ( Formula _of_Llair . exp b ) | > Option . map ~ f : simplify
let exec_kill q r = Exec . kill q ( Var . of_ reg r ) | > simplify
let exec_kill q r = Exec . kill q ( Var _of_Llair . reg r ) | > simplify
let exec_move q res =
Exec . move q
( IArray . map res ~ f : ( fun ( r , e ) -> ( Var . of_reg r , Term . of_exp e ) ) )
( IArray . map res ~ f : ( fun ( r , e ) ->
( Var_of_Llair . reg r , Term_of_Llair . exp e ) ) )
| > simplify
let exec_inst pre inst =
@ -53,34 +54,36 @@ let exec_inst pre inst =
Some
( Exec . move pre
( IArray . map reg_exps ~ f : ( fun ( r , e ) ->
( Var . of_ reg r , Term . of_ exp e ) ) ) )
( Var _of_Llair . reg r , Term _of_Llair . exp e ) ) ) )
| Load { reg ; ptr ; len ; _ } ->
Exec . load pre ~ reg : ( Var . of_ reg reg ) ~ ptr : ( Term . of_ exp ptr )
~ len : ( Term . of_ exp len )
Exec . load pre ~ reg : ( Var _of_Llair . reg reg ) ~ ptr : ( Term _of_Llair . exp ptr )
~ len : ( Term _of_Llair . exp len )
| Store { ptr ; exp ; len ; _ } ->
Exec . store pre ~ ptr : ( Term . of_exp ptr ) ~ exp : ( Term . of_exp exp )
~ len: ( Term . of_ exp len )
Exec . store pre ~ ptr : ( Term _of_Llair. exp ptr )
~ exp: ( Term_of_Llair . exp exp ) ~ len : ( Term_of_Llair . exp len )
| Memset { dst ; byt ; len ; _ } ->
Exec . memset pre ~ dst : ( Term . of_exp dst ) ~ byt : ( Term . of_exp by t)
~ len: ( Term . of_ exp len )
Exec . memset pre ~ dst : ( Term _of_Llair. exp ds t)
~ byt: ( Term_of_Llair . exp byt ) ~ len: ( Term _of_Llair . exp len )
| Memcpy { dst ; src ; len ; _ } ->
Exec . memcpy pre ~ dst : ( Term . of_exp dst ) ~ src : ( Term . of_exp src )
~ len: ( Term . of_ exp len )
Exec . memcpy pre ~ dst : ( Term _of_Llair. exp dst )
~ src: ( Term_of_Llair . exp src ) ~ len: ( Term _of_Llair . exp len )
| Memmov { dst ; src ; len ; _ } ->
Exec . memmov pre ~ dst : ( Term . of_exp dst ) ~ src : ( Term . of_exp src )
~ len: ( Term . of_ exp len )
Exec . memmov pre ~ dst : ( Term _of_Llair. exp dst )
~ src: ( Term_of_Llair . exp src ) ~ len: ( Term _of_Llair . exp len )
| Alloc { reg ; num ; len ; _ } ->
Exec . alloc pre ~ reg : ( Var . of_reg reg ) ~ num : ( Term . of_exp num ) ~ len
| Free { ptr ; _ } -> Exec . free pre ~ ptr : ( Term . of_exp ptr )
| Nondet { reg ; _ } -> Some ( Exec . nondet pre ( Option . map ~ f : Var . of_reg reg ) )
Exec . alloc pre ~ reg : ( Var_of_Llair . reg reg )
~ num : ( Term_of_Llair . exp num ) ~ len
| Free { ptr ; _ } -> Exec . free pre ~ ptr : ( Term_of_Llair . exp ptr )
| Nondet { reg ; _ } ->
Some ( Exec . nondet pre ( Option . map ~ f : Var_of_Llair . reg reg ) )
| Abort _ -> Exec . abort pre )
| > Option . map ~ f : simplify
let exec_intrinsic ~ skip_throw q r i es =
Exec . intrinsic ~ skip_throw q
( Option . map ~ f : Var . of_ reg r )
( Var . of_ reg i )
( List . map ~ f : Term . of_ exp es )
( Option . map ~ f : Var _of_Llair . reg r )
( Var _of_Llair . reg i )
( List . map ~ f : Term _of_Llair . exp es )
| > Option . map ~ f : ( Option . map ~ f : simplify )
let term_eq_class_has_only_vars_in fvs ctx term =
@ -130,11 +133,11 @@ let localize_entry globals actuals formals freturn locals shadow pre entry =
(* Add the formals here to do garbage collection and then get rid of them *)
let formals_set = Var . Set . of_list formals in
let freturn_locals =
Var . Set . of_ regs ( Llair . Reg . Set . add_option freturn locals )
Var _of_Llair. regs ( Llair . Reg . Set . add_option freturn locals )
in
let function_summary_pre =
garbage_collect entry
~ wrt : ( Var . Set . union formals_set ( Var . Set . of_ regs globals ) )
~ wrt : ( Var . Set . union formals_set ( Var _of_Llair. regs globals ) )
in
[ % Trace . info " function summary pre %a " pp function_summary_pre ] ;
let foot = Sh . exists formals_set function_summary_pre in
@ -166,11 +169,11 @@ let call ~summaries ~globals ~actuals ~areturn ~formals ~freturn ~locals q =
( List . rev formals ) Llair . Reg . Set . pp locals Llair . Reg . Set . pp globals pp
q ]
;
let actuals = List . map ~ f : Term . of_ exp actuals in
let areturn = Option . map ~ f : Var . of_ reg areturn in
let formals = List . map ~ f : Var . of_ reg formals in
let actuals = List . map ~ f : Term _of_Llair . exp actuals in
let areturn = Option . map ~ f : Var _of_Llair . reg areturn in
let formals = List . map ~ f : Var _of_Llair . reg formals in
let freturn_locals =
Var . Set . of_ regs ( Llair . Reg . Set . add_option freturn locals )
Var _of_Llair. regs ( Llair . Reg . Set . add_option freturn locals )
in
let modifs = Var . Set . of_option areturn in
(* quantify modifs, their current value will be overwritten and so does
@ -207,7 +210,7 @@ let post locals _ q =
[ % Trace . call fun { pf } ->
pf " @[<hv>locals: {@[%a@]}@ q: %a@] " Llair . Reg . Set . pp locals Sh . pp q ]
;
Sh . exists ( Var . Set . of_ regs locals ) q | > simplify
Sh . exists ( Var _of_Llair. regs locals ) q | > simplify
| >
[ % Trace . retn fun { pf } -> pf " %a " Sh . pp ]
@ -224,8 +227,8 @@ let retn formals freturn {areturn; unshadow; frame} q =
( Option . pp " @ areturn: %a " Var . pp )
areturn Var . Subst . pp unshadow pp q pp frame ]
;
let formals = List . map ~ f : Var . of_ reg formals in
let freturn = Option . map ~ f : Var . of_ reg freturn in
let formals = List . map ~ f : Var _of_Llair . reg formals in
let freturn = Option . map ~ f : Var _of_Llair . reg freturn in
let q , shadows =
match areturn with
| Some areturn -> (
@ -269,8 +272,8 @@ let create_summary ~locals ~formals ~entry ~current:(post : Sh.t) =
pf " formals %a@ entry: %a@ current: %a " Llair . Reg . Set . pp formals pp
entry pp post ]
;
let locals = Var . Set . of_ regs locals in
let formals = Var . Set . of_ regs formals in
let locals = Var _of_Llair. regs locals in
let formals = Var _of_Llair. regs formals in
let foot = Sh . exists locals entry in
let foot , subst = Sh . freshen ~ wrt : ( Var . Set . union foot . us post . us ) foot in
let restore_formals q =