[LLVMdev] JIT allocates global data in function body memory
dalej at apple.com
Mon Jun 29 17:50:18 PDT 2009
On Jun 29, 2009, at 5:41 PMPDT, Reid Kleckner wrote:
> So I (think I) found a bug in the JIT:
> Basically, globals used by a function are allocated in the same buffer
> as the first code that uses it. However, when you free the machine
> code, you also free the memory holding the global's data. The address
> is still in the GlobalValue map, so any other code using that global
> will access freed memory, which will cause problems as soon as you
> reallocate that memory for something else.
> I tracked down the commit that introduced the bug:
> It very nicely explains what it does, but not why it does it, which
> I'd like to know before I change it. I couldn't find the author
> (johannes) on IRC so ssen told me to ask LLVMdev about this behavior.
That's me (and I'm not on IRC because I like messages to be
archived). The reason everything needs to go in the same buffer is
that we're JITting code on one machine, then sending it to another to
be executed, and references from one buffer to another won't work in
that environment. So that model needs to continue to work. If you
want to generalize it so other models work as well, go ahead.
> There's even a patch to work around this behavior on Apple ARM
> So what should the right long-term behavior be? It makes sense to me
> to use the JITMemoryManager for this so that clients of the JIT can
> customize allocation instead of using malloc or new char. On the
> other hand, that complicates the API and requires a homegrown malloc
> implementation in the DefaultMemoryManager.
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
More information about the llvm-dev