[LLVMdev] code generation for calls in JITted code after r88984

Reid Kleckner rnk at mit.edu
Tue Dec 15 10:34:06 PST 2009


On Tue, Dec 15, 2009 at 4:05 AM, Zoltan Varga <vargaz at gmail.com> wrote:
> Hi,
>
> After this commit:
> http://llvm.org/viewvc/llvm-project?view=rev&revision=88984
>
> the X86 JIT no longer emits calls using call <ADDR>, but always uses mov
> REG, <ADDR>, call *REG. This causes problems for the usage of LLVM in JITs
> since the JIT can no longer patch the callsite after the callee have been
> compiled. According to the comments for the commit, this was done to fix the
> large code model on amd64, but this affects JITs which can guarantee that
> both the caller and callee have 32 bit addresses, since the code model is
> set uncoditionally to Large, even if another code model was passed to
> createJIT ():
>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.cpp?r1=86251&r2=88984&pathrev=88984
>
> Would it be possible to fix this or make it configurable ?

Jeffrey can speak more to this, but this was done specifically to fix
the JIT on x86_64, because we have no way of ensuring that we can
allocate all the memory for code within one 32-bit swath of the
virtual address space.  How are you making this guarantee in your JIT?

How does this break patching the stub?  Is <ADDR> the stub address or
the code address?  If it's the stub address, you should be able to
patch the stub.

I agree we shouldn't use the far call sequence on vanilla x86, since
all possible addresses can be represented as immediates.

Reid



More information about the llvm-dev mailing list