[llvm-commits] [llvm] r148698 - in /llvm/trunk/lib/VMCore: Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h

Chris Lattner sabre at nondot.org
Mon Jan 23 07:09:45 PST 2012


Author: lattner
Date: Mon Jan 23 09:09:44 2012
New Revision: 148698

URL: http://llvm.org/viewvc/llvm-project?rev=148698&view=rev
Log:
revert r148691 and 148693

Modified:
    llvm/trunk/lib/VMCore/Constants.cpp
    llvm/trunk/lib/VMCore/ConstantsContext.h
    llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
    llvm/trunk/lib/VMCore/LLVMContextImpl.h

Modified: llvm/trunk/lib/VMCore/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Constants.cpp (original)
+++ llvm/trunk/lib/VMCore/Constants.cpp Mon Jan 23 09:09:44 2012
@@ -993,33 +993,18 @@
 //===----------------------------------------------------------------------===//
 //                      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!");
   
-  OwningPtr<ConstantAggregateZero> &Entry =
-    Ty->getContext().pImpl->CAZConstants[Ty];
-  if (Entry == 0)
-    Entry.reset(new ConstantAggregateZero(Ty));
-  
-  return Entry.get();
+  LLVMContextImpl *pImpl = Ty->getContext().pImpl;
+  return pImpl->AggZeroConstants.getOrCreate(Ty, 0);
 }
 
 /// destroyConstant - Remove the constant from the constant table...
 ///
 void ConstantAggregateZero::destroyConstant() {
-  // 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.
+  getType()->getContext().pImpl->AggZeroConstants.remove(this);
   destroyConstantImpl();
 }
 
@@ -1127,29 +1112,13 @@
 //
 
 ConstantPointerNull *ConstantPointerNull::get(PointerType *Ty) {
-  OwningPtr<ConstantPointerNull> &Entry =
-    Ty->getContext().pImpl->CPNConstants[Ty];
-  if (Entry == 0)
-    Entry.reset(new ConstantPointerNull(Ty));
-  
-  return Entry.get();
+  return Ty->getContext().pImpl->NullPtrConstants.getOrCreate(Ty, 0);
 }
 
 // destroyConstant - Remove the constant from the constant table...
 //
 void ConstantPointerNull::destroyConstant() {
-  // Drop ownership of the CPN object before removing the entry so that it
-  // doesn't get double deleted.
-  LLVMContextImpl::CPNMapTy &CPNConstants = getContext().pImpl->CPNConstants;
-  LLVMContextImpl::CPNMapTy::iterator I = CPNConstants.find(getType());
-  assert(I != CPNConstants.end() && "CPN object not in uniquing map");
-  I->second.take();
-  
-  // Actually remove the entry from the DenseMap now, which won't free the
-  // constant.
-  CPNConstants.erase(I);
-  
-  // Free the constant and any dangling references to it.
+  getType()->getContext().pImpl->NullPtrConstants.remove(this);
   destroyConstantImpl();
 }
 
@@ -1158,28 +1127,13 @@
 //
 
 UndefValue *UndefValue::get(Type *Ty) {
-  OwningPtr<UndefValue> &Entry = Ty->getContext().pImpl->UVConstants[Ty];
-  if (Entry == 0)
-    Entry.reset(new UndefValue(Ty));
-  
-  return Entry.get();
+  return Ty->getContext().pImpl->UndefValueConstants.getOrCreate(Ty, 0);
 }
 
 // destroyConstant - Remove the constant from the constant table.
 //
 void UndefValue::destroyConstant() {
-  // Drop ownership of the object before removing the entry so that it
-  // doesn't get double deleted.
-  LLVMContextImpl::UVMapTy &UVConstants = getContext().pImpl->UVConstants;
-  LLVMContextImpl::UVMapTy::iterator I = UVConstants.find(getType());
-  assert(I != UVConstants.end() && "UV object not in uniquing map");
-  I->second.take();
-  
-  // Actually remove the entry from the DenseMap now, which won't free the
-  // constant.
-  UVConstants.erase(I);
-  
-  // Free the constant and any dangling references to it.
+  getType()->getContext().pImpl->UndefValueConstants.remove(this);
   destroyConstantImpl();
 }
 

