[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: OP_TAILCALL versus OP_CALL question
- From: Pierre-Yves Gérardy <pygy79@...>
- Date: Tue, 24 Mar 2015 01:21:02 +0100
Sibling calls are a subset of tail calls that can be implemented on
top of the C calling convention under the following conditions:
* Caller and callee have the same calling convention. It can be either
c or fastcc.
* The call is a tail call - in tail position (ret immediately follows
call and ret uses value of call or is void).
* Caller and callee have matching return type or the callee result is not used.
* If any of the callee arguments are being passed in stack, they must
be available in caller’s own incoming argument stack and the frame
offsets must be the same.
If I understand properly, the last point is quite restrictive.
—Pierre-Yves
On Sun, Mar 22, 2015 at 7:34 PM, Jay Carlson <nop@nop.com> wrote:
> Well, clang 3.4.1 on Ubuntu trusty targeting amd64 seems to generate the tail call/sibling call/whatever-they-call-it.
>
> My guess is that the Linux amd64 ABI is always "fastcall" from the point of view of that documentation.
>
> Jay
>
> On Mar 21, 2015, at 6:03 PM, Pierre-Yves Gérardy <pygy79@gmail.com> wrote:
>
>> The trouble is that you can't do that with LLVM.
>>
>> It does support TCO, though, at the expense of easy C interop (you
>> have to use incompatible calling conventions which breaks the ABI). As
>> long as you don't want to mix C and Lua/Ravi code, FFI-style, you
>> should be fine.
>>
>> http://llvm.org/docs/CodeGenerator.html#tail-call-optimization
>> http://llvm.org/docs/LangRef.html#calling-conventions
>> —Pierre-Yves
>>
>>
>> On Sat, Mar 21, 2015 at 4:23 PM, Coda Highland <chighland@gmail.com> wrote:
>>> On Fri, Mar 20, 2015 at 3:25 PM, Dibyendu Majumdar
>>> <mobile@majumdar.org.uk> wrote:
>>>> On 20 March 2015 at 22:16, Doug Currie <doug.currie@gmail.com> wrote:
>>>>>> I haven't yet figured out how to properly implement OP_TAILCALL in a
>>>>>> JITed function.
>>>>>
>>>>>
>>>>> The usual approach is to emit code to pop the stack frame and convert the
>>>>> tail call to a jump.
>>>>>
>>>>
>>>> In the recursive case, yes, but Lua also uses tail calls for
>>>> non-recursive scenarios. For these a different function may be called
>>>> so it is not possible to handle this in a JITed function - without
>>>> replacing the function being executed as well.
>>>>
>>>> Regards
>>>>
>>>
>>> The technique still applies to the non-recursive case -- you still
>>> clean up the stack frame, push on the return values, and jump.
>>>
>>> /s/ Adam
>>>
>>
>
>