diff options
author | Chris Lattner <sabre@nondot.org> | 2012-01-23 08:42:38 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-01-23 08:42:38 +0000 |
commit | 2a82d82936729b02fe1bbdcbfe764a61b8999be1 (patch) | |
tree | 747863478da8a0d7e7987f58bfa2876c2e5cd0cb /lib/VMCore | |
parent | cef39256986150d6e7d6d87ea36077452f045c50 (diff) | |
download | external_llvm-2a82d82936729b02fe1bbdcbfe764a61b8999be1.zip external_llvm-2a82d82936729b02fe1bbdcbfe764a61b8999be1.tar.gz external_llvm-2a82d82936729b02fe1bbdcbfe764a61b8999be1.tar.bz2 |
Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.
Now that the type system rewrite has landed, there is no need for its
complexity and std::map'ness.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148691 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Constants.cpp | 23 | ||||
-rw-r--r-- | lib/VMCore/ConstantsContext.h | 15 | ||||
-rw-r--r-- | lib/VMCore/LLVMContextImpl.cpp | 2 | ||||
-rw-r--r-- | lib/VMCore/LLVMContextImpl.h | 4 |
4 files changed, 23 insertions, 21 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 9657cd2..d04298f 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -993,18 +993,33 @@ bool ConstantFP::isValueValidForType(Type *Ty, const APFloat& Val) { //===----------------------------------------------------------------------===// // Factory Function Implementation -ConstantAggregateZero* ConstantAggregateZero::get(Type* Ty) { +ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) { assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) && "Cannot create an aggregate zero of non-aggregate type!"); - LLVMContextImpl *pImpl = Ty->getContext().pImpl; - return pImpl->AggZeroConstants.getOrCreate(Ty, 0); + OwningPtr<ConstantAggregateZero> &Entry = + Ty->getContext().pImpl->CAZConstants[Ty]; + if (Entry == 0) + Entry.reset(new ConstantAggregateZero(Ty)); + + return Entry.get(); } /// destroyConstant - Remove the constant from the constant table... /// void ConstantAggregateZero::destroyConstant() { - getType()->getContext().pImpl->AggZeroConstants.remove(this); + // Drop ownership of the CAZ object before removing the entry so that it + // doesn't get double deleted. + LLVMContextImpl::CAZMapTy &CAZConstants = getContext().pImpl->CAZConstants; + LLVMContextImpl::CAZMapTy::iterator I = CAZConstants.find(getType()); + assert(I != CAZConstants.end() && "CAZ object not in uniquing map"); + I->second.take(); + + // Actually remove the entry from the DenseMap now, which won't free the + // constant. + CAZConstants.erase(I); + + // Free the constant and any dangling references to it. destroyConstantImpl(); } diff --git a/lib/VMCore/ConstantsContext.h b/lib/VMCore/ConstantsContext.h index 4ee4296..fec2be5 100644 --- a/lib/VMCore/ConstantsContext.h +++ b/lib/VMCore/ConstantsContext.h @@ -477,13 +477,6 @@ struct ConstantKeyData<ConstantExpr> { } }; -// ConstantAggregateZero does not take extra "value" argument... -template<class ValType> -struct ConstantCreator<ConstantAggregateZero, Type, ValType> { - static ConstantAggregateZero *create(Type *Ty, const ValType &V){ - return new ConstantAggregateZero(Ty); - } -}; template<> struct ConstantKeyData<ConstantVector> { @@ -498,14 +491,6 @@ struct ConstantKeyData<ConstantVector> { }; template<> -struct ConstantKeyData<ConstantAggregateZero> { - typedef char ValType; - static ValType getValType(ConstantAggregateZero *C) { - return 0; - } -}; - -template<> struct ConstantKeyData<ConstantArray> { typedef std::vector<Constant*> ValType; static ValType getValType(ConstantArray *CA) { diff --git a/lib/VMCore/LLVMContextImpl.cpp b/lib/VMCore/LLVMContextImpl.cpp index b0dd680..7ab3cce 100644 --- a/lib/VMCore/LLVMContextImpl.cpp +++ b/lib/VMCore/LLVMContextImpl.cpp @@ -70,7 +70,7 @@ LLVMContextImpl::~LLVMContextImpl() { ArrayConstants.freeConstants(); StructConstants.freeConstants(); VectorConstants.freeConstants(); - AggZeroConstants.freeConstants(); + CAZConstants.clear(); NullPtrConstants.freeConstants(); UndefValueConstants.freeConstants(); InlineAsms.freeConstants(); diff --git a/lib/VMCore/LLVMContextImpl.h b/lib/VMCore/LLVMContextImpl.h index 30f9d46..f963f63 100644 --- a/lib/VMCore/LLVMContextImpl.h +++ b/lib/VMCore/LLVMContextImpl.h @@ -27,6 +27,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/FoldingSet.h" +#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/StringMap.h" #include <vector> @@ -138,7 +139,8 @@ public: // on Context destruction. SmallPtrSet<MDNode*, 1> NonUniquedMDNodes; - ConstantUniqueMap<char, char, Type, ConstantAggregateZero> AggZeroConstants; + typedef DenseMap<Type*, OwningPtr<ConstantAggregateZero> > CAZMapTy; + CAZMapTy CAZConstants; typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>, ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy; |