[llvm-commits] CVS: llvm/include/llvm/Bitcode/BitstreamWriter.h

Chris Lattner sabre at nondot.org
Mon Apr 23 10:44:09 PDT 2007



Changes in directory llvm/include/llvm/Bitcode:

BitstreamWriter.h updated: 1.3 -> 1.4
---
Log message:

finish implementation of basic abbrev writing.


---
Diffs of the changes:  (+69 -4)

 BitstreamWriter.h |   73 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 69 insertions(+), 4 deletions(-)


Index: llvm/include/llvm/Bitcode/BitstreamWriter.h
diff -u llvm/include/llvm/Bitcode/BitstreamWriter.h:1.3 llvm/include/llvm/Bitcode/BitstreamWriter.h:1.4
--- llvm/include/llvm/Bitcode/BitstreamWriter.h:1.3	Mon Apr 23 11:04:05 2007
+++ llvm/include/llvm/Bitcode/BitstreamWriter.h	Mon Apr 23 12:43:52 2007
@@ -194,11 +194,40 @@
       unsigned AbbrevNo = Abbrev-bitc::FIRST_ABBREV;
       assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
       BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
-      assert(0 && "TODO");
-      for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
-      }
       
+      EmitCode(Abbrev);
+      
+      // Insert the code into Vals to treat it uniformly.
+      Vals.insert(Vals.begin(), Code);
       
+      unsigned RecordIdx = 0;
+      for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
+        assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
+        const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
+        uint64_t RecordVal = Vals[RecordIdx];
+        
+        if (Op.isLiteral()) {
+          // If the abbrev specifies the literal value to use, don't emit
+          // anything.
+          assert(RecordVal == Op.getLiteralValue() &&
+                 "Invalid abbrev for record!");
+          ++RecordIdx;
+        } else {
+          // Encode the value as we are commanded.
+          switch (Op.getEncoding()) {
+          default: assert(0 && "Unknown encoding!");
+          case BitCodeAbbrevOp::FixedWidth:
+            Emit64(RecordVal, Op.getEncodingData());
+            ++RecordIdx;
+            break;
+          case BitCodeAbbrevOp::VBR:
+            EmitVBR64(RecordVal, Op.getEncodingData());
+            ++RecordIdx;
+            break;
+          }
+        }
+      }
+      assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
     } else {
       // If we don't have an abbrev to use, emit this in its fully unabbreviated
       // form.
@@ -215,7 +244,43 @@
   void EmitRecord(unsigned Code, SmallVectorImpl<unsigned> &Vals,
                   unsigned Abbrev = 0) {
     if (Abbrev) {
-      assert(0 && "abbrevs not implemented yet!");
+      unsigned AbbrevNo = Abbrev-bitc::FIRST_ABBREV;
+      assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
+      BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
+      
+      EmitCode(Abbrev);
+
+      // Insert the code into Vals to treat it uniformly.
+      Vals.insert(Vals.begin(), Code);
+      
+      unsigned RecordIdx = 0;
+      for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
+        assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
+        const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
+        unsigned RecordVal = Vals[RecordIdx];
+        
+        if (Op.isLiteral()) {
+          // If the abbrev specifies the literal value to use, don't emit
+          // anything.
+          assert(RecordVal == Op.getLiteralValue() &&
+                 "Invalid abbrev for record!");
+          ++RecordIdx;
+        } else {
+          // Encode the value as we are commanded.
+          switch (Op.getEncoding()) {
+          default: assert(0 && "Unknown encoding!");
+          case BitCodeAbbrevOp::FixedWidth:
+            Emit(RecordVal, Op.getEncodingData());
+            ++RecordIdx;
+            break;
+          case BitCodeAbbrevOp::VBR:
+            EmitVBR(RecordVal, Op.getEncodingData());
+            ++RecordIdx;
+            break;
+          }
+        }
+      }
+      assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
     } else {
       // If we don't have an abbrev to use, emit this in its fully unabbreviated
       // form.






More information about the llvm-commits mailing list