From: Owen Anderson Date: Thu, 16 Jul 2009 22:11:26 +0000 (+0000) Subject: Privatize the MDString uniquing table. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=aad3fb7362aff151e97ad457005ea3f2872fe868;p=oota-llvm.git Privatize the MDString uniquing table. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76113 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Constant.h b/include/llvm/Constant.h index 3dc5881bdf4..62b75a77fb3 100644 --- a/include/llvm/Constant.h +++ b/include/llvm/Constant.h @@ -54,6 +54,7 @@ namespace llvm { class Constant : public User { void operator=(const Constant &); // Do not implement Constant(const Constant &); // Do not implement + protected: Constant(const Type *ty, ValueTy vty, Use *Ops, unsigned NumOps) : User(ty, vty, Ops, NumOps) {} diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index 199355baf41..487dd6732af 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -745,17 +745,13 @@ class MDString : public Constant { MDString(const char *begin, const char *end); const char *StrBegin, *StrEnd; + friend class LLVMContextImpl; protected: // allocate space for exactly zero operands void *operator new(size_t s) { return User::operator new(s, 0); } public: - /// get() - Static factory methods - Return objects of the specified value. - /// - static MDString *get(const char *StrBegin, const char *StrEnd); - static MDString *get(const std::string &Str); - /// size() - The length of this string. /// intptr_t size() const { return StrEnd - StrBegin; } diff --git a/include/llvm/LLVMContext.h b/include/llvm/LLVMContext.h index 4aa2c20ec28..75789182f6d 100644 --- a/include/llvm/LLVMContext.h +++ b/include/llvm/LLVMContext.h @@ -268,6 +268,9 @@ public: // Other helpers /// @brief Create a result type for fcmp/icmp const Type* makeCmpResultType(const Type* opnd_type); + + // Methods for erasing constants + void erase(MDString *M); }; /// FOR BACKWARDS COMPATIBILITY - Returns a global context. diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 6092eb150ae..cf01a9feef8 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 > MDStringCache; - -MDString *MDString::get(const char *StrBegin, const char *StrEnd) { - sys::SmartScopedWriter Writer(*ConstantsLock); - StringMapEntry &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 Writer(*ConstantsLock); - StringMapEntry &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 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 c869ab013e2..7bce6f55da7 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 4c6319ea92c..93b9e7d3a53 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 Writer(ConstantsLock); + StringMapEntry &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 Writer(ConstantsLock); + MDStringCache.erase(MDStringCache.find(M->StrBegin, M->StrEnd)); +} diff --git a/lib/VMCore/LLVMContextImpl.h b/lib/VMCore/LLVMContextImpl.h index 27bd4513393..3a5f7c17a44 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 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); }; }