[LLVMdev] Fw: Compile function with limited set of registers? Jump to another function?
Samuel Crow
samuraileumas at yahoo.com
Mon Jan 31 14:28:35 PST 2011
Forgot to cc the list.
>
>----- Forwarded Message ----
>From: Samuel Crow <samuraileumas at yahoo.com>
>To: James Williams <junk at giantblob.com>
>Sent: Mon, January 31, 2011 4:27:45 PM
>Subject: Re: [LLVMdev] Compile function with limited set of registers? Jump to
>another function?
>
>
>Hi James,
>
>
>If you're looking for a way to implement interface inheritance, I think the
>easiest way is to use double-indirection. It's slow but it does the job. You
>just use an array to hold the interface and have each entry point to the vtable
>entry for the appropriate functions in the class. Then you can treat the
>interface as a read-only class once the constructor is run and the interface
>will assign its values when the class is allocated before the invocation of the
>actual constructor.
>
>
>The faster way to implement interfaces is with generics but that generates
>bigger code.
>
>
>I hope this answers your question,
>
>
>--Sam
>
>>
>>From: James Williams <junk at giantblob.com>
>>To: joshuawarner32 at gmail.com
>>Cc: llvmdev at cs.uiuc.edu
>>Sent: Mon, January 31, 2011 4:01:24 PM
>>Subject: Re: [LLVMdev] Compile function with limited set of registers? Jump to
>>another function?
>>
>>Thanks, that's a good idea - I'll have a look through the VMKit source.
>>
>>-- James
>>
>>
>>On 31 January 2011 21:39, Joshua Warner <joshuawarner32 at gmail.com> wrote:
>>
>>Hi James,
>>>
>>>
>>>I see the problem now. You might look at VMKit (a Java VM build with the LLVM
>>>JIT compiler) - I would expect it uses a similar method for resolving interface
>>>calls (the method, if I understand it correctly, is well-known in the Java
>>>world).
>>>
>>>
>>>I've CC'd the main dev behind VMKit - he might be able to lend some insight.
>>>
>>>--Joshua
>>>
>>>
>>>On Mon, Jan 31, 2011 at 2:24 PM, James Williams <junk at giantblob.com> wrote:
>>>
>>>Hi Joshua,
>>>>
>>>>Thanks - I was hoping that would be the case.
>>>>
>>>>However, I've had a think about this since I posted to the list and I believe
>>>>the only way to handle these issues safely in LLVM IR would be to define the
>>>>thunk as varargs. I'm not sure how well LLVM handles varargs but ideally it
>>>>would all compile down to nothing since the parameters to the the thunk would
>>>>be in the same registers/stack locations as required by the target method.
>>>>
>>>>Unfortunately, varargs has some downsides: there's the additional overhead for
>>>>the extra hidden parameter to every interface method call for the parameter
>>>>count plus it doesn't (I don't think) support tail calls.
>>>>
>>>>-- James
>>>>
>>>>
>>>>
>>>>On 27 January 2011 17:37, Joshua Warner <joshuawarner32 at gmail.com> wrote:
>>>>
>>>>Hi James,
>>>>>
>>>>>
>>>>>I'm no expert in LLVM IR, but I think that just encoding each *actual* method
>>>>>invocation in the thunk as a tail call would work. This would require trusting
>>>>>that LLVM passes / code generators will translate down to a jump, as is normal.
>>>>> If the passes / code generators are smart, I see no reason that LLVM wouldn't
>>>>>emit code that fits your requirements. Either way, you know that your thunk
>>>>>will be correct - it just might not be as efficient as you want.
>>>>>
>>>>>
>>>>>I would suggest experimenting with generating a thunk this way, and look at the
>>>>>resultant target assembly to make sure it's doing what you want.
>>>>>
>>>>>
>>>>>-Joshua
>>>>>
>>>>>
>>>>>On Tue, Jan 25, 2011 at 2:04 AM, James Williams <junk at giantblob.com> wrote:
>>>>>
>>>>>Hi,
>>>>>>
>>>>>>Can anyone tell me, is it possible to express in LLVM IR:
>>>>>> - that, for a specific function, register allocator can use only limited set
>>>>>>of registers? (specifically, cannot touch any registers that might contain
>>>>>>parameters)
>>>>>> - that stack can't be touched? (or at least must balance on exit from
>>>thunk)
>>>>>> - jump, not call, to another function leaving any received parameters
>>>>>>unchanged in registers and on stack?
>>>>>>
>>>>>>Thanks,
>>>>>>-- James Williams
>>>>>>
>>>>>>Background:
>>>>>>
>>>>>>I'm looking for some advice on implementing thunks required by my language's
>>>>>>interface call mechanism. This is a fairly conventional arrangement where method
>>>>>>selectors in interfaces are hashed to determine their index within a vtable and
>>>>>>hash collisions are disambiguated at runtime by a thunk, which determines which
>>>>>>method to call from a selector id passed as the first method parameter.
>>>>>>
>>>>>>I'm currently using a single thunk (written in assembly) for all collisions that
>>>>>>walks a table to determine what method to call. This works but it's inefficient
>>>>>>and requires the a hand written thunk for each supported target.
>>>>>>
>>>>>>I'd like to instead generate IR for a specific thunk for each vtable collisoin
>>>>>>that does a binary search of possible selectors because this will avoid some
>>>>>>pointer dereferences and an additional indirect call.
>>>>>>
>>>>>>The problem is that a thunk may need to decide between methods with different
>>>>>>signatures without disturbing parameters in registers and on the stack and then
>>>>>>jump to, rather than call, another function:
>>>>>>
>>>>>>interface X:
>>>>>> method A(a, b)
>>>>>>
>>>>>>interface Y:
>>>>>> method B(c, d, e)
>>>>>>
>>>>>>class Z implements X, y:
>>>>>> method A(a, b) ...
>>>>>> method B(c, d, e) ...
>>>>>>
>>>>>>X.A + Y.B happen to hash to same vtable index, say -3
>>>>>>
>>>>>>This would require a thunk something like:
>>>>>>
>>>>>>vtable[-3] =
>>>>>> thunk_Z_AorB(selector_id, ...)
>>>>>> // binary search for matching selector id:
>>>>>> if selector_id <= selector_Z_A then
>>>>>> Z.A(selector_id, ...)
>>>>>> else
>>>>>> Z.B(selector_id, ...)
>>>>>> fi
>>>>>>
>>>>>>which would ideally would compile on x64 to something like:
>>>>>>
>>>>>>thunk_Z_AorB:
>>>>>> cmp $selector_Z_A, %rdi
>>>>>> jle Z.A
>>>>>> jmp Z.B
>>>>>>
>>>>>>
>>>>>>
>>>>>>_______________________________________________
>>>>>>LLVM Developers mailing list
>>>>>>LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>>>>>http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110131/9e150722/attachment.html>
More information about the llvm-dev
mailing list