mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Make the AttrListPtr object a part of the LLVMContext.
When code deletes the context, the AttributeImpls that the AttrListPtr points to are now invalid. Therefore, instead of keeping a separate managed static for the AttrListPtrs that's reference counted, move it into the LLVMContext and delete it when deleting the AttributeImpls. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168354 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -355,62 +355,8 @@ uint64_t AttributesImpl::getStackAlignment() const { | ||||
| // AttributeListImpl Definition | ||||
| //===----------------------------------------------------------------------===// | ||||
|  | ||||
| namespace llvm { | ||||
|   class AttributeListImpl; | ||||
| } | ||||
|  | ||||
| static ManagedStatic<FoldingSet<AttributeListImpl> > AttributesLists; | ||||
|  | ||||
| namespace llvm { | ||||
| static ManagedStatic<sys::SmartMutex<true> > ALMutex; | ||||
|  | ||||
| class AttributeListImpl : public FoldingSetNode { | ||||
|   sys::cas_flag RefCount; | ||||
|  | ||||
|   // AttributesList is uniqued, these should not be publicly available. | ||||
|   void operator=(const AttributeListImpl &) LLVM_DELETED_FUNCTION; | ||||
|   AttributeListImpl(const AttributeListImpl &) LLVM_DELETED_FUNCTION; | ||||
|   ~AttributeListImpl();                        // Private implementation | ||||
| public: | ||||
|   SmallVector<AttributeWithIndex, 4> Attrs; | ||||
|  | ||||
|   AttributeListImpl(ArrayRef<AttributeWithIndex> attrs) | ||||
|     : Attrs(attrs.begin(), attrs.end()) { | ||||
|     RefCount = 0; | ||||
|   } | ||||
|  | ||||
|   void AddRef() { | ||||
|     sys::SmartScopedLock<true> Lock(*ALMutex); | ||||
|     ++RefCount; | ||||
|   } | ||||
|   void DropRef() { | ||||
|     sys::SmartScopedLock<true> Lock(*ALMutex); | ||||
|     if (!AttributesLists.isConstructed()) | ||||
|       return; | ||||
|     sys::cas_flag new_val = --RefCount; | ||||
|     if (new_val == 0) | ||||
|       delete this; | ||||
|   } | ||||
|  | ||||
|   void Profile(FoldingSetNodeID &ID) const { | ||||
|     Profile(ID, Attrs); | ||||
|   } | ||||
|   static void Profile(FoldingSetNodeID &ID, ArrayRef<AttributeWithIndex> Attrs){ | ||||
|     for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { | ||||
|       ID.AddInteger(Attrs[i].Attrs.Raw()); | ||||
|       ID.AddInteger(Attrs[i].Index); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
|  | ||||
| } // end llvm namespace | ||||
|  | ||||
| AttributeListImpl::~AttributeListImpl() { | ||||
|   // NOTE: Lock must be acquired by caller. | ||||
|   AttributesLists->RemoveNode(this); | ||||
| } | ||||
|  | ||||
| AttrListPtr AttrListPtr::get(ArrayRef<AttributeWithIndex> Attrs) { | ||||
| AttrListPtr AttrListPtr::get(LLVMContext &C, | ||||
|                              ArrayRef<AttributeWithIndex> Attrs) { | ||||
|   // If there are no attributes then return a null AttributesList pointer. | ||||
|   if (Attrs.empty()) | ||||
|     return AttrListPtr(); | ||||
| @@ -425,49 +371,34 @@ AttrListPtr AttrListPtr::get(ArrayRef<AttributeWithIndex> Attrs) { | ||||
| #endif | ||||
|  | ||||
|   // Otherwise, build a key to look up the existing attributes. | ||||
|   LLVMContextImpl *pImpl = C.pImpl; | ||||
|   FoldingSetNodeID ID; | ||||
|   AttributeListImpl::Profile(ID, Attrs); | ||||
|   void *InsertPos; | ||||
|  | ||||
|   sys::SmartScopedLock<true> Lock(*ALMutex); | ||||
|  | ||||
|   AttributeListImpl *PAL = | ||||
|     AttributesLists->FindNodeOrInsertPos(ID, InsertPos); | ||||
|   void *InsertPoint; | ||||
|   AttributeListImpl *PA = pImpl->AttrsLists.FindNodeOrInsertPos(ID, | ||||
|                                                                 InsertPoint); | ||||
|  | ||||
|   // If we didn't find any existing attributes of the same shape then | ||||
|   // create a new one and insert it. | ||||
|   if (!PAL) { | ||||
|     PAL = new AttributeListImpl(Attrs); | ||||
|     AttributesLists->InsertNode(PAL, InsertPos); | ||||
|   if (!PA) { | ||||
|     PA = new AttributeListImpl(Attrs); | ||||
|     pImpl->AttrsLists.InsertNode(PA, InsertPoint); | ||||
|   } | ||||
|  | ||||
|   // Return the AttributesList that we found or created. | ||||
|   return AttrListPtr(PAL); | ||||
|   return AttrListPtr(PA); | ||||
| } | ||||
|  | ||||
| //===----------------------------------------------------------------------===// | ||||
| // AttrListPtr Method Implementations | ||||
| //===----------------------------------------------------------------------===// | ||||
|  | ||||
| AttrListPtr::AttrListPtr(AttributeListImpl *LI) : AttrList(LI) { | ||||
|   if (LI) LI->AddRef(); | ||||
| } | ||||
|  | ||||
| AttrListPtr::AttrListPtr(const AttrListPtr &P) : AttrList(P.AttrList) { | ||||
|   if (AttrList) AttrList->AddRef(); | ||||
| } | ||||
|  | ||||
| const AttrListPtr &AttrListPtr::operator=(const AttrListPtr &RHS) { | ||||
|   sys::SmartScopedLock<true> Lock(*ALMutex); | ||||
|   if (AttrList == RHS.AttrList) return *this; | ||||
|   if (AttrList) AttrList->DropRef(); | ||||
|   AttrList = RHS.AttrList; | ||||
|   if (AttrList) AttrList->AddRef(); | ||||
|   return *this; | ||||
| } | ||||
|  | ||||
| AttrListPtr::~AttrListPtr() { | ||||
|   if (AttrList) AttrList->DropRef(); | ||||
|   AttrList = RHS.AttrList; | ||||
|   return *this; | ||||
| } | ||||
|  | ||||
| /// getNumSlots - Return the number of slots used in this attribute list. | ||||
| @@ -507,6 +438,7 @@ bool AttrListPtr::hasAttrSomewhere(Attributes::AttrVal Attr) const { | ||||
|   for (unsigned i = 0, e = Attrs.size(); i != e; ++i) | ||||
|     if (Attrs[i].Attrs.hasAttribute(Attr)) | ||||
|       return true; | ||||
|  | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| @@ -562,7 +494,7 @@ AttrListPtr AttrListPtr::addAttr(LLVMContext &C, unsigned Idx, | ||||
|                        OldAttrList.begin()+i, OldAttrList.end()); | ||||
|   } | ||||
|  | ||||
|   return get(NewAttrList); | ||||
|   return get(C, NewAttrList); | ||||
| } | ||||
|  | ||||
| AttrListPtr AttrListPtr::removeAttr(LLVMContext &C, unsigned Idx, | ||||
| @@ -601,7 +533,7 @@ AttrListPtr AttrListPtr::removeAttr(LLVMContext &C, unsigned Idx, | ||||
|   NewAttrList.insert(NewAttrList.end(), | ||||
|                      OldAttrList.begin()+i, OldAttrList.end()); | ||||
|  | ||||
|   return get(NewAttrList); | ||||
|   return get(C, NewAttrList); | ||||
| } | ||||
|  | ||||
| void AttrListPtr::dump() const { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user