let compute_and_return kf =
  let call_site_loc = CurrentLoc.get () in
  From_parameters.feedback
    "Computing for function %a%s"
    Kernel_function.pretty kf
    (let s = ref "" in
     Stack.iter
       (fun kf ->
          s := !s^" <-"^(Pretty_utils.sfprintf "%a" Kernel_function.pretty kf))
       call_stack;
     !s);
  !Db.progress ();

  let result =
    if !Db.Value.use_spec_instead_of_definition kf
    then compute_using_prototype kf
    else compute_using_cfg kf
  in
  let result = Recording_To_Do.final_cleanup kf result in
  Recording_To_Do.record_kf kf result;
  From_parameters.feedback
    "Done for function %a" Kernel_function.pretty kf;
  !Db.progress ();
  CurrentLoc.set call_site_loc;
  result