aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-07-16 22:11:26 +0000
committerOwen Anderson <resistor@mac.com>2009-07-16 22:11:26 +0000
commitaad3fb7362aff151e97ad457005ea3f2872fe868 (patch)
tree78ad3b3efe4d503fc275adfe42a0102d52a78587 /lib
parent24cd3c4711333ca1e07cbdb34475bccfeb762bb6 (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.cpp27
-rw-r--r--lib/VMCore/LLVMContext.cpp8
-rw-r--r--lib/VMCore/LLVMContextImpl.cpp21
-rw-r--r--lib/VMCore/LLVMContextImpl.h9
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);
};
}