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

[wp] new generator API

parent c740571b
No related branches found
No related tags found
No related merge requests found
...@@ -23,6 +23,39 @@ ...@@ -23,6 +23,39 @@
open Cil_types open Cil_types
open Wp_parameters open Wp_parameters
(* -------------------------------------------------------------------------- *)
(* --- Model Setup --- *)
(* -------------------------------------------------------------------------- *)
let user_setup () : Factory.setup =
begin
match Wp_parameters.Model.get () with
| ["Runtime"] ->
Wp_parameters.abort
"Model 'Runtime' is no more available.@\nIt will be reintroduced \
in a future release."
| ["Logic"] ->
Wp_parameters.warning ~once:true
"Deprecated 'Logic' model.@\nUse 'Typed' with option '-wp-ref' \
instead." ;
{
mheap = Factory.Typed MemTyped.Fits ;
mvar = Factory.Ref ;
cint = Cint.Natural ;
cfloat = Cfloat.Real ;
}
| ["Store"] ->
Wp_parameters.warning ~once:true
"Deprecated 'Store' model.@\nUse 'Typed' instead." ;
{
mheap = Factory.Typed MemTyped.Fits ;
mvar = Factory.Var ;
cint = Cint.Natural ;
cfloat = Cfloat.Real ;
}
| spec -> Factory.parse spec
end
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
(* --- WP Computer (main entry points) --- *) (* --- WP Computer (main entry points) --- *)
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
...@@ -30,27 +63,36 @@ open Wp_parameters ...@@ -30,27 +63,36 @@ open Wp_parameters
class type t = class type t =
object object
method model : WpContext.model method model : WpContext.model
method generate_ip : Property.t -> Wpo.t Bag.t method compute_ip : Property.t -> Wpo.t Bag.t
method generate_kf : kernel_function -> Wpo.t Bag.t method compute_call : stmt -> Wpo.t Bag.t
method generate_call : stmt -> Wpo.t Bag.t method compute_main :
method generate_main :
?fct:functions -> ?fct:functions ->
?bhv:string list -> ?bhv:string list ->
?prop:string list -> ?prop:string list ->
unit -> Wpo.t Bag.t unit -> Wpo.t Bag.t
end end
type computer = [ `Dump | `Legacy | `Cfg ] let create
?dump ?legacy
let make
?(computer = `Cfg)
?(setup: Factory.setup option) ?(setup: Factory.setup option)
?(driver: Factory.driver option) ?(driver: Factory.driver option)
() : t = () : t =
ignore setup ; ignore driver ; let default f = function Some v -> v | None -> f () in
match (computer : computer) with let dump = default Wp_parameters.Dump.get dump in
| `Cfg -> assert false let legacy = default Wp_parameters.Dump.get legacy in
| `Dump -> assert false let driver = default Driver.load_driver driver in
| `Legacy -> assert false let setup = default user_setup setup in
ignore legacy ;
let cc =
if dump
then ( Cil2cfg.Dump.process () ; CfgDump.create () )
else CfgWP.computer setup driver in
let the_model = cc#model in
object
method model = the_model
method compute_ip = WpGenerator.compute_ip cc
method compute_call = WpGenerator.compute_call cc
method compute_main = WpGenerator.compute_selection cc
end
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
...@@ -27,23 +27,24 @@ open Wp_parameters ...@@ -27,23 +27,24 @@ open Wp_parameters
(* --- WP Computer (main entry points) --- *) (* --- WP Computer (main entry points) --- *)
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
(** Compute model setup from command line options. *)
val user_setup : unit -> Factory.setup
class type t = class type t =
object object
method model : WpContext.model method model : WpContext.model
method generate_ip : Property.t -> Wpo.t Bag.t method compute_ip : Property.t -> Wpo.t Bag.t
method generate_kf : kernel_function -> Wpo.t Bag.t method compute_call : stmt -> Wpo.t Bag.t
method generate_call : stmt -> Wpo.t Bag.t method compute_main :
method generate_main :
?fct:functions -> ?fct:functions ->
?bhv:string list -> ?bhv:string list ->
?prop:string list -> ?prop:string list ->
unit -> Wpo.t Bag.t unit -> Wpo.t Bag.t
end end
type computer = [ `Dump | `Legacy | `Cfg ] val create :
?dump:bool ->
val make : ?legacy:bool ->
?computer:computer ->
?setup:Factory.setup -> ?setup:Factory.setup ->
?driver:Factory.driver -> ?driver:Factory.driver ->
unit -> t unit -> t
......
...@@ -69,24 +69,21 @@ let () = Property_status.register_property_remove_hook remove ...@@ -69,24 +69,21 @@ let () = Property_status.register_property_remove_hook remove
(* --- Generator Interface --- *) (* --- Generator Interface --- *)
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
let generator ?model () = let generator model =
let setup = match model with let setup = match model with
| None -> Register.setup () | None -> None
| Some s -> Factory.parse [s] in | Some s -> Some (Factory.parse [s]) in
let driver = Driver.load_driver () in Generator.create ~dump:false ?setup ()
CfgWP.computer setup driver
let generate_ip ?model ip = let generate_ip ?model ip =
let gen = generator ?model () in (generator model)#compute_ip ip
WpGenerator.compute_ip gen ip
let generate_kf ?model ?(bhv=[]) kf = let generate_kf ?model ?bhv ?prop kf =
let gen = generator ?model () in let kfs = Kernel_function.Set.singleton kf in
WpGenerator.compute_kf gen ~bhv ~kf () (generator model)#compute_main ~fct:(Fct_list kfs) ?bhv ?prop ()
let generate_call ?model stmt = let generate_call ?model stmt =
let gen = generator ?model () in (generator model)#compute_call stmt
WpGenerator.compute_call gen stmt
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
(* --- Prover Interface --- *) (* --- Prover Interface --- *)
......
...@@ -66,7 +66,8 @@ val iter_kf : (t -> unit) -> ?bhv:string list -> Kernel_function.t -> unit ...@@ -66,7 +66,8 @@ val iter_kf : (t -> unit) -> ?bhv:string list -> Kernel_function.t -> unit
*) *)
val generate_ip : ?model:string -> Property.t -> t Bag.t val generate_ip : ?model:string -> Property.t -> t Bag.t
val generate_kf : ?model:string -> ?bhv:string list -> Kernel_function.t -> t Bag.t val generate_kf : ?model:string -> ?bhv:string list -> ?prop:string list ->
Kernel_function.t -> t Bag.t
val generate_call : ?model:string -> Cil_types.stmt -> t Bag.t val generate_call : ?model:string -> Cil_types.stmt -> t Bag.t
(** {2 Prover Interface} *) (** {2 Prover Interface} *)
......
...@@ -20,56 +20,10 @@ ...@@ -20,56 +20,10 @@
(* *) (* *)
(**************************************************************************) (**************************************************************************)
open Factory
let dkey_main = Wp_parameters.register_category "main" let dkey_main = Wp_parameters.register_category "main"
let dkey_raised = Wp_parameters.register_category "raised" let dkey_raised = Wp_parameters.register_category "raised"
let wkey_smoke = Wp_parameters.register_warn_category "smoke" let wkey_smoke = Wp_parameters.register_warn_category "smoke"
(* --------- Command Line ------------------- *)
let setup () : setup =
begin
match Wp_parameters.Model.get () with
| ["Runtime"] ->
Wp_parameters.abort
"Model 'Runtime' is no more available.@\nIt will be reintroduced \
in a future release."
| ["Logic"] ->
Wp_parameters.warning ~once:true
"Deprecated 'Logic' model.@\nUse 'Typed' with option '-wp-ref' \
instead." ;
{
mheap = Factory.Typed MemTyped.Fits ;
mvar = Factory.Ref ;
cint = Cint.Natural ;
cfloat = Cfloat.Real ;
}
| ["Store"] ->
Wp_parameters.warning ~once:true
"Deprecated 'Store' model.@\nUse 'Typed' instead." ;
{
mheap = Factory.Typed MemTyped.Fits ;
mvar = Factory.Var ;
cint = Cint.Natural ;
cfloat = Cfloat.Real ;
}
| spec -> Factory.parse spec
end
let set_model (s:setup) =
Wp_parameters.Model.set [Factory.ident s]
(* --------- WP Computer -------------------- *)
let computer () =
if Wp_parameters.Dump.get ()
then begin
Cil2cfg.Dump.process () ;
CfgDump.create ()
end
else CfgWP.computer (setup ()) (Driver.load_driver ())
(* ------------------------------------------------------------------------ *) (* ------------------------------------------------------------------------ *)
(* --- Memory Model Hypotheses --- *) (* --- Memory Model Hypotheses --- *)
(* ------------------------------------------------------------------------ *) (* ------------------------------------------------------------------------ *)
...@@ -751,11 +705,12 @@ let cmdline_run () = ...@@ -751,11 +705,12 @@ let cmdline_run () =
if fct <> Wp_parameters.Fct_none then if fct <> Wp_parameters.Fct_none then
begin begin
Wp_parameters.feedback ~ontty:`Feedback "Running WP plugin..."; Wp_parameters.feedback ~ontty:`Feedback "Running WP plugin...";
let computer = computer () in let generator = Generator.create () in
let model = generator#model in
Ast.compute (); Ast.compute ();
Dyncall.compute (); Dyncall.compute ();
if Wp_parameters.RTE.get () then if Wp_parameters.RTE.get () then
WpRTE.generate_all computer#model ; WpRTE.generate_all model ;
if Wp_parameters.has_dkey dkey_logicusage then if Wp_parameters.has_dkey dkey_logicusage then
begin begin
LogicUsage.compute (); LogicUsage.compute ();
...@@ -771,14 +726,14 @@ let cmdline_run () = ...@@ -771,14 +726,14 @@ let cmdline_run () =
(** TODO entry point *) (** TODO entry point *)
if Wp_parameters.has_dkey dkey_builtins then if Wp_parameters.has_dkey dkey_builtins then
begin begin
WpContext.on_context (computer#model,WpContext.Global) WpContext.on_context (model,WpContext.Global)
LogicBuiltins.dump (); LogicBuiltins.dump ();
end ; end ;
WpTarget.compute computer#model ; WpTarget.compute model ;
wp_compute_memory_context computer#model ; wp_compute_memory_context model ;
if Wp_parameters.CheckMemoryContext.get () then if Wp_parameters.CheckMemoryContext.get () then
wp_insert_memory_context computer#model ; wp_insert_memory_context model ;
let goals = WpGenerator.compute_selection computer ~fct ~bhv ~prop () in let goals = generator#compute_main ~fct ~bhv ~prop () in
do_wp_proofs goals ; do_wp_proofs goals ;
begin begin
if fct <> Wp_parameters.Fct_all then if fct <> Wp_parameters.Fct_all then
...@@ -786,7 +741,7 @@ let cmdline_run () = ...@@ -786,7 +741,7 @@ let cmdline_run () =
else else
do_wp_print () ; do_wp_print () ;
end ; end ;
do_wp_report computer#model ; do_wp_report model ;
end end
end end
......
...@@ -48,4 +48,3 @@ val compute_selection : computer -> ...@@ -48,4 +48,3 @@ val compute_selection : computer ->
?bhv:string list -> ?bhv:string list ->
?prop:string list -> ?prop:string list ->
unit -> Wpo.t Bag.t unit -> Wpo.t Bag.t
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