mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +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];
|
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) {
|
if (AbbrevID == bitc::UNABBREV_RECORD) {
|
||||||
unsigned Code = ReadVBR(6);
|
unsigned Code = ReadVBR(6);
|
||||||
unsigned NumElts = ReadVBR(6);
|
unsigned NumElts = ReadVBR(6);
|
||||||
@ -413,9 +414,15 @@ public:
|
|||||||
break;
|
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)
|
for (; NumElts; ++NextChar, --NumElts)
|
||||||
Vals.push_back(*NextChar);
|
Vals.push_back(*NextChar);
|
||||||
|
}
|
||||||
// Skip over tail padding.
|
// Skip over tail padding.
|
||||||
NextChar = NewEnd;
|
NextChar = NewEnd;
|
||||||
} else {
|
} else {
|
||||||
@ -428,6 +435,12 @@ public:
|
|||||||
return Code;
|
return Code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl<uint64_t> &Vals,
|
||||||
|
const char *&BlobStart, unsigned &BlobLen) {
|
||||||
|
return ReadRecord(AbbrevID, Vals, &BlobStart, &BlobLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Abbrev Processing
|
// Abbrev Processing
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
@ -342,32 +342,14 @@ static bool ParseBlock(BitstreamReader &Stream, unsigned IndentLevel) {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Record.clear();
|
Record.clear();
|
||||||
bool HasBlob = false;
|
|
||||||
|
|
||||||
++BlockStats.NumRecords;
|
++BlockStats.NumRecords;
|
||||||
if (AbbrevID != bitc::UNABBREV_RECORD) {
|
if (AbbrevID != bitc::UNABBREV_RECORD)
|
||||||
++BlockStats.NumAbbreviatedRecords;
|
++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;
|
const char *BlobStart = 0;
|
||||||
unsigned BlobLen = 0;
|
unsigned BlobLen = 0;
|
||||||
if (!HasBlob)
|
unsigned Code = Stream.ReadRecord(AbbrevID, Record, BlobStart, BlobLen);
|
||||||
Code = Stream.ReadRecord(AbbrevID, Record);
|
|
||||||
else {
|
|
||||||
Code = Stream.ReadRecord(AbbrevID, Record);
|
|
||||||
BlobStart = BlobStart;
|
|
||||||
BlobLen = BlobLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Increment the # occurrences of this code.
|
// Increment the # occurrences of this code.
|
||||||
if (BlockStats.CodeFreq.size() <= 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)
|
for (unsigned i = 0, e = Record.size(); i != e; ++i)
|
||||||
std::cerr << " op" << i << "=" << (int64_t)Record[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;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user