[llvm-commits] CVS: llvm/include/llvm/ExecutionEngine/ExecutionEngine.h

Reid Spencer reid at x10sys.com
Tue Jul 12 08:52:08 PDT 2005



Changes in directory llvm/include/llvm/ExecutionEngine:

ExecutionEngine.h updated: 1.32 -> 1.33
---
Log message:

For PR540: http://llvm.cs.uiuc.edu/PR540 :
This patch completes the changes for making lli thread-safe. Here's the list
of changes:
* The Support/ThreadSupport* files were removed and replaced with the 
  MutexGuard.h file since all ThreadSupport* declared was a Mutex Guard.
  The implementation of MutexGuard.h is now based on sys::Mutex which hides
  its implementation and makes it unnecessary to have the -NoSupport.h and
  -PThreads.h versions of ThreadSupport.

* All places in ExecutionEngine that previously referred to "Mutex" now 
  refer to sys::Mutex

* All places in ExecutionEngine that previously referred to "MutexLocker"
  now refer to MutexGuard (this is frivolous but I believe the technically
  correct name for such a class is "Guard" not a "Locker"). 

These changes passed all of llvm-test. All we need now are some test cases
that actually use multiple threads.



---
Diffs of the changes:  (+45 -15)

 ExecutionEngine.h |   60 ++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 45 insertions(+), 15 deletions(-)


Index: llvm/include/llvm/ExecutionEngine/ExecutionEngine.h
diff -u llvm/include/llvm/ExecutionEngine/ExecutionEngine.h:1.32 llvm/include/llvm/ExecutionEngine/ExecutionEngine.h:1.33
--- llvm/include/llvm/ExecutionEngine/ExecutionEngine.h:1.32	Thu Apr 21 15:39:54 2005
+++ llvm/include/llvm/ExecutionEngine/ExecutionEngine.h	Tue Jul 12 10:51:55 2005
@@ -19,6 +19,7 @@
 #include <map>
 #include <cassert>
 #include <string>
+#include "llvm/Support/MutexGuard.h"
 
 namespace llvm {
 
@@ -33,10 +34,9 @@
 class Type;
 class IntrinsicLowering;
 
-class ExecutionEngine {
-  Module &CurMod;
-  const TargetData *TD;
 
+class ExecutionEngineState {
+private:
   /// GlobalAddressMap - A mapping between LLVM global values and their
   /// actualized version...
   std::map<const GlobalValue*, void *> GlobalAddressMap;
@@ -46,6 +46,24 @@
   /// at the address.  This map is not computed unless getGlobalValueAtAddress
   /// is called at some point.
   std::map<void *, const GlobalValue*> GlobalAddressReverseMap;
+
+public:
+  std::map<const GlobalValue*, void *>& getGlobalAddressMap(const MutexGuard& locked) {
+    return GlobalAddressMap;
+  }
+
+  std::map<void *, const GlobalValue*>& getGlobalAddressReverseMap(const MutexGuard& locked) {
+    return GlobalAddressReverseMap;
+  }
+};
+
+
+class ExecutionEngine {
+  Module &CurMod;
+  const TargetData *TD;
+
+  ExecutionEngineState state;
+
 protected:
   ModuleProvider *MP;
 
@@ -54,6 +72,10 @@
   }
 
 public:
+  /// lock - This lock is protects the ExecutionEngine, JIT, JITResolver and JITEmitter classes.
+  /// It must be held while changing the internal state of any of those classes.
+  sys::Mutex lock; // Used to make this class and subclasses thread-safe
+
   ExecutionEngine(ModuleProvider *P);
   ExecutionEngine(Module *M);
   virtual ~ExecutionEngine();
@@ -81,13 +103,15 @@
 
 
   void addGlobalMapping(const GlobalValue *GV, void *Addr) {
-    void *&CurVal = GlobalAddressMap[GV];
+    MutexGuard locked(lock);
+
+    void *&CurVal = state.getGlobalAddressMap(locked)[GV];
     assert((CurVal == 0 || Addr == 0) && "GlobalMapping already established!");
     CurVal = Addr;
 
     // If we are using the reverse mapping, add it too
-    if (!GlobalAddressReverseMap.empty()) {
-      const GlobalValue *&V = GlobalAddressReverseMap[Addr];
+    if (!state.getGlobalAddressReverseMap(locked).empty()) {
+      const GlobalValue *&V = state.getGlobalAddressReverseMap(locked)[Addr];
       assert((V == 0 || GV == 0) && "GlobalMapping already established!");
       V = GV;
     }
@@ -96,21 +120,25 @@
   /// clearAllGlobalMappings - Clear all global mappings and start over again
   /// use in dynamic compilation scenarios when you want to move globals
   void clearAllGlobalMappings() {
-    GlobalAddressMap.clear();
-    GlobalAddressReverseMap.clear();
+    MutexGuard locked(lock);
+
+    state.getGlobalAddressMap(locked).clear();
+    state.getGlobalAddressReverseMap(locked).clear();
   }
 
   /// updateGlobalMapping - Replace an existing mapping for GV with a new
   /// address.  This updates both maps as required.
   void updateGlobalMapping(const GlobalValue *GV, void *Addr) {
-    void *&CurVal = GlobalAddressMap[GV];
-    if (CurVal && !GlobalAddressReverseMap.empty())
-      GlobalAddressReverseMap.erase(CurVal);
+    MutexGuard locked(lock);
+
+    void *&CurVal = state.getGlobalAddressMap(locked)[GV];
+    if (CurVal && !state.getGlobalAddressReverseMap(locked).empty())
+      state.getGlobalAddressReverseMap(locked).erase(CurVal);
     CurVal = Addr;
 
     // If we are using the reverse mapping, add it too
-    if (!GlobalAddressReverseMap.empty()) {
-      const GlobalValue *&V = GlobalAddressReverseMap[Addr];
+    if (!state.getGlobalAddressReverseMap(locked).empty()) {
+      const GlobalValue *&V = state.getGlobalAddressReverseMap(locked)[Addr];
       assert((V == 0 || GV == 0) && "GlobalMapping already established!");
       V = GV;
     }
@@ -120,8 +148,10 @@
   /// global value if it is available, otherwise it returns null.
   ///
   void *getPointerToGlobalIfAvailable(const GlobalValue *GV) {
-    std::map<const GlobalValue*, void*>::iterator I = GlobalAddressMap.find(GV);
-    return I != GlobalAddressMap.end() ? I->second : 0;
+    MutexGuard locked(lock);
+
+    std::map<const GlobalValue*, void*>::iterator I = state.getGlobalAddressMap(locked).find(GV);
+    return I != state.getGlobalAddressMap(locked).end() ? I->second : 0;
   }
 
   /// getPointerToGlobal - This returns the address of the specified global






More information about the llvm-commits mailing list