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

  let result = match kf.fundec with
    | Definition _ ->
        compute_using_cfg kf
    | Declaration _ ->
        compute_using_prototype 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_name kf;
  !Db.progress ();
  CurrentLoc.set call_site_loc;
  result