let add_persistent_cmdline project =
SlicingParameters.feedback ~level:1
"interpreting slicing requests from the command line...";
begin try
let selection = ref Db.Slicing.Select.empty_selects in
let top_mark = !Db.Slicing.Mark.make ~addr:true ~ctrl:true ~data:true in
Globals.Functions.iter
(fun kf ->
let add_selection opt select =
if Cilutil.StringSet.mem (Kernel_function.get_name kf) (opt ()) then
selection := select !selection ~spare:false kf
in
add_selection
SlicingParameters.Select.Return.get
!Db.Slicing.Select.select_func_return;
add_selection
SlicingParameters.Select.Calls.get
!Db.Slicing.Select.select_func_calls_to;
add_selection
SlicingParameters.Select.Pragma.get
(fun s -> !Db.Slicing.Select.select_func_annots s top_mark
~ai:false ~user_assert:false ~slicing_pragma:true
~loop_inv:false ~loop_var:false);
add_selection
SlicingParameters.Select.Threat.get
(fun s -> !Db.Slicing.Select.select_func_annots s top_mark
~ai:true ~user_assert:false ~slicing_pragma:false
~loop_inv:false ~loop_var:false);
add_selection
SlicingParameters.Select.Assert.get
(fun s -> !Db.Slicing.Select.select_func_annots s top_mark
~ai:false ~user_assert:true ~slicing_pragma:false
~loop_inv:false ~loop_var:false);
add_selection
SlicingParameters.Select.LoopInv.get
(fun s -> !Db.Slicing.Select.select_func_annots s top_mark
~ai:false ~user_assert:false ~slicing_pragma:false
~loop_inv:true ~loop_var:false);
add_selection
SlicingParameters.Select.LoopVar.get
(fun s -> !Db.Slicing.Select.select_func_annots s top_mark
~ai:false ~user_assert:false ~slicing_pragma:false
~loop_inv:false ~loop_var:true);
);
if not (Cilutil.StringSet.is_empty (SlicingParameters.Select.Value.get ()))
||
not (Cilutil.StringSet.is_empty (SlicingParameters.Select.RdAccess.get ()))
||
not (Cilutil.StringSet.is_empty (SlicingParameters.Select.WrAccess.get ()))
then begin
let kf = fst (Globals.entry_point ()) in
let ki_scope_eval = Kernel_function.find_first_stmt kf in
selection := !Db.Slicing.Select.select_func_lval !selection top_mark
(SlicingParameters.Select.Value.get ()) kf;
selection := !Db.Slicing.Select.select_func_lval_rw !selection top_mark
~rd:(SlicingParameters.Select.RdAccess.get ())
~wr:(SlicingParameters.Select.WrAccess.get ())
~scope:ki_scope_eval ~eval:ki_scope_eval kf ;
SlicingParameters.Select.Value.clear () ;
SlicingParameters.Select.RdAccess.clear () ;
SlicingParameters.Select.WrAccess.clear () ;
end;
!Db.Slicing.Request.add_persistent_selection project !selection
with Logic_interp.Error(_loc,msg) ->
SlicingParameters.error "%s. Slicing requests from the command line are ignored" msg
end;
SlicingParameters.feedback ~level:2
"done (interpreting slicing requests from the command line)."