Skip to content
Snippets Groups Projects
Commit 1c7016e9 authored by Loïc Correnson's avatar Loïc Correnson
Browse files

[region] function domain

parent 8b1bc42c
No related branches found
No related tags found
No related merge requests found
...@@ -22,27 +22,20 @@ ...@@ -22,27 +22,20 @@
open Cil_datatype open Cil_datatype
type domain = {
pre: Memory.map ;
post: Memory.map ;
exit: Memory.map ;
stmt: Memory.map Stmt.Map.t ;
}
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
(* --- Projectification --- *) (* --- Projectification --- *)
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
module DOMAIN : Datatype.S with type t = domain = module DOMAIN : Datatype.S with type t = Code.domain =
Datatype.Make Datatype.Make
(struct (struct
type t = domain type t = Code.domain
include Datatype.Undefined include Datatype.Undefined
let name = "Region.Analysis.MEMORY" let name = "Region.Analysis.MEMORY"
let mem_project = Datatype.never_any_project let mem_project = Datatype.never_any_project
let reprs = let reprs =
let m = Memory.create () in let m = Memory.create () in
[{ pre = m; post = m; exit = m; stmt = Stmt.Map.empty }] Code.[{ map = m; body = Stmt.Map.empty ; spec = Property.Map.empty }]
end) end)
module STATE = State_builder.Hashtbl(Kernel_function.Hashtbl)(DOMAIN) module STATE = State_builder.Hashtbl(Kernel_function.Hashtbl)(DOMAIN)
...@@ -56,6 +49,12 @@ module STATE = State_builder.Hashtbl(Kernel_function.Hashtbl)(DOMAIN) ...@@ -56,6 +49,12 @@ module STATE = State_builder.Hashtbl(Kernel_function.Hashtbl)(DOMAIN)
(* --- Memoized Access --- *) (* --- Memoized Access --- *)
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
let get kf = STATE.find kf let domain kf =
try STATE.find kf with Not_found ->
Options.feedback ~ontty:`Transient "Function %a" Kernel_function.pretty kf ;
let domain = Code.domain kf in
STATE.add kf domain ; domain
let compute kf = ignore (domain kf)
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
...@@ -21,13 +21,9 @@ ...@@ -21,13 +21,9 @@
(**************************************************************************) (**************************************************************************)
open Cil_types open Cil_types
open Cil_datatype
type domain = { (** Memoized *)
pre: Memory.map ; val domain : kernel_function -> Code.domain
post: Memory.map ;
exit: Memory.map ;
stmt: Memory.map Stmt.Map.t ;
}
val get : kernel_function -> domain (** Memoized *)
val compute : kernel_function -> unit
...@@ -208,3 +208,27 @@ and block (r:rmap) (m:map) (b:block) = ...@@ -208,3 +208,27 @@ and block (r:rmap) (m:map) (b:block) =
List.iter (stmt r m) b.bstmts List.iter (stmt r m) b.bstmts
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
(* --- Function --- *)
(* -------------------------------------------------------------------------- *)
type domain = {
map : map ;
body : map Stmt.Map.t ;
spec : map Property.Map.t ;
}
let domain kf =
let m = Memory.create () in
let r = ref Stmt.Map.empty in
begin
try
let fundec = Kernel_function.get_definition kf in
block r m fundec.sbody ;
with Kernel_function.No_Definition -> ()
end ; {
map = m ;
body = !r ;
spec = Property.Map.empty ;
}
(* -------------------------------------------------------------------------- *)
...@@ -28,3 +28,11 @@ val lval : map -> stmt -> lval -> node ...@@ -28,3 +28,11 @@ val lval : map -> stmt -> lval -> node
val exp : map -> stmt -> exp -> node option val exp : map -> stmt -> exp -> node option
val instr : map -> stmt -> instr -> unit val instr : map -> stmt -> instr -> unit
val stmt : map Stmt.Map.t ref -> map -> stmt -> unit val stmt : map Stmt.Map.t ref -> map -> stmt -> unit
type domain = {
map : map ;
body : map Stmt.Map.t ;
spec : map Property.Map.t ;
}
val domain : kernel_function -> domain
...@@ -31,11 +31,7 @@ let main () = ...@@ -31,11 +31,7 @@ let main () =
begin begin
Ast.compute () ; Ast.compute () ;
R.feedback "Analyzing regions" ; R.feedback "Analyzing regions" ;
Globals.Functions.iter Globals.Functions.iter Analysis.compute ;
begin fun (kf: Kernel_function.t) ->
R.feedback ~ontty:`Transient
"Function %a" Kernel_function.pretty kf
end ;
end end
let () = Boot.Main.extend main let () = Boot.Main.extend main
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment