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

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

index 75789182f6db1feeddb9e825657ef2eefffc394d..d4cd891d8a9f802c7848b48d8446d4b4783ea887 100644 (file)
@@ -271,6 +271,7 @@ public:
   
   // Methods for erasing constants
   void erase(MDString *M);
+  void erase(MDNode *M);
 };
 
 /// FOR BACKWARDS COMPATIBILITY - Returns a global context.
index 6c8f7550a60a6c19732b0a7ff5edd716dbca96e3..e3944365ee465e8e568c756d120f4042c808a72c 100644 (file)
@@ -46,6 +46,8 @@ namespace llvm {
 class MDNode : public Constant, public FoldingSetNode {
   MDNode(const MDNode &);      // DO NOT IMPLEMENT
 
+  friend class LLVMContextImpl;
+
   friend class ElementVH;
   struct ElementVH : public CallbackVH {
     MDNode *OwningNode;
@@ -72,15 +74,12 @@ class MDNode : public Constant, public FoldingSetNode {
 
   SmallVector<ElementVH, 4> Node;
   typedef SmallVectorImpl<ElementVH>::iterator elem_iterator;
+
 protected:
   explicit MDNode(Value*const* Vals, unsigned NumVals);
 public:
   typedef SmallVectorImpl<ElementVH>::const_iterator const_elem_iterator;
 
-  /// get() - Static factory methods - Return objects of the specified value.
-  ///
-  static MDNode *get(Value*const* Vals, unsigned NumVals);
-
   Value *getElement(unsigned i) const {
     return Node[i];
   }
index cf01a9feef89eabd623d5fcb368ebfd0786e17a0..7631e3cdb2d2fa77a6b6aaa983696da6bccc5bac 100644 (file)
@@ -1443,8 +1443,6 @@ void MDString::destroyConstant() {
 //---- MDNode::get() implementation
 //
 
-static ManagedStatic<FoldingSet<MDNode> > MDNodeSet;
-
 MDNode::MDNode(Value*const* Vals, unsigned NumVals)
   : Constant(Type::MetadataTy, MDNodeVal, 0, 0) {
   for (unsigned i = 0; i != NumVals; ++i)
@@ -1456,32 +1454,8 @@ void MDNode::Profile(FoldingSetNodeID &ID) const {
     ID.AddPointer(*I);
 }
 
-MDNode *MDNode::get(Value*const* Vals, unsigned NumVals) {
-  FoldingSetNodeID ID;
-  for (unsigned i = 0; i != NumVals; ++i)
-    ID.AddPointer(Vals[i]);
-
-  ConstantsLock->reader_acquire();
-  void *InsertPoint;
-  MDNode *N = MDNodeSet->FindNodeOrInsertPos(ID, InsertPoint);
-  ConstantsLock->reader_release();
-  
-  if (!N) {
-    sys::SmartScopedWriter<true> Writer(*ConstantsLock);
-    N = MDNodeSet->FindNodeOrInsertPos(ID, InsertPoint);
-    if (!N) {
-      // InsertPoint will have been set by the FindNodeOrInsertPos call.
-      N = new(0) MDNode(Vals, NumVals);
-      MDNodeSet->InsertNode(N, InsertPoint);
-    }
-  }
-  return N;
-}
-
 void MDNode::destroyConstant() {
-  sys::SmartScopedWriter<true> Writer(*ConstantsLock); 
-  MDNodeSet->RemoveNode(this);
-  
+  getType()->getContext().erase(this);
   destroyConstantImpl();
 }
 
@@ -2519,7 +2493,8 @@ void MDNode::replaceElement(Value *From, Value *To) {
     Values.push_back(Val);
   }
 
-  MDNode *Replacement = MDNode::get(&Values[0], Values.size());
+  MDNode *Replacement =
+    getType()->getContext().getMDNode(&Values[0], Values.size());
   assert(Replacement != this && "I didn't contain From!");
 
   uncheckedReplaceAllUsesWith(Replacement);
index 7bce6f55da7d846c9a19eb30bf2bc24679f4e198..f7f8addbe80f3c1aa3b80c3758b2cea4ef05362a 100644 (file)
@@ -543,7 +543,7 @@ Constant* LLVMContext::getConstantVector(Constant* const* Vals,
 
 // MDNode accessors
 MDNode* LLVMContext::getMDNode(Value* const* Vals, unsigned NumVals) {
-  return MDNode::get(Vals, NumVals);
+  return pImpl->getMDNode(Vals, NumVals);
 }
 
 // MDString accessors
@@ -640,4 +640,8 @@ const Type* LLVMContext::makeCmpResultType(const Type* opnd_type) {
 
 void LLVMContext::erase(MDString *M) {
   pImpl->erase(M);
+}
+
+void LLVMContext::erase(MDNode *M) {
+  pImpl->erase(M);
 }
\ No newline at end of file
index 93b9e7d3a53d141ce6cccee6c39f47c697c93238..f34aba773c3716f47b9cdb75a22ae999cc50853d 100644 (file)
@@ -16,6 +16,7 @@
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/LLVMContext.h"
+#include "llvm/MDNode.h"
 using namespace llvm;
 
 // Get a ConstantInt from an APInt. Note that the value stored in the DenseMap 
@@ -92,9 +93,38 @@ MDString *LLVMContextImpl::getMDString(const char *StrBegin,
   return S;
 }
 
+MDNode *LLVMContextImpl::getMDNode(Value*const* Vals, unsigned NumVals) {
+  FoldingSetNodeID ID;
+  for (unsigned i = 0; i != NumVals; ++i)
+    ID.AddPointer(Vals[i]);
+
+  ConstantsLock.reader_acquire();
+  void *InsertPoint;
+  MDNode *N = MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
+  ConstantsLock.reader_release();
+  
+  if (!N) {
+    sys::SmartScopedWriter<true> Writer(ConstantsLock);
+    N = MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
+    if (!N) {
+      // InsertPoint will have been set by the FindNodeOrInsertPos call.
+      N = new(0) MDNode(Vals, NumVals);
+      MDNodeSet.InsertNode(N, InsertPoint);
+    }
+  }
+
+  return N;
+}
+
+
 // *** erase methods ***
 
 void LLVMContextImpl::erase(MDString *M) {
   sys::SmartScopedWriter<true> Writer(ConstantsLock);
   MDStringCache.erase(MDStringCache.find(M->StrBegin, M->StrEnd));
 }
+
+void LLVMContextImpl::erase(MDNode *M) {
+  sys::SmartScopedWriter<true> Writer(ConstantsLock);
+  MDNodeSet.RemoveNode(M);
+}
index 3a5f7c17a44ef9637682823fbc8f947b09c77209..129a759cd99f12e8ce6e15197eac035910114b3f 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/ADT/APFloat.h"
 #include "llvm/ADT/APInt.h"
 #include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/FoldingSet.h"
 #include "llvm/ADT/StringMap.h"
 
 namespace llvm {
@@ -26,8 +27,10 @@ namespace llvm {
 class ConstantInt;
 class ConstantFP;
 class MDString;
+class MDNode;
 class LLVMContext;
 class Type;
+class Value;
 
 struct DenseMapAPIntKeyInfo {
   struct KeyTy {
@@ -94,6 +97,8 @@ class LLVMContextImpl {
   
   StringMap<MDString*> MDStringCache;
   
+  FoldingSet<MDNode> MDNodeSet;
+  
   LLVMContext &Context;
   LLVMContextImpl();
   LLVMContextImpl(const LLVMContextImpl&);
@@ -108,8 +113,10 @@ public:
   
   MDString *getMDString(const char *StrBegin, const char *StrEnd);
   
+  MDNode *getMDNode(Value*const* Vals, unsigned NumVals);
   
   void erase(MDString *M);
+  void erase(MDNode *M);
 };
 
 }