[llvm-commits] CVS: llvm/include/llvm/Bitcode/BitCodes.h BitstreamReader.h BitstreamWriter.h
Chris Lattner
sabre at nondot.org
Fri May 4 13:34:07 PDT 2007
Changes in directory llvm/include/llvm/Bitcode:
BitCodes.h updated: 1.4 -> 1.5
BitstreamReader.h updated: 1.13 -> 1.14
BitstreamWriter.h updated: 1.8 -> 1.9
---
Log message:
add support for array abbreviations.
---
Diffs of the changes: (+101 -59)
BitCodes.h | 22 ++++++++++---
BitstreamReader.h | 52 +++++++++++++++++++++-----------
BitstreamWriter.h | 86 ++++++++++++++++++++++++++++++------------------------
3 files changed, 101 insertions(+), 59 deletions(-)
Index: llvm/include/llvm/Bitcode/BitCodes.h
diff -u llvm/include/llvm/Bitcode/BitCodes.h:1.4 llvm/include/llvm/Bitcode/BitCodes.h:1.5
--- llvm/include/llvm/Bitcode/BitCodes.h:1.4 Fri May 4 13:25:49 2007
+++ llvm/include/llvm/Bitcode/BitCodes.h Fri May 4 15:33:47 2007
@@ -84,13 +84,15 @@
unsigned Enc : 3; // The encoding to use.
public:
enum Encoding {
- FixedWidth = 1, // A fixed with field, Val specifies number of bits.
- VBR = 2 // A VBR field where Val specifies the width of each chunk.
+ Fixed = 1, // A fixed with field, Val specifies number of bits.
+ VBR = 2, // A VBR field where Val specifies the width of each chunk.
+ Array = 3 // A sequence of fields, next field species elt encoding.
};
BitCodeAbbrevOp(uint64_t V) : Val(V), IsLiteral(true) {}
- BitCodeAbbrevOp(Encoding E, uint64_t Data)
+ BitCodeAbbrevOp(Encoding E, uint64_t Data = 0)
: Val(Data), IsLiteral(false), Enc(E) {}
+
bool isLiteral() const { return IsLiteral; }
bool isEncoding() const { return !IsLiteral; }
@@ -100,11 +102,21 @@
// Accessors for encoding info.
Encoding getEncoding() const { assert(isEncoding()); return (Encoding)Enc; }
- uint64_t getEncodingData() const { assert(isEncoding()); return Val; }
+ uint64_t getEncodingData() const {
+ assert(isEncoding() && hasEncodingData());
+ return Val;
+ }
bool hasEncodingData() const { return hasEncodingData(getEncoding()); }
static bool hasEncodingData(Encoding E) {
- return true;
+ switch (E) {
+ default: assert(0 && "Unknown encoding");
+ case Fixed:
+ case VBR:
+ return true;
+ case Array:
+ return false;
+ }
}
};
Index: llvm/include/llvm/Bitcode/BitstreamReader.h
diff -u llvm/include/llvm/Bitcode/BitstreamReader.h:1.13 llvm/include/llvm/Bitcode/BitstreamReader.h:1.14
--- llvm/include/llvm/Bitcode/BitstreamReader.h:1.13 Fri May 4 13:25:49 2007
+++ llvm/include/llvm/Bitcode/BitstreamReader.h Fri May 4 15:33:47 2007
@@ -274,6 +274,26 @@
// Record Processing
//===--------------------------------------------------------------------===//
+private:
+ void ReadAbbreviatedField(const BitCodeAbbrevOp &Op,
+ SmallVectorImpl<uint64_t> &Vals) {
+ if (Op.isLiteral()) {
+ // If the abbrev specifies the literal value to use, use it.
+ Vals.push_back(Op.getLiteralValue());
+ } else {
+ // Decode the value as we are commanded.
+ switch (Op.getEncoding()) {
+ default: assert(0 && "Unknown encoding!");
+ case BitCodeAbbrevOp::Fixed:
+ Vals.push_back(Read(Op.getEncodingData()));
+ break;
+ case BitCodeAbbrevOp::VBR:
+ Vals.push_back(ReadVBR64(Op.getEncodingData()));
+ break;
+ }
+ }
+ }
+public:
unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl<uint64_t> &Vals) {
if (AbbrevID == bitc::UNABBREV_RECORD) {
unsigned Code = ReadVBR(6);
@@ -289,20 +309,19 @@
for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
- if (Op.isLiteral()) {
- // If the abbrev specifies the literal value to use, use it.
- Vals.push_back(Op.getLiteralValue());
+ if (Op.isLiteral() || Op.getEncoding() != BitCodeAbbrevOp::Array) {
+ ReadAbbreviatedField(Op, Vals);
} else {
- // Decode the value as we are commanded.
- switch (Op.getEncoding()) {
- default: assert(0 && "Unknown encoding!");
- case BitCodeAbbrevOp::FixedWidth:
- Vals.push_back(Read(Op.getEncodingData()));
- break;
- case BitCodeAbbrevOp::VBR:
- Vals.push_back(ReadVBR64(Op.getEncodingData()));
- break;
- }
+ // Array case. Read the number of elements as a vbr6.
+ unsigned NumElts = ReadVBR(6);
+
+ // Get the element encoding.
+ assert(i+2 == e && "array op not second to last?");
+ const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i);
+
+ // Read all the elements.
+ for (; NumElts; --NumElts)
+ ReadAbbreviatedField(EltEnc, Vals);
}
}
@@ -326,11 +345,10 @@
}
BitCodeAbbrevOp::Encoding E = (BitCodeAbbrevOp::Encoding)Read(3);
- if (BitCodeAbbrevOp::hasEncodingData(E)) {
+ if (BitCodeAbbrevOp::hasEncodingData(E))
Abbv->Add(BitCodeAbbrevOp(E, ReadVBR64(5)));
- } else {
- assert(0 && "unimp");
- }
+ else
+ Abbv->Add(BitCodeAbbrevOp(E));
}
CurAbbrevs.push_back(Abbv);
}
Index: llvm/include/llvm/Bitcode/BitstreamWriter.h
diff -u llvm/include/llvm/Bitcode/BitstreamWriter.h:1.8 llvm/include/llvm/Bitcode/BitstreamWriter.h:1.9
--- llvm/include/llvm/Bitcode/BitstreamWriter.h:1.8 Fri May 4 13:25:49 2007
+++ llvm/include/llvm/Bitcode/BitstreamWriter.h Fri May 4 15:33:47 2007
@@ -189,6 +189,32 @@
// Record Emission
//===--------------------------------------------------------------------===//
+private:
+ /// EmitAbbreviatedField - Emit a single scalar field value with the specified
+ /// encoding.
+ template<typename uintty>
+ void EmitAbbreviatedField(const BitCodeAbbrevOp &Op, uintty V) {
+ if (Op.isLiteral()) {
+ // If the abbrev specifies the literal value to use, don't emit
+ // anything.
+ assert(V == Op.getLiteralValue() &&
+ "Invalid abbrev for record!");
+ return;
+ }
+
+ // Encode the value as we are commanded.
+ switch (Op.getEncoding()) {
+ default: assert(0 && "Unknown encoding!");
+ case BitCodeAbbrevOp::Fixed:
+ Emit(V, Op.getEncodingData());
+ break;
+ case BitCodeAbbrevOp::VBR:
+ EmitVBR(V, Op.getEncodingData());
+ break;
+ }
+ }
+public:
+
/// EmitRecord - Emit the specified record to the stream, using an abbrev if
/// we have one to compress the output.
void EmitRecord(unsigned Code, SmallVectorImpl<uint64_t> &Vals,
@@ -207,27 +233,20 @@
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!");
+ if (Op.isLiteral() || Op.getEncoding() != BitCodeAbbrevOp::Array) {
+ EmitAbbreviatedField(Op, Vals[RecordIdx]);
++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;
- }
+ // Array case.
+ assert(i+2 == e && "array op not second to last?");
+ const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i);
+
+ // Emit a vbr6 to indicate the number of elements present.
+ EmitVBR(Vals.size()-RecordIdx, 6);
+
+ // Emit each field.
+ for (; RecordIdx != Vals.size(); ++RecordIdx)
+ EmitAbbreviatedField(EltEnc, Vals[RecordIdx]);
}
}
assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
@@ -260,27 +279,20 @@
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!");
+ if (Op.isLiteral() || Op.getEncoding() != BitCodeAbbrevOp::Array) {
+ EmitAbbreviatedField(Op, Vals[RecordIdx]);
++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(i+2 == e && "array op not second to last?");
+ const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i);
+
+ // Emit a vbr6 to indicate the number of elements present.
+ EmitVBR(Vals.size()-RecordIdx, 6);
+
+ // Emit each field.
+ for (; RecordIdx != Vals.size(); ++RecordIdx)
+ EmitAbbreviatedField(EltEnc, Vals[RecordIdx]);
}
}
assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
More information about the llvm-commits
mailing list