Privatize the MDString uniquing table.
authorOwen Anderson <resistor@mac.com>
Thu, 16 Jul 2009 22:11:26 +0000 (22:11 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 16 Jul 2009 22:11:26 +0000 (22:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76113 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Constant.h
include/llvm/Constants.h
include/llvm/LLVMContext.h
lib/VMCore/Constants.cpp
lib/VMCore/LLVMContext.cpp
lib/VMCore/LLVMContextImpl.cpp
lib/VMCore/LLVMContextImpl.h

index 3dc5881bdf4bf4f37fc9c4a8f0afc34448e0278f..62b75a77fb395a41ead25232165169282cbcde8d 100644 (file)
@@ -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) {}
index 199355baf413cf1ea2c1310348a61d4bd8579fff..487dd6732afb69a2e28b17138e8e616507b52b8d 100644 (file)
@@ -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; }
index 4aa2c20ec2883f7055d06e6dfddb332c4a770c85..75789182f6db1feeddb9e825657ef2eefffc394d 100644 (file)
@@ -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.
index 6092eb150ae2086cc0dcceef8731e5c69bb2a6b6..cf01a9feef89eabd623d5fcb368ebfd0786e17a0 100644 (file)
@@ -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();
 }
 
index c869ab013e2c28bcd1c10b2711bc2d4878704efb..7bce6f55da7d846c9a19eb30bf2bc24679f4e198 100644 (file)
@@ -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
index 4c6319ea92ccc64732baf1ec8595a5bbf0c7040b..93b9e7d3a53d141ce6cccee6c39f47c697c93238 100644 (file)
@@ -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));
+}
index 27bd45133937d7913b93c37f3e4f4501135793bc..3a5f7c17a44ef9637682823fbc8f947b09c77209 100644 (file)
 #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);
 };
 
 }