let get_strategies assigns cfg behaviors ki property =
Wp_parameters.feedback ~level:3
"[wpAnnot.get_strategies] for behaviors names: %a@."
(Wp_error.pp_string_list ~sep:" " ~empty:"<none>")
(match behaviors with None -> ["<all>"] | Some l -> l) ;
let _ = match ki with
| None -> ()
| Some Kglobal ->
Wp_parameters.feedback ~level:3
"[wpAnnot.get_strategies] select in function properies@."
| Some (Kstmt s) ->
Wp_parameters.feedback ~level:3
"[wpAnnot.get_strategies] select stmt %d properties@." s.sid
in
let kf = Cil2cfg.cfg_kf cfg in
let s_bhvs, def_annot_bhv = internal_function_behaviors cfg in
let bhvs =
let f_bhvs = Kernel_function.spec_function_behaviors kf in
match behaviors with
| Some bhvs ->
List.fold_left
(fun acc b -> (get_asked_bhv_from_name s_bhvs f_bhvs ki b)@acc)
[] bhvs
| None ->
let spec = Kernel_function.get_spec kf in
let bhvs = get_behavior_names ~with_default:true spec in
let bhvs = List.map (fun b -> FunBhv b) bhvs in
List.fold_left
(fun acc (n,s,b) -> (StmtBhv (n,s,b))::acc) bhvs s_bhvs
in
if bhvs = [] then
Wp_parameters.warning "[wpAnnot.get_strategies] no behaviors found";
let do_bhv bhv =
let config = { kf = Cil2cfg.cfg_kf cfg ;
cfg = cfg;
new_loops = new_loops;
cur_bhv = bhv;
asked_prop = property;
asked_bhvs = bhvs;
assigns_filter = assigns;
def_annots_info = def_annot_bhv}
in [build_bhv_strategy config]
in List.flatten (List.map do_bhv bhvs)