Skip to content
Snippets Groups Projects
Commit e1367ffc authored by Basile Desloges's avatar Basile Desloges
Browse files

[eacsl:codegen] Support of variadic functions in `Constructor.mk_lib_call`

parent 8fba2241
No related branches found
No related tags found
No related merge requests found
...@@ -69,21 +69,30 @@ let mk_lib_call ~loc ?result fname args = ...@@ -69,21 +69,30 @@ let mk_lib_call ~loc ?result fname args =
let vi = Misc.get_lib_fun_vi fname in let vi = Misc.get_lib_fun_vi fname in
let f = Cil.evar ~loc vi in let f = Cil.evar ~loc vi in
vi.vreferenced <- true; vi.vreferenced <- true;
let make_args args param_ty = let make_args ~variadic args param_ty =
List.map2 let rec make_rev_args res args param_ty =
(fun (_, ty, _) arg -> match args, param_ty with
let e = | arg :: args_tl, (_, ty, _) :: param_ty_tl ->
match ty, Cil.unrollType (Cil.typeOf arg), arg.enode with let e =
| TPtr _, TArray _, Lval lv -> Cil.new_exp ~loc (StartOf lv) match ty, Cil.unrollType (Cil.typeOf arg), arg.enode with
| TPtr _, TArray _, _ -> assert false | TPtr _, TArray _, Lval lv -> Cil.new_exp ~loc (StartOf lv)
| _, _, _ -> arg | TPtr _, TArray _, _ -> assert false
in | _, _, _ -> arg
Cil.mkCast ~force:false ~newt:ty ~e) in
param_ty let e = Cil.mkCast ~force:false ~newt:ty ~e in
args make_rev_args (e :: res) args_tl param_ty_tl
| arg :: args_tl, [] when variadic -> make_rev_args (arg :: res) args_tl []
| [], [] -> res
| _, _ ->
Options.fatal
"Mismatch between the number of expressions given and the number \
of arguments in the signature when calling function '%s'"
fname
in
List.rev (make_rev_args [] args param_ty)
in in
let args = match Cil.unrollType vi.vtype with let args = match Cil.unrollType vi.vtype with
| TFun(_, Some params, _, _) -> make_args args params | TFun(_, Some params, variadic, _) -> make_args ~variadic args params
| TFun(_, None, _, _) -> [] | TFun(_, None, _, _) -> []
| _ -> assert false | _ -> assert false
in in
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment