[LLVMdev] code generation for calls in JITted code after r88984
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:
> After this commit:
> 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 ():
> 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.
More information about the llvm-dev