let call get_called_annots res fct args p = 
    try
    let called_kf = match fct.enode with 
      | Lval (Var vinfo,NoOffset-> Globals.Functions.get vinfo
      | _ -> raise W.CallFctPtr
    in
    let pre, post, assigns = get_called_annots called_kf in
    let call_env = W.new_env () in
      Wp_parameters.debug ~level:2 "[call] call to %a@." 
        Kernel_function.pretty_name called_kf;
    let post = List.map (W.translate called_kf call_env) post in
      (* TODO : try to recover if the post in untranslatable *)
      List.iter (fun p ->
      Wp_parameters.debug ~level:2 
        "[call] take called postcond : %a@." pretty_pred p) post;
    let p = W.call_res_and_add_post called_kf call_env res post p in

    
    (** move p to the called entry point *)

    let p = W.call_do_body assigns p in

    
    (** replace \old vars by their expressions *)

    let p = W.replace_at_vars call_env (LogicLabel "Pre") p in

    let dummy_env = W.new_env () in
    let pre = List.map (W.translate called_kf dummy_env) pre in
      (* TODO : try to recover if the pre in untranslatable *)
      (* assert (Hashtbl.length dummy_env = 0); *)
      List.iter (fun p ->
                   Wp_parameters.debug ~level:2 
                     "[call] take called precond : %a@." pretty_pred p) pre;
    let formals = Kernel_function.get_formals called_kf in
      W.call_add_pre_and_do_args args formals pre p 
    with 
      | W.CallFctPtr -> 
          raise (Calculus.InvalidModel 
                   ("call with function pointer not handled yet"))
      | Types.Unsupported t ->
          raise (Calculus.InvalidModel 
                   ("unsupported type in call processing: "^t))
      | W.CallArgsVsParamNb ->
          raise (Calculus.InvalidModel 
                   ("unsupported varargs or unspecified proto"))
      | W.CallNeedFctAssigns ->
          raise (Calculus.InvalidModel
                   ("need 'assigns' specification in function to process call"))