Guard mutation of the timing info global.
authorOwen Anderson <resistor@mac.com>
Wed, 17 Jun 2009 21:28:54 +0000 (21:28 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 17 Jun 2009 21:28:54 +0000 (21:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73639 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/PassManager.cpp

index 47999152c1d2336566a4336faa6e2c233c28b527..7cd519483e203e60f9bb4e2717c5412ba0231b14 100644 (file)
@@ -20,6 +20,8 @@
 #include "llvm/Support/Streams.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Threading.h"
+#include "llvm/System/Mutex.h"
 #include "llvm/Analysis/Dominators.h"
 #include "llvm-c/Core.h"
 #include <algorithm>
@@ -355,6 +357,9 @@ namespace {
 /// amount of time each pass takes to execute.  This only happens when
 /// -time-passes is enabled on the command line.
 ///
+
+static ManagedStatic<sys::Mutex> TimingInfoMutex;
+
 class VISIBILITY_HIDDEN TimingInfo {
   std::map<Pass*, Timer> TimingData;
   TimerGroup TG;
@@ -379,18 +384,22 @@ public:
     if (dynamic_cast<PMDataManager *>(P)) 
       return;
 
+    if (llvm_is_multithreaded()) TimingInfoMutex->acquire();
     std::map<Pass*, Timer>::iterator I = TimingData.find(P);
     if (I == TimingData.end())
       I=TimingData.insert(std::make_pair(P, Timer(P->getPassName(), TG))).first;
     I->second.startTimer();
+    if (llvm_is_multithreaded()) TimingInfoMutex->release();
   }
   void passEnded(Pass *P) {
     if (dynamic_cast<PMDataManager *>(P)) 
       return;
 
+    if (llvm_is_multithreaded()) TimingInfoMutex->acquire();
     std::map<Pass*, Timer>::iterator I = TimingData.find(P);
     assert(I != TimingData.end() && "passStarted/passEnded not nested right!");
     I->second.stopTimer();
+    if (llvm_is_multithreaded()) TimingInfoMutex->release();
   }
 };