From: Owen Anderson Date: Wed, 17 Jun 2009 22:23:31 +0000 (+0000) Subject: Protect the GC table in Function.cpp X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=b983d67465a939c43173e381f9063d9d9245f45b Protect the GC table in Function.cpp git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73647 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/System/RWMutex.h b/include/llvm/System/RWMutex.h index 6ac7aa3c2bd..8967e9ee6ca 100644 --- a/include/llvm/System/RWMutex.h +++ b/include/llvm/System/RWMutex.h @@ -79,6 +79,20 @@ namespace llvm /// @} }; + /// ScopedReader - RAII acquisition of a writer lock + struct ScopedReader { + RWMutex* mutex; + + explicit ScopedReader(RWMutex* m) { + mutex = m; + mutex->reader_acquire(); + } + + ~ScopedReader() { + mutex->reader_release(); + } + }; + /// ScopedWriter - RAII acquisition of a writer lock struct ScopedWriter { RWMutex* mutex; diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 54bd895fd40..96c67924051 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -16,7 +16,9 @@ #include "llvm/IntrinsicInst.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/Support/LeakDetector.h" +#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/StringPool.h" +#include "llvm/System/RWMutex.h" #include "SymbolTableListTraitsImpl.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringExtras.h" @@ -228,38 +230,42 @@ void Function::removeAttribute(unsigned i, Attributes attr) { // allocating an additional word in Function for programs which do not use GC // (i.e., most programs) at the cost of increased overhead for clients which do // use GC. -static DenseMap *GCNames; -static StringPool *GCNamePool; +static ManagedStatic > GCNames; +static ManagedStatic GCNamePool; +static ManagedStatic GCLock; bool Function::hasGC() const { - return GCNames && GCNames->count(this); + if (llvm_is_multithreaded()) { + sys::ScopedReader Reader(&*GCLock); + return GCNames->count(this); + } else + return GCNames->count(this); } const char *Function::getGC() const { assert(hasGC() && "Function has no collector"); - return *(*GCNames)[this]; + + if (llvm_is_multithreaded()) { + sys::ScopedReader Reader(&*GCLock); + return *(*GCNames)[this]; + } else + return *(*GCNames)[this]; } void Function::setGC(const char *Str) { - if (!GCNamePool) - GCNamePool = new StringPool(); - if (!GCNames) - GCNames = new DenseMap(); - (*GCNames)[this] = GCNamePool->intern(Str); + if (llvm_is_multithreaded()) { + sys::ScopedWriter Writer(&*GCLock); + (*GCNames)[this] = GCNamePool->intern(Str); + } else + (*GCNames)[this] = GCNamePool->intern(Str); } void Function::clearGC() { - if (GCNames) { + if (llvm_is_multithreaded()) { + sys::ScopedWriter Writer(&*GCLock); + GCNames->erase(this); + } else GCNames->erase(this); - if (GCNames->empty()) { - delete GCNames; - GCNames = 0; - if (GCNamePool->empty()) { - delete GCNamePool; - GCNamePool = 0; - } - } - } } /// copyAttributesFrom - copy all additional attributes (those not needed to