Add an API for the bitstream reader to read blobs and return

them by reference, instead of packing each byte into a
smallvector.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68486 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-04-07 02:56:46 +00:00
parent 683b08cf7c
commit ae7dd8004e
2 changed files with 37 additions and 25 deletions

View File

@ -371,7 +371,8 @@ public:
return CurAbbrevs[AbbrevNo];
}
unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl<uint64_t> &Vals) {
unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl<uint64_t> &Vals,
const char **BlobStart = 0, unsigned *BlobLen = 0) {
if (AbbrevID == bitc::UNABBREV_RECORD) {
unsigned Code = ReadVBR(6);
unsigned NumElts = ReadVBR(6);
@ -413,9 +414,15 @@ public:
break;
}
// Otherwise, read the number of bytes.
for (; NumElts; ++NextChar, --NumElts)
Vals.push_back(*NextChar);
// Otherwise, read the number of bytes. If we can return a reference to
// the data, do so to avoid copying it.
if (BlobStart) {
*BlobStart = (const char*)NextChar;
*BlobLen = NumElts;
} else {
for (; NumElts; ++NextChar, --NumElts)
Vals.push_back(*NextChar);
}
// Skip over tail padding.
NextChar = NewEnd;
} else {
@ -428,6 +435,12 @@ public:
return Code;
}
unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl<uint64_t> &Vals,
const char *&BlobStart, unsigned &BlobLen) {
return ReadRecord(AbbrevID, Vals, &BlobStart, &BlobLen);
}
//===--------------------------------------------------------------------===//
// Abbrev Processing
//===--------------------------------------------------------------------===//

View File

@ -342,32 +342,14 @@ static bool ParseBlock(BitstreamReader &Stream, unsigned IndentLevel) {
break;
default:
Record.clear();
bool HasBlob = false;
++BlockStats.NumRecords;
if (AbbrevID != bitc::UNABBREV_RECORD) {
if (AbbrevID != bitc::UNABBREV_RECORD)
++BlockStats.NumAbbreviatedRecords;
const BitCodeAbbrev *Abbv = Stream.getAbbrev(AbbrevID);
if (Abbv->getNumOperandInfos() != 0) {
const BitCodeAbbrevOp &LastOp =
Abbv->getOperandInfo(Abbv->getNumOperandInfos()-1);
// If the last operand is a blob, then this record has blob data.
if (LastOp.isEncoding() &&
LastOp.getEncoding() == BitCodeAbbrevOp::Blob)
HasBlob = true;
}
}
unsigned Code;
const char *BlobStart = 0;
unsigned BlobLen = 0;
if (!HasBlob)
Code = Stream.ReadRecord(AbbrevID, Record);
else {
Code = Stream.ReadRecord(AbbrevID, Record);
BlobStart = BlobStart;
BlobLen = BlobLen;
}
unsigned Code = Stream.ReadRecord(AbbrevID, Record, BlobStart, BlobLen);
// Increment the # occurrences of this code.
if (BlockStats.CodeFreq.size() <= Code)
@ -388,7 +370,24 @@ static bool ParseBlock(BitstreamReader &Stream, unsigned IndentLevel) {
for (unsigned i = 0, e = Record.size(); i != e; ++i)
std::cerr << " op" << i << "=" << (int64_t)Record[i];
std::cerr << "/>\n";
std::cerr << "/>";
if (BlobStart) {
std::cerr << " blob data = ";
bool BlobIsPrintable = true;
for (unsigned i = 0; i != BlobLen; ++i)
if (!isprint(BlobStart[i])) {
BlobIsPrintable = false;
break;
}
if (BlobIsPrintable)
std::cerr << "'" << std::string(BlobStart, BlobStart+BlobLen) <<"'";
else
std::cerr << "unprintable, " << BlobLen << " bytes.";
}
std::cerr << "\n";
}
break;