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
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
let p = W.call_do_body assigns p in
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
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"))