mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 00:29:20 +00:00
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:
parent
683b08cf7c
commit
ae7dd8004e
@ -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.
|
||||
// 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
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user