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 Datatype.String.Set.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 (Datatype.String.Set.is_empty
                (SlicingParameters.Select.Value.get ()))
        ||
        not (Datatype.String.Set.is_empty
               (SlicingParameters.Select.RdAccess.get ()))
        ||
        not (Datatype.String.Set.is_empty
               (SlicingParameters.Select.WrAccess.get ()))
      then begin
        (* fprintf fmt "@\n[-slice-value] Select %s at end of the entry point %a@."
           lval_str Db.pretty_name kf; *)

        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)."