From ce032b483ca96093b84f69178cdb2d047e124332 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Thu, 16 Jul 2009 23:44:30 +0000 Subject: [PATCH] Privatize the MDNode uniquing table. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76126 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/LLVMContext.h | 1 + include/llvm/MDNode.h | 7 +++---- lib/VMCore/Constants.cpp | 31 +++---------------------------- lib/VMCore/LLVMContext.cpp | 6 +++++- lib/VMCore/LLVMContextImpl.cpp | 30 ++++++++++++++++++++++++++++++ lib/VMCore/LLVMContextImpl.h | 7 +++++++ 6 files changed, 49 insertions(+), 33 deletions(-) diff --git a/include/llvm/LLVMContext.h b/include/llvm/LLVMContext.h index 75789182f6d..d4cd891d8a9 100644 --- a/include/llvm/LLVMContext.h +++ b/include/llvm/LLVMContext.h @@ -271,6 +271,7 @@ public: // Methods for erasing constants void erase(MDString *M); + void erase(MDNode *M); }; /// FOR BACKWARDS COMPATIBILITY - Returns a global context. diff --git a/include/llvm/MDNode.h b/include/llvm/MDNode.h index 6c8f7550a60..e3944365ee4 100644 --- a/include/llvm/MDNode.h +++ b/include/llvm/MDNode.h @@ -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 Node; typedef SmallVectorImpl::iterator elem_iterator; + protected: explicit MDNode(Value*const* Vals, unsigned NumVals); public: typedef SmallVectorImpl::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]; } diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index cf01a9feef8..7631e3cdb2d 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -1443,8 +1443,6 @@ void MDString::destroyConstant() { //---- MDNode::get() implementation // -static ManagedStatic > 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 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 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); diff --git a/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp index 7bce6f55da7..f7f8addbe80 100644 --- a/lib/VMCore/LLVMContext.cpp +++ b/lib/VMCore/LLVMContext.cpp @@ -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 diff --git a/lib/VMCore/LLVMContextImpl.cpp b/lib/VMCore/LLVMContextImpl.cpp index 93b9e7d3a53..f34aba773c3 100644 --- a/lib/VMCore/LLVMContextImpl.cpp +++ b/lib/VMCore/LLVMContextImpl.cpp @@ -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 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 Writer(ConstantsLock); MDStringCache.erase(MDStringCache.find(M->StrBegin, M->StrEnd)); } + +void LLVMContextImpl::erase(MDNode *M) { + sys::SmartScopedWriter Writer(ConstantsLock); + MDNodeSet.RemoveNode(M); +} diff --git a/lib/VMCore/LLVMContextImpl.h b/lib/VMCore/LLVMContextImpl.h index 3a5f7c17a44..129a759cd99 100644 --- a/lib/VMCore/LLVMContextImpl.h +++ b/lib/VMCore/LLVMContextImpl.h @@ -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 MDStringCache; + FoldingSet 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); }; }