From b8622b62112d00e8cfd0f03a43bf901e594b90fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Correnson?= <loic.correnson@cea.fr> Date: Wed, 5 Jun 2024 11:28:52 +0200 Subject: [PATCH] [region] fix roots & parents --- src/plugins/region/memory.ml | 41 +++++++++++++++++++++-------------- src/plugins/region/memory.mli | 2 +- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/plugins/region/memory.ml b/src/plugins/region/memory.ml index 98b06b38d6a..ddfa1d76b13 100644 --- a/src/plugins/region/memory.ml +++ b/src/plugins/region/memory.ml @@ -93,20 +93,6 @@ let empty = { layout = Blob ; } -let cell (m: map) ?size ?ptr () = - let layout = match size, ptr with - | None, None -> Blob - | None, Some _ -> Cell(Cil.bitsSizeOf Cil.voidPtrType,ptr) - | Some s, _ -> Cell(s,ptr) - in Ufind.make m.store { empty with layout } - -let range (m: map) ~size ~offset ~length ~data : node = - let last = offset + length in - if not (0 <= offset && offset < last && last <= size) then - raise (Invalid_argument "Region.Memory.range") ; - let layout = Compound(size, Ranges.singleton { offset ; length ; data }) in - Ufind.make m.store { empty with layout } - (* -------------------------------------------------------------------------- *) (* --- Map --- *) (* -------------------------------------------------------------------------- *) @@ -117,14 +103,37 @@ let node map node = let nodes map ns = Store.list @@ List.map (node map) ns +(* -------------------------------------------------------------------------- *) +(* --- Constructors --- *) +(* -------------------------------------------------------------------------- *) + let region map node = try Ufind.get map.store node with Not_found -> empty +let cell (m: map) ?size ?ptr ?root () = + let layout = match size, ptr with + | None, None -> Blob + | None, Some _ -> Cell(Cil.bitsSizeOf Cil.voidPtrType,ptr) + | Some s, _ -> Cell(s,ptr) in + let roots = match root with None -> [] | Some v -> [v] in + Ufind.make m.store { empty with layout ; roots } + +let update (m: map) (n: node) (f: region -> region) = + let r = region m n in Ufind.set m.store n (f r) + +let range (m: map) ~size ~offset ~length ~data : node = + let last = offset + length in + if not (0 <= offset && offset < last && last <= size) then + raise (Invalid_argument "Region.Memory.range") ; + let layout = Compound(size, Ranges.singleton { offset ; length ; data }) in + let n = Ufind.make m.store { empty with layout } in + update m data (fun r -> { r with parents = n :: r.parents }) ; n + let root (m: map) v = try Vmap.find v m.index with Not_found -> - let r = cell m () in - m.index <- Vmap.add v r m.index ; r + let n = cell m ~root:v () in + m.index <- Vmap.add v n m.index ; n (* -------------------------------------------------------------------------- *) (* --- Merge --- *) diff --git a/src/plugins/region/memory.mli b/src/plugins/region/memory.mli index 39bf4857944..924c8518f29 100644 --- a/src/plugins/region/memory.mli +++ b/src/plugins/region/memory.mli @@ -49,7 +49,7 @@ val create : unit -> map val copy : map -> map val root : map -> Cil_types.varinfo -> node -val cell : map -> ?size:int -> ?ptr:node -> unit -> node +val cell : map -> ?size:int -> ?ptr:node -> ?root:varinfo -> unit -> node val range : map -> size:int -> offset:int -> length:int -> data:node -> node val node : map -> node -> node -- GitLab