mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 06:25:18 +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