Clean up reference counting to stop "leaking" alias sets

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15099 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2004-07-22 07:58:18 +00:00
parent 199edde707
commit b8a31ace2c
2 changed files with 27 additions and 25 deletions

View File

@@ -62,9 +62,8 @@ class AliasSet {
if (AS->Forward) {
AliasSet *OldAS = AS;
AS = OldAS->getForwardedTarget(AST);
if (--OldAS->RefCount == 0)
OldAS->removeFromTracker(AST);
AS->RefCount++;
AS->addRef();
OldAS->dropRef(AST);
}
return AS;
}
@@ -118,6 +117,13 @@ class AliasSet {
void setPrev(AliasSet *P) { Prev = P; }
void setNext(AliasSet *N) { Next = N; }
void addRef() { ++RefCount; }
void dropRef(AliasSetTracker &AST) {
assert(RefCount >= 1 && "Invalid reference count detected!");
if (--RefCount == 0)
removeFromTracker(AST);
}
public:
/// Accessors...
bool isRef() const { return AccessTy & Refs; }
@@ -187,15 +193,10 @@ private:
AliasSet() : PtrList(0), PtrListEnd(&PtrList), Forward(0), RefCount(0),
AccessTy(NoModRef), AliasTy(MustAlias), Volatile(false) {
}
AliasSet(const AliasSet &AS) {
// AliasSet's only get copy constructed in simple circumstances. In
// particular, they cannot have any pointers in their list. Despite this,
// we have to be sure to update the PtrListEnd to not point to the source
// AliasSet's list.
assert(AS.PtrList == 0 && "AliasSet has pointers in it!");
PtrList = 0; PtrListEnd = &PtrList;
Forward = AS.Forward; RefCount = AS.RefCount;
AccessTy = AS.AccessTy; AliasTy = AS.AliasTy; Volatile = AS.Volatile;
assert(0 && "Copy ctor called!?!?!");
abort();
}
HashNodePair *getSomePointer() const {
@@ -210,9 +211,8 @@ private:
AliasSet *Dest = Forward->getForwardedTarget(AST);
if (Dest != Forward) {
Dest->RefCount++;
if (--Forward->RefCount == 0)
Forward->removeFromTracker(AST);
Dest->addRef();
Forward->dropRef(AST);
Forward = Dest;
}
return Dest;