refcount BitCodeAbbrev objects
authorChris Lattner <sabre@nondot.org>
Fri, 4 May 2007 17:35:19 +0000 (17:35 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 4 May 2007 17:35:19 +0000 (17:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36747 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Bitcode/BitCodes.h
include/llvm/Bitcode/BitstreamReader.h
include/llvm/Bitcode/BitstreamWriter.h

index 98d18b194bdfa6f8c9db16a861ef9c3c9454117e..15a7a4943dc908582d218af720a7a1666e90a269 100644 (file)
@@ -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<BitCodeAbbrevOp, 8> 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];
index 8d70f1f7133e990dbb3b47df5d5289af83a17646..bff4e537fd9746c6f1c5eb41c0f648064b573641 100644 (file)
@@ -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<BitCodeAbbrev*> &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();
index eaf2e4317c01452295fc13a3f87598524252355c..808fa527e055ca239215b00560cca141db23cbd5 100644 (file)
@@ -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();