diff --git a/src/plugins/wp/Generator.ml b/src/plugins/wp/Generator.ml index 9743f5260961fe636179ced20eb71f0ec600a9dc..beb32219b4f67de9be2e27b85af19b72e29e31c0 100644 --- a/src/plugins/wp/Generator.ml +++ b/src/plugins/wp/Generator.ml @@ -23,6 +23,39 @@ open Cil_types 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) --- *) (* -------------------------------------------------------------------------- *) @@ -30,27 +63,36 @@ open Wp_parameters class type t = object method model : WpContext.model - method generate_ip : Property.t -> Wpo.t Bag.t - method generate_kf : kernel_function -> Wpo.t Bag.t - method generate_call : stmt -> Wpo.t Bag.t - method generate_main : + method compute_ip : Property.t -> Wpo.t Bag.t + method compute_call : stmt -> Wpo.t Bag.t + method compute_main : ?fct:functions -> ?bhv:string list -> ?prop:string list -> unit -> Wpo.t Bag.t end -type computer = [ `Dump | `Legacy | `Cfg ] - -let make - ?(computer = `Cfg) +let create + ?dump ?legacy ?(setup: Factory.setup option) ?(driver: Factory.driver option) () : t = - ignore setup ; ignore driver ; - match (computer : computer) with - | `Cfg -> assert false - | `Dump -> assert false - | `Legacy -> assert false + let default f = function Some v -> v | None -> f () in + let dump = default Wp_parameters.Dump.get dump in + let legacy = default Wp_parameters.Dump.get legacy in + let driver = default Driver.load_driver driver in + 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 (* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/Generator.mli b/src/plugins/wp/Generator.mli index b8ea58c425da85845e9f3960f4cd8bcadbbd5205..18e2e5987911a15119987f714a7eae5cfa1d10e4 100644 --- a/src/plugins/wp/Generator.mli +++ b/src/plugins/wp/Generator.mli @@ -27,23 +27,24 @@ open Wp_parameters (* --- WP Computer (main entry points) --- *) (* -------------------------------------------------------------------------- *) +(** Compute model setup from command line options. *) +val user_setup : unit -> Factory.setup + class type t = object method model : WpContext.model - method generate_ip : Property.t -> Wpo.t Bag.t - method generate_kf : kernel_function -> Wpo.t Bag.t - method generate_call : stmt -> Wpo.t Bag.t - method generate_main : + method compute_ip : Property.t -> Wpo.t Bag.t + method compute_call : stmt -> Wpo.t Bag.t + method compute_main : ?fct:functions -> ?bhv:string list -> ?prop:string list -> unit -> Wpo.t Bag.t end -type computer = [ `Dump | `Legacy | `Cfg ] - -val make : - ?computer:computer -> +val create : + ?dump:bool -> + ?legacy:bool -> ?setup:Factory.setup -> ?driver:Factory.driver -> unit -> t diff --git a/src/plugins/wp/VC.ml b/src/plugins/wp/VC.ml index c3a52fece6fd33408b5e8b0abafa60f855050fd6..f921d0000a3f85fa33c380f81752ed85fdf3ff28 100644 --- a/src/plugins/wp/VC.ml +++ b/src/plugins/wp/VC.ml @@ -69,24 +69,21 @@ let () = Property_status.register_property_remove_hook remove (* --- Generator Interface --- *) (* -------------------------------------------------------------------------- *) -let generator ?model () = +let generator model = let setup = match model with - | None -> Register.setup () - | Some s -> Factory.parse [s] in - let driver = Driver.load_driver () in - CfgWP.computer setup driver + | None -> None + | Some s -> Some (Factory.parse [s]) in + Generator.create ~dump:false ?setup () let generate_ip ?model ip = - let gen = generator ?model () in - WpGenerator.compute_ip gen ip + (generator model)#compute_ip ip -let generate_kf ?model ?(bhv=[]) kf = - let gen = generator ?model () in - WpGenerator.compute_kf gen ~bhv ~kf () +let generate_kf ?model ?bhv ?prop kf = + let kfs = Kernel_function.Set.singleton kf in + (generator model)#compute_main ~fct:(Fct_list kfs) ?bhv ?prop () let generate_call ?model stmt = - let gen = generator ?model () in - WpGenerator.compute_call gen stmt + (generator model)#compute_call stmt (* -------------------------------------------------------------------------- *) (* --- Prover Interface --- *) diff --git a/src/plugins/wp/VC.mli b/src/plugins/wp/VC.mli index f073fffb0218a567d2e6c9f1aed20f5849d804a0..d39e04dc2ca5d17a26c7c81538b66a6aaa63db9a 100644 --- a/src/plugins/wp/VC.mli +++ b/src/plugins/wp/VC.mli @@ -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_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 (** {2 Prover Interface} *) diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml index 0d9cc9897476399d5344fe0b6a3028927ded8c93..0174cc73384b09988b727c31c6dd28414b9e1e93 100644 --- a/src/plugins/wp/register.ml +++ b/src/plugins/wp/register.ml @@ -20,56 +20,10 @@ (* *) (**************************************************************************) -open Factory - let dkey_main = Wp_parameters.register_category "main" let dkey_raised = Wp_parameters.register_category "raised" 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 --- *) (* ------------------------------------------------------------------------ *) @@ -751,11 +705,12 @@ let cmdline_run () = if fct <> Wp_parameters.Fct_none then begin Wp_parameters.feedback ~ontty:`Feedback "Running WP plugin..."; - let computer = computer () in + let generator = Generator.create () in + let model = generator#model in Ast.compute (); Dyncall.compute (); if Wp_parameters.RTE.get () then - WpRTE.generate_all computer#model ; + WpRTE.generate_all model ; if Wp_parameters.has_dkey dkey_logicusage then begin LogicUsage.compute (); @@ -771,14 +726,14 @@ let cmdline_run () = (** TODO entry point *) if Wp_parameters.has_dkey dkey_builtins then begin - WpContext.on_context (computer#model,WpContext.Global) + WpContext.on_context (model,WpContext.Global) LogicBuiltins.dump (); end ; - WpTarget.compute computer#model ; - wp_compute_memory_context computer#model ; + WpTarget.compute model ; + wp_compute_memory_context model ; if Wp_parameters.CheckMemoryContext.get () then - wp_insert_memory_context computer#model ; - let goals = WpGenerator.compute_selection computer ~fct ~bhv ~prop () in + wp_insert_memory_context model ; + let goals = generator#compute_main ~fct ~bhv ~prop () in do_wp_proofs goals ; begin if fct <> Wp_parameters.Fct_all then @@ -786,7 +741,7 @@ let cmdline_run () = else do_wp_print () ; end ; - do_wp_report computer#model ; + do_wp_report model ; end end diff --git a/src/plugins/wp/wpGenerator.mli b/src/plugins/wp/wpGenerator.mli index bf7e8b697c118f08a0b7f946253986926fa6b9f5..8152205db349315c7c11fc86212d9c44837b49b8 100644 --- a/src/plugins/wp/wpGenerator.mli +++ b/src/plugins/wp/wpGenerator.mli @@ -48,4 +48,3 @@ val compute_selection : computer -> ?bhv:string list -> ?prop:string list -> unit -> Wpo.t Bag.t -