[LLVMdev] Attempt #1: JIT Thread Safety
Evan Jones
ejones at uwaterloo.ca
Sun Feb 20 13:23:28 PST 2005
This is what I was trying to do when I ran into the HowToUseJIT
problem. I've made a first attempt at adding locking to the JIT.
Unfortunately, since I do not really understand the structure of LLVM,
I could have very easily screwed something up. I touched two classes,
the JIT and the ExecutionEngine. I need some help from someone who is
more familiar with the code to make sure that I have protected the
correct data structures. I'm also looking for suggestion about how to
test this for correctness.
To make sure that I added locks where required, I moved "dangerous"
members of the classes into a new class, called JITState and
ExecutionEngineState, respectively. These classes only allow access to
the variables if a lock is held. This allows the compiler to verify
that locks are held in the correct places, although there could still
easily be bugs if the locks are released too early. The data structures
that are protected are:
ExecutionEngine:
std::map<const GlobalValue*, void *> GlobalAddressMap; // R/W data
structure
std::map<void *, const GlobalValue*> GlobalAddressReverseMap; // R/W
data structure
JIT:
std::vector<const GlobalVariable*> PendingGlobals; // R/W data
structure
FunctionPassManager PM; // Could call passes which are not thread safe
Both of these classes have additional members which I have not
protected. It looked to my brief analysis that they were used in a
read-only fashion. Can anyone tell me if I am wrong:
ExecutionEngine:
Module &CurMod;
const TargetData *TD;
JIT:
TargetMachine &TM;
TargetJITInfo &TJI;
MachineCodeEmitter *MCE;
I specifically did not protect the ExecutionEngine::CurMod member
because a reference is returned via ExecutionEngine::getModule(). If
access to it must be serialized, it must be done very carefully. I
tried to make getModule return a constant reference, but that quickly
led me into deep trouble in the world of const correctness.
I've attached my patch against the latest CVS. There is one "trivial"
fix which should be committed, even if this patch is incorrect. In
ThreadSupport.h, the include guard macro needs to have "LLVM_" prefixed
to it. The ThreadSupport-PThread.h and ThreadSupport-NoSupport.h files
look for the macro with this prefix.
Thank you,
Evan Jones
-------------- next part --------------
A non-text attachment was scrubbed...
Name: llvm-threadsafe.patch
Type: application/octet-stream
Size: 13172 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20050220/49516784/attachment.obj>
More information about the llvm-dev
mailing list