From ae7dd8004eb286039ee1eb1a35ddb1ff4eafe460 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 7 Apr 2009 02:56:46 +0000 Subject: 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 --- tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp | 41 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 21 deletions(-) (limited to 'tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp') diff --git a/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp b/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp index 2953e08afa..4832a4c0b2 100644 --- a/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ b/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -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; -- cgit v1.2.3