[LLVMdev] Should LLVM JIT default to lazy or non-lazy?
Török Edwin
edwintorok at gmail.com
Sun Nov 1 01:53:51 PST 2009
On 2009-11-01 08:40, Jeffrey Yasskin wrote:
> 2009/10/30 Török Edwin <edwintorok at gmail.com>:
>
>> On 2009-10-29 23:55, Jeffrey Yasskin wrote:
>>
>>> On Thu, Oct 29, 2009 at 2:30 PM, Nicolas Geoffray
>>> <nicolas.geoffray at lip6.fr> wrote:
>>>
>>>
>>>> Hi Jeffrey,
>>>>
>>>> Jeffrey Yasskin wrote:
>>>>
>>>>
>>>>> Cool, I'll start implementing it.
>>>>>
>>>>>
>>>>>
>>>> Great! Thanks.
>>>>
>>>> Just to clarify things: on my end, it doesn't really matter what is the
>>>> default behavior, as long as vmkit can continue to have the existing
>>>> behavior of lazy compilation. With Chris' solution, I was wondering how you
>>>> would implement the getPointerToFunction{Eager, Lazy} functions when the
>>>> getPointerToFunction is called by the JIT, not the user. For example, when
>>>> Function F calls Function G and the JIT needs an address for G (either a
>>>> callback or the function address), how will it know if it must call
>>>> getPointerToFunctionEager or getPointerToFunctionLazy? Do you plan on
>>>> continuing having a flag that enables/disables lazy compilation and poll
>>>> this flag on each function call? How is that different than the existing
>>>> system?
>>>>
>>>>
>>> Semantically, I'll thread the flag through all the calls that may
>>> eventually need to recursively call getPointerToFunction. To implement
>>> that without having to modify lots of calls, I'll probably replace the
>>> current public default eager/lazy setting with a private flag with
>>> values {Unknown, Lazy, Eager}, set it on entry and exit of
>>> getPointerToFunction, and check it on each internal recursive call.
>>> The difference with the current system is that the user is forced to
>>> set the flag to their desired value whenever they call into the JIT,
>>> rather than relying on a default. That choice then propagates through
>>> the whole recursive tree of codegens, without affecting the next tree.
>>>
>>> Note that I'm using getPointerToFunction as an abbreviation for the
>>> 3ish public functions that'll need to take this option.
>>>
>> The documentation should also be updated
>> (http://llvm.org/docs/ProgrammersManual.html#threading) to reflect what
>> one needs to do,
>> to ensure thread-safe JITing.
>>
>
> Thanks for that reminder. I've updated it in the patch I'm about to
> mail, but I should apply the update regardless of whether the rest of
> the patch goes in.
>
>
>> Also does every JIT target support non-lazy JITing now? See PR4816,
>> last time I checked (r83242) it only worked on X86, and failed on PPC;
>> so I had to keep lazy JITing enabled even if its not what I want for
>> many reasons.
>>
>
> It's still the case that only X86 supports eager jitting. It doesn't
> look that hard to add it to the rest of the targets though.
>
>
Ok.
>> Also perhaps the lazy compilation stub should spin waiting on a lock
>> (implemented using atomics), and the compilation callback should
>> execute while holding the lock just before patching the callsite, so it
>> would look like this in pseudocode:
>>
>
> Good idea. This increases the code size a bit, but it's clearly better
> than the "load the target address" option I mentioned in the bug.
> Would you add it to the bug so we don't lose it?
>
> I think we can put the entire "not yet patched" branch inside the
> compilation callback to minimize the code size impact:
>
> callsite_patch_state = 0;// for each callsite one byte of memory
>
> callsite:
> if (atomic_load(&callsite_patch_state) != 2) {
> call CompilationCallback // Doesn't return until the patchsite is patched.
> }
> //fast- and slow-path: already compiled and patched
> patchsite:
> call <nop nop nop nop nop nop nop nop> // will be patched
>
>
Yes, that sounds good (except that we'd want a jmp instead of a call I
think), I'll post a patch to that bugreport tomorrow if time permits.
Would this mean that lazy-JITing would be threadsafe and the default
could stay lazy?
Best regards,
--Edwin
More information about the llvm-dev
mailing list