[LLVMdev] Control Flow and Locks when JITing Functions

Evan Jones ejones at uwaterloo.ca
Thu Apr 21 09:37:07 PDT 2005


On Apr 21, 2005, at 12:12, Chris Lattner wrote:
> Ok.  Thanks, for forgot about that patch :(

No problem, since I still don't know how to integrate it cleanly into 
the build system. Platform dependencies are very annoying.

> I think it would be more straight-forward to have a single lock that 
> the jit resolver can aquire.  Makes sense to me at least

This is actually what I ended up doing. So now, the lock in 
"ExecutionEngine" is public, and everything involved in the JIT locks 
it.

However, it turns out that the issue isn't quite what I thought it was. 
I thought it was a concurrent modification issue, where two threads 
were trying to update the FunctionStubMap at the same time. Well, it 
sort of is, but for a different reason. I'm not sure how I should fix 
this, so suggestions are welcome.

My application is spawning multiple threads that are calling in to the 
same function. They all call the stub, and they all end up calling into 
JITResolve::JITCompilerFn. One of them gets the lock and compiles the 
function. Then, when it releases the lock, another thread tries to 
continue and immediately gets this exception:

lli: JITEmitter.cpp:236: static void* 
<unnamed>::JITResolver::JITCompilerFn(void*): Assertion `I != 
JR.state.getStubToFunctionMap(locked).begin() && "This is not a known 
stub!"' failed.


The problem is that after a function is compiled, the information about 
the Stub -> Function mapping is erased because it is no longer needed. 
The stub has been rewritten to point to the native function. However, 
in this case, these threads have already called the stub. So the fix is 
one of:

A) Hang on to stub -> function mapping indefinitely. (I'm going to try 
and implement this to get my project that is due tomorrow working)
B) Have the threads wait on a condition in that particular spot. When 
another thread finishes rewriting the stub, it wakes the threads up. 
These threads then go and do some low level hack, like calling the stub 
again, and immediately call the compiled function. This is probably a 
better solution, but it certainly is more complex.

Any other ideas?

Evan Jones




More information about the llvm-dev mailing list