diff options
author | Owen Anderson <resistor@mac.com> | 2009-07-16 22:11:26 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-07-16 22:11:26 +0000 |
commit | aad3fb7362aff151e97ad457005ea3f2872fe868 (patch) | |
tree | 78ad3b3efe4d503fc275adfe42a0102d52a78587 /lib | |
parent | 24cd3c4711333ca1e07cbdb34475bccfeb762bb6 (diff) |
Privatize the MDString uniquing table.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76113 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/Constants.cpp | 27 | ||||
-rw-r--r-- | lib/VMCore/LLVMContext.cpp | 8 | ||||
-rw-r--r-- | lib/VMCore/LLVMContextImpl.cpp | 21 | ||||
-rw-r--r-- | lib/VMCore/LLVMContextImpl.h | 9 |
4 files changed, 36 insertions, 29 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 6092eb150a..cf01a9feef 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -1435,33 +1435,8 @@ MDString::MDString(const char *begin, const char *end) : Constant(Type::MetadataTy, MDStringVal, 0, 0), StrBegin(begin), StrEnd(end) {} -static ManagedStatic<StringMap<MDString*> > MDStringCache; - -MDString *MDString::get(const char *StrBegin, const char *StrEnd) { - sys::SmartScopedWriter<true> Writer(*ConstantsLock); - StringMapEntry<MDString *> &Entry = MDStringCache->GetOrCreateValue( - StrBegin, StrEnd); - MDString *&S = Entry.getValue(); - if (!S) S = new MDString(Entry.getKeyData(), - Entry.getKeyData() + Entry.getKeyLength()); - - return S; -} - -MDString *MDString::get(const std::string &Str) { - sys::SmartScopedWriter<true> Writer(*ConstantsLock); - StringMapEntry<MDString *> &Entry = MDStringCache->GetOrCreateValue( - Str.data(), Str.data() + Str.size()); - MDString *&S = Entry.getValue(); - if (!S) S = new MDString(Entry.getKeyData(), - Entry.getKeyData() + Entry.getKeyLength()); - - return S; -} - void MDString::destroyConstant() { - sys::SmartScopedWriter<true> Writer(*ConstantsLock); - MDStringCache->erase(MDStringCache->find(StrBegin, StrEnd)); + getType()->getContext().erase(this); destroyConstantImpl(); } diff --git a/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp index c869ab013e..7bce6f55da 100644 --- a/lib/VMCore/LLVMContext.cpp +++ b/lib/VMCore/LLVMContext.cpp @@ -548,11 +548,11 @@ MDNode* LLVMContext::getMDNode(Value* const* Vals, unsigned NumVals) { // MDString accessors MDString* LLVMContext::getMDString(const char *StrBegin, const char *StrEnd) { - return MDString::get(StrBegin, StrEnd); + return pImpl->getMDString(StrBegin, StrEnd); } MDString* LLVMContext::getMDString(const std::string &Str) { - return MDString::get(Str); + return getMDString(Str.data(), Str.data()+Str.size()); } // FunctionType accessors @@ -637,3 +637,7 @@ const Type* LLVMContext::makeCmpResultType(const Type* opnd_type) { } return Type::Int1Ty; } + +void LLVMContext::erase(MDString *M) { + pImpl->erase(M); +}
\ No newline at end of file diff --git a/lib/VMCore/LLVMContextImpl.cpp b/lib/VMCore/LLVMContextImpl.cpp index 4c6319ea92..93b9e7d3a5 100644 --- a/lib/VMCore/LLVMContextImpl.cpp +++ b/lib/VMCore/LLVMContextImpl.cpp @@ -78,4 +78,23 @@ ConstantFP *LLVMContextImpl::getConstantFP(const APFloat &V) { } return Slot; -}
\ No newline at end of file +} + +MDString *LLVMContextImpl::getMDString(const char *StrBegin, + const char *StrEnd) { + sys::SmartScopedWriter<true> Writer(ConstantsLock); + StringMapEntry<MDString *> &Entry = MDStringCache.GetOrCreateValue( + StrBegin, StrEnd); + MDString *&S = Entry.getValue(); + if (!S) S = new MDString(Entry.getKeyData(), + Entry.getKeyData() + Entry.getKeyLength()); + + return S; +} + +// *** erase methods *** + +void LLVMContextImpl::erase(MDString *M) { + sys::SmartScopedWriter<true> Writer(ConstantsLock); + MDStringCache.erase(MDStringCache.find(M->StrBegin, M->StrEnd)); +} diff --git a/lib/VMCore/LLVMContextImpl.h b/lib/VMCore/LLVMContextImpl.h index 27bd451339..3a5f7c17a4 100644 --- a/lib/VMCore/LLVMContextImpl.h +++ b/lib/VMCore/LLVMContextImpl.h @@ -19,11 +19,13 @@ #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/StringMap.h" namespace llvm { class ConstantInt; class ConstantFP; +class MDString; class LLVMContext; class Type; @@ -90,6 +92,8 @@ class LLVMContextImpl { DenseMapAPFloatKeyInfo> FPMapTy; FPMapTy FPConstants; + StringMap<MDString*> MDStringCache; + LLVMContext &Context; LLVMContextImpl(); LLVMContextImpl(const LLVMContextImpl&); @@ -101,6 +105,11 @@ public: ConstantInt *getConstantInt(const APInt &V); ConstantFP *getConstantFP(const APFloat &V); + + MDString *getMDString(const char *StrBegin, const char *StrEnd); + + + void erase(MDString *M); }; } |