From 907a9f4f938143b71ba0d919ac73c2229ccb2b70 Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Wed, 13 Mar 2024 17:07:22 +0100 Subject: [PATCH] Disable tail call for vararg functions --- src/X86.ml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/X86.ml b/src/X86.ml index f4a7b26eb..ddadfcb16 100644 --- a/src/X86.ml +++ b/src/X86.ml @@ -421,7 +421,11 @@ let compile_call env ?fname nargs tail = in let tail_call_optimization_applicable = let allowed_function = - match fname with Some fname -> not (fname.[0] = 'B') | None -> true + match fname with + | Some fname -> + let is_vararg = Option.is_some @@ List.assoc_opt fname vararg_functions in + not (fname.[0] = 'B') && not is_vararg + | None -> true in let same_arguments_count = env#nargs = nargs in tail && allowed_function && same_arguments_count @@ -526,9 +530,7 @@ let compile_call env ?fname nargs tail = in let env, args = pop_arguments env [] nargs in let setup_args_code = List.map (fun arg -> Push arg) @@ List.rev args in - let setup_args_code = - setup_args_code @ [ Mov (rsp, rdi) ] - in + let setup_args_code = setup_args_code @ [ Mov (rsp, rdi) ] in let setup_args_code = if fname = builtin_label "closure" then setup_args_code @ [ Mov (L (box (nargs - 1)), rsi) ]