How do you get a tail call using the OCaml's LLVM API?
To answer my own question: I believe this is currently impossible with the JIT
(execution engine) because there is no way to set PerformTailCallOpt=true in
llvm/Target/TargetOptions.cpp from OCaml.
As a workaround, I have simply edited the source to LLVM and reinstalled it.
Specifically, changing part of "lib/Target/TargetMachine.cpp" to:
static cl::opt<bool, true>
cl::desc("Turn on tail call optimization."),
I assume this is set to false by default in LLVM because tail calls are not
generally desirable, e.g. they undermine stack traces?
However, you can get tail calls in statically-compiled code by:
. Call "set_function_call_conv CallConv.fast" on the function.
. Call "set_instruction_call_conv CallConv.fast" and "set_tail_call true" on
the call instruction.
. Emit the LLVM bitcode with "Llvm_bitwriter.write_bitcode_file m "aout.bc"".
. Use "llc -tailcallopt" when compiling the bitcode to assembler.