Modified: llvm/trunk/lib/VMCore/ConstantsContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantsContext.h?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/ConstantsContext.h (original)
+++ llvm/trunk/lib/VMCore/ConstantsContext.h Mon Jan 23 09:09:44 2012
@@ -477,6 +477,13 @@
   }
 };
 
+// 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> {
@@ -491,6 +498,14 @@
 };
 
 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) {
@@ -514,6 +529,37 @@
   }
 };
 
+// ConstantPointerNull does not take extra "value" argument...
+template<class ValType>
+struct ConstantCreator<ConstantPointerNull, PointerType, ValType> {
+  static ConstantPointerNull *create(PointerType *Ty, const ValType &V){
+    return new ConstantPointerNull(Ty);
+  }
+};
+
+template<>
+struct ConstantKeyData<ConstantPointerNull> {
+  typedef char ValType;
+  static ValType getValType(ConstantPointerNull *C) {
+    return 0;
+  }
+};
+
+// UndefValue does not take extra "value" argument...
+template<class ValType>
+struct ConstantCreator<UndefValue, Type, ValType> {
+  static UndefValue *create(Type *Ty, const ValType &V) {
+    return new UndefValue(Ty);
+  }
+};
+
+template<>
+struct ConstantKeyData<UndefValue> {
+  typedef char ValType;
+  static ValType getValType(UndefValue *C) {
+    return 0;
+  }
+};
 
 template<>
 struct ConstantCreator<InlineAsm, PointerType, InlineAsmKeyType> {

Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.cpp?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.cpp (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.cpp Mon Jan 23 09:09:44 2012
@@ -58,8 +58,6 @@
   std::vector<Module*> Modules(OwnedModules.begin(), OwnedModules.end());
   DeleteContainerPointers(Modules);
   
-  // Free the constants.  This is important to do here to ensure that they are
-  // freed before the LeakDetector is torn down.
   std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
                 DropReferences());
   std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(),
@@ -72,9 +70,9 @@
   ArrayConstants.freeConstants();
   StructConstants.freeConstants();
   VectorConstants.freeConstants();
-  CAZConstants.clear();
-  CPNConstants.clear();
-  UVConstants.clear();
+  AggZeroConstants.freeConstants();
+  NullPtrConstants.freeConstants();
+  UndefValueConstants.freeConstants();
   InlineAsms.freeConstants();
   DeleteContainerSeconds(IntConstants);
   DeleteContainerSeconds(FPConstants);

Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.h?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.h (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.h Mon Jan 23 09:09:44 2012
@@ -27,7 +27,6 @@
 #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>
@@ -139,8 +138,7 @@
   // on Context destruction.
   SmallPtrSet<MDNode*, 1> NonUniquedMDNodes;
   
-  typedef DenseMap<Type*, OwningPtr<ConstantAggregateZero> > CAZMapTy;
-  CAZMapTy CAZConstants;
+  ConstantUniqueMap<char, char, Type, ConstantAggregateZero> AggZeroConstants;
 
   typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>,
     ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy;
@@ -154,11 +152,9 @@
                             VectorType, ConstantVector> VectorConstantsTy;
   VectorConstantsTy VectorConstants;
   
-  typedef DenseMap<PointerType*, OwningPtr<ConstantPointerNull> > CPNMapTy;
-  CPNMapTy CPNConstants;
-
-  typedef DenseMap<Type*, OwningPtr<UndefValue> > UVMapTy;
-  UVMapTy UVConstants;
+  ConstantUniqueMap<char, char, PointerType, ConstantPointerNull>
+    NullPtrConstants;
+  ConstantUniqueMap<char, char, Type, UndefValue> UndefValueConstants;
   
   DenseMap<std::pair<Function*, BasicBlock*> , BlockAddress*> BlockAddresses;
   ConstantUniqueMap<ExprMapKeyType, const ExprMapKeyType&, Type, ConstantExpr>





More information about the llvm-commits mailing list