Switch the bitcode reader interface to take a MemoryBuffer instead of knowing
[oota-llvm.git] / include / llvm / Bitcode / BitstreamWriter.h
index 61208724bf883c3b7cd0204030573eb1310b3b3f..eaf2e4317c01452295fc13a3f87598524252355c 100644 (file)
@@ -32,7 +32,10 @@ class BitstreamWriter {
   // CurCodeSize - This is the declared size of code values used for the current
   // block, in bits.
   unsigned CurCodeSize;
-  
+
+  /// CurAbbrevs - Abbrevs installed at in this block.
+  std::vector<BitCodeAbbrev*> CurAbbrevs;
+
   struct Block {
     unsigned PrevCodeSize;
     unsigned StartSizeWord;
@@ -43,14 +46,13 @@ class BitstreamWriter {
   /// BlockScope - This tracks the current blocks that we have entered.
   std::vector<Block> BlockScope;
   
-  std::vector<BitCodeAbbrev*> CurAbbrevs;
 public:
   BitstreamWriter(std::vector<unsigned char> &O) 
     : Out(O), CurBit(0), CurValue(0), CurCodeSize(2) {}
 
   ~BitstreamWriter() {
     assert(CurBit == 0 && "Unflused data remaining");
-    assert(BlockScope.empty() && "Block imbalance");
+    assert(BlockScope.empty() && CurAbbrevs.empty() && "Block imbalance");
   }
   //===--------------------------------------------------------------------===//
   // Basic Primitives for emitting bits to the stream.
@@ -145,12 +147,8 @@ public:
     EmitVBR(CodeLen, bitc::CodeLenWidth);
     FlushToWord();
     BlockScope.push_back(Block(CurCodeSize, Out.size()/4));
-    
-    // Delete all abbrevs.
-    for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
-      delete CurAbbrevs[i];
-    
     BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
+    
     // Emit a placeholder, which will be replaced when the block is popped.
     Emit(0, bitc::BlockSizeWidth);
     
@@ -159,6 +157,11 @@ public:
   
   void ExitBlock() {
     assert(!BlockScope.empty() && "Block scope imbalance!");
+    
+    // Delete all abbrevs.
+    for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
+      delete CurAbbrevs[i];
+    
     const Block &B = BlockScope.back();
     
     // Block tail: