Skip to content

Commit bb0d8d3

Browse files
authored
fixes fresh variable generation (#1376)
* uses references to generate fresh variables outside of the KB monad * stores fresh counter of theory variables in the context variables
1 parent a2812fb commit bb0d8d3

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

lib/bap_core_theory/bap_core_theory_var.ml

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,22 @@ open Caml.Format
44
open Bap_knowledge
55
open Bap_core_theory_value
66
open Knowledge.Syntax
7+
open Knowledge.Let
78

89
module Value = Knowledge.Value
910

1011
let package = "core"
1112

12-
type const = Const [@@deriving bin_io, compare, sexp]
13-
type mut = Mut [@@deriving bin_io, compare, sexp]
1413

15-
let const = Knowledge.Class.declare ~package "const-var" Const
16-
~desc:"local immutable variables"
1714

18-
let mut = Knowledge.Class.declare ~package "mut-var" Mut
19-
~desc:"temporary mutable variables"
15+
let pure = KB.Context.declare ~package "let-variables" !!Int63.zero
16+
let temp = KB.Context.declare ~package "tmp-variables" !!Int63.zero
17+
18+
type id = Int63.t [@@deriving bin_io, compare, hash, sexp]
2019

2120
type ident =
22-
| Var of {num : Int63.t; ver : int}
23-
| Let of {num : Int63.t}
21+
| Var of {num : id; ver : int}
22+
| Let of {num : id}
2423
| Reg of {name : String.Caseless.t; ver : int}
2524
[@@deriving bin_io, compare, hash, sexp]
2625

@@ -92,17 +91,25 @@ let version v = match ident v with
9291
| Let _ -> 0
9392
| Reg {ver} | Var {ver} -> ver
9493

94+
let incr var =
95+
let* v = Knowledge.Context.get var in
96+
let+ () = Knowledge.Context.set var (Int63.succ v) in
97+
v
98+
9599
let fresh s =
96-
Knowledge.Object.create mut >>| fun v ->
97-
create s (Var {num = Knowledge.Object.id v; ver=0})
100+
let+ num = incr pure in
101+
create s (Var {num; ver=0})
102+
103+
let reset_temporary_counter = KB.Context.set temp Int63.zero
98104

99105
type 'a pure = 'a Bap_core_theory_value.t knowledge
100106

101107
(* we're ensuring that a variable is immutable by constraining
102108
the scope computation to be pure. *)
103109
let scoped : 'a sort -> ('a t -> 'b pure) -> 'b pure = fun s f ->
104-
Knowledge.Object.scoped const @@ fun v ->
105-
f @@ create s (Let {num = Knowledge.Object.id v})
110+
let* num = Knowledge.Context.get pure in
111+
Knowledge.Context.with_var pure (Int63.succ num) @@ fun () ->
112+
f @@ create s (Let {num})
106113

107114
module Ident = struct
108115
type t = ident [@@deriving bin_io, compare, hash, sexp]

lib/bap_core_theory/bap_core_theory_var.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ open Bap_core_theory_value
66
type 'a t
77
type ord
88
type ident [@@deriving bin_io, compare, sexp]
9+
type id
910
type 'a pure = 'a Bap_core_theory_value.t knowledge
1011

1112

@@ -26,6 +27,8 @@ val fresh : 'a sort -> 'a t knowledge
2627
val scoped : 'a sort -> ('a t -> 'b pure) -> 'b pure
2728
val pp : Format.formatter -> 'a t -> unit
2829

30+
val reset_temporary_counter : unit knowledge
31+
2932
module Ident : sig
3033
type t = ident [@@deriving bin_io, compare, sexp]
3134
include Stringable.S with type t := t

lib/bap_types/bap_var.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ let sort_of_typ t =
5757
| Type.Unk -> ret @@ unknown
5858

5959
module Generator = struct
60+
let counter = ref 0xC00000;
6061
module Toplevel = Bap_toplevel
6162
open KB.Syntax
6263

@@ -76,6 +77,10 @@ module Generator = struct
7677
Theory.Var.fresh s >>| Theory.Var.ident
7778
end;
7879
Toplevel.get ident
80+
81+
let fresh _ =
82+
decr counter;
83+
Theory.Var.Ident.of_string (sprintf "#%d" !counter)
7984
end
8085

8186
let create ?(is_virtual=false) ?(fresh=false) name typ =

0 commit comments

Comments
 (0)