[LLVMdev] bug in the JIT global variable emitter

Evan Cheng evan.cheng at apple.com
Tue Oct 14 23:20:30 PDT 2008


On Oct 14, 2008, at 2:32 PM, Nuno Lopes wrote:

> [resending since the previous copy was apparently dropped by the  
> mailing
> list]
>
>>> Today I found a nice bug in the JIT global variable emitter.
>>> The problem may lead to an assert() failure when doing the  
>>> following:
>>> 1) compile some function
>>> 2) emit a global variable
>>> 3) compile another function. an assert() may trigger in the JIT  
>>> memory
>>> manager
>>>
>>> This happens because the JIT global variable emitter is using the
>>> MachineCodeEmitter::allocate() function, which uses memory allocated
>>> by the
>>> JIT memory manager (which should be used for functions only).
>>
>> No, this was a deliberate change, 54442.  We have a situation where a
>> user
>> wants to emit JIT code on one machine, then send it off to another
>> machine to
>> execute.  Putting statically allocated data in the same buffer as  
>> code
>> is the
>> easiest approach to make this work, although there may be others.
>
> Ok, thanks for the explanation. So my first patch doesn't work.  
> Also, to be
> clear, this bug has nothing to do with overflowing the JIT memory  
> buffer.
> I made another one that takes keeps the allocation of global  
> variables in
> the JIT buffer, but it creates a new mem block if it doesn't exist  
> (i.e.
> when dumping a global variable out of the scope of a function  
> compilation).
> The patch is at:
> http://web.ist.utl.pt/nuno.lopes/llvm_jit_global_emitter2.txt

Sorry, I am still not able to understand the problem. Is there a bug  
in the default memory manager? From your patch it seems like there is  
a real bug. What is the assertion that you ran into?

>
>
> The problem only happens when calling
> ExecutionEngine::getPointerToGlobal(someGV) from some non-llvm  
> program. If
> the function is called when JITing a function, it works, since it  
> will dump
> the global variable to the memory reserved to the function being  
> JITed,
> which raises a question: shouldn't it generate the GV to some non- 
> executable
> memory block?? My patch doesn't attempt to fix this last concern.

There are two ways to go about this. Either we enhance memory manager  
interface to create non-executable memory for GVs etc. Or we keep the  
memory manager simple and let the JIT change the privilege as it sees  
fit. I prefer the later unless there is a good argument for an  
alternative.

Evan

>
>
> Thanks,
> Nuno
>
> P.S.: the control flow of this bug is quite complex, so feel free to  
> ask if
> you don't get what the problem is.
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list