From 299b2d2070165eccea3fb61f7387fa016b847338 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 4 May 2007 17:35:19 +0000 Subject: [PATCH] refcount BitCodeAbbrev objects git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36747 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Bitcode/BitCodes.h | 12 +++++++++--- include/llvm/Bitcode/BitstreamReader.h | 6 +++--- include/llvm/Bitcode/BitstreamWriter.h | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/llvm/Bitcode/BitCodes.h b/include/llvm/Bitcode/BitCodes.h index 98d18b194bd..15a7a4943dc 100644 --- a/include/llvm/Bitcode/BitCodes.h +++ b/include/llvm/Bitcode/BitCodes.h @@ -58,9 +58,9 @@ namespace bitc { /// 2. It could be an encoding specification ("this operand encoded like so"). /// class BitCodeAbbrevOp { - uint64_t Val; // A literal value or data for an encoding. - bool IsLiteral : 1; // Indicate whether this is a literal value or not. - unsigned Enc : 3; // The encoding to use. + uint64_t Val; // A literal value or data for an encoding. + bool IsLiteral : 1; // Indicate whether this is a literal value or not. + unsigned Enc : 3; // The encoding to use. public: enum Encoding { FixedWidth = 1, // A fixed with field, Val specifies number of bits. @@ -89,8 +89,14 @@ public: class BitCodeAbbrev { SmallVector OperandList; + unsigned char RefCount; // Number of things using this. + ~BitCodeAbbrev() {} public: + BitCodeAbbrev() : RefCount(1) {} + void addRef() { ++RefCount; } + void dropRef() { if (--RefCount == 0) delete this; } + unsigned getNumOperandInfos() const { return OperandList.size(); } const BitCodeAbbrevOp &getOperandInfo(unsigned N) const { return OperandList[N]; diff --git a/include/llvm/Bitcode/BitstreamReader.h b/include/llvm/Bitcode/BitstreamReader.h index 8d70f1f7133..bff4e537fd9 100644 --- a/include/llvm/Bitcode/BitstreamReader.h +++ b/include/llvm/Bitcode/BitstreamReader.h @@ -75,12 +75,12 @@ public: // Abbrevs could still exist if the stream was broken. If so, don't leak // them. for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i) - delete CurAbbrevs[i]; + CurAbbrevs[i]->dropRef(); for (unsigned S = 0, e = BlockScope.size(); S != e; ++S) { std::vector &Abbrevs = BlockScope[S].PrevAbbrevs; for (unsigned i = 0, e = Abbrevs.size(); i != e; ++i) - delete Abbrevs[i]; + Abbrevs[i]->dropRef(); } } @@ -263,7 +263,7 @@ public: // Delete abbrevs from popped scope. for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i) - delete CurAbbrevs[i]; + CurAbbrevs[i]->dropRef(); BlockScope.back().PrevAbbrevs.swap(CurAbbrevs); BlockScope.pop_back(); diff --git a/include/llvm/Bitcode/BitstreamWriter.h b/include/llvm/Bitcode/BitstreamWriter.h index eaf2e4317c0..808fa527e05 100644 --- a/include/llvm/Bitcode/BitstreamWriter.h +++ b/include/llvm/Bitcode/BitstreamWriter.h @@ -160,7 +160,7 @@ public: // Delete all abbrevs. for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i) - delete CurAbbrevs[i]; + CurAbbrevs[i]->dropRef(); const Block &B = BlockScope.back();