30 return "BLOCKINFO_BLOCK";
37 if (!
Info->Name.empty())
38 return Info->Name.c_str();
48 return "OPERAND_BUNDLE_TAGS_BLOCK";
50 return "MODULE_BLOCK";
52 return "PARAMATTR_BLOCK";
54 return "PARAMATTR_GROUP_BLOCK_ID";
56 return "TYPE_BLOCK_ID";
58 return "CONSTANTS_BLOCK";
60 return "FUNCTION_BLOCK";
62 return "IDENTIFICATION_BLOCK_ID";
64 return "VALUE_SYMTAB";
66 return "METADATA_BLOCK";
68 return "METADATA_KIND_BLOCK";
70 return "METADATA_ATTACHMENT_BLOCK";
72 return "USELIST_BLOCK_ID";
74 return "GLOBALVAL_SUMMARY_BLOCK";
76 return "FULL_LTO_GLOBALVAL_SUMMARY_BLOCK";
78 return "MODULE_STRTAB_BLOCK";
80 return "STRTAB_BLOCK";
82 return "SYMTAB_BLOCK";
101 return "SETRECORDNAME";
110 for (
unsigned i = 0,
e =
Info->RecordNames.size();
i !=
e; ++
i)
111 if (
Info->RecordNames[
i].first == CodeID)
112 return Info->RecordNames[
i].second.c_str();
118 #define STRINGIFY_CODE(PREFIX, CODE) \
119 case bitc::PREFIX##_##CODE: \
223 return "CST_CODE_BLOCKADDRESS";
378 return "USELIST_CODE_DEFAULT";
380 return "USELIST_CODE_BB";
388 return "OPERAND_BUNDLE_TAG";
405 #undef STRINGIFY_CODE
412 OS <<
format(
"%lub/%.2fB/%luW", (
unsigned long)
Bits, (
double)
Bits / 8,
413 (
unsigned long)(
Bits / 32));
417 auto tryRead = [&Stream](
char &Dest,
size_t size) ->
Error {
419 Dest = MaybeWord.get();
421 return MaybeWord.takeError();
426 if (
Error Err = tryRead(Signature[0], 8))
428 if (
Error Err = tryRead(Signature[1], 8))
432 if (Signature[0] ==
'C' && Signature[1] ==
'P') {
433 if (
Error Err = tryRead(Signature[2], 8))
435 if (
Error Err = tryRead(Signature[3], 8))
437 if (Signature[2] ==
'C' && Signature[3] ==
'H')
439 }
else if (Signature[0] ==
'D' && Signature[1] ==
'I') {
440 if (
Error Err = tryRead(Signature[2], 8))
442 if (
Error Err = tryRead(Signature[3], 8))
444 if (Signature[2] ==
'A' && Signature[3] ==
'G')
446 }
else if (Signature[0] ==
'R' && Signature[1] ==
'M') {
447 if (
Error Err = tryRead(Signature[2], 8))
449 if (
Error Err = tryRead(Signature[3], 8))
451 if (Signature[2] ==
'R' && Signature[3] ==
'K')
454 if (
Error Err = tryRead(Signature[2], 4))
456 if (
Error Err = tryRead(Signature[3], 4))
458 if (
Error Err = tryRead(Signature[4], 4))
460 if (
Error Err = tryRead(Signature[5], 4))
462 if (Signature[0] ==
'B' && Signature[1] ==
'C' && Signature[2] == 0x0 &&
463 Signature[3] == 0xC && Signature[4] == 0xE && Signature[5] == 0xD)
472 const unsigned char *BufPtr = (
const unsigned char *)Bytes.
data();
473 const unsigned char *EndBufPtr = BufPtr + Bytes.
size();
479 return reportError(
"Invalid bitcode wrapper header");
488 O->OS <<
"<BITCODE_WRAPPER_HEADER"
497 return reportError(
"Invalid bitcode wrapper header");
510 Error BitcodeAnalyzer::decodeMetadataStringsBlob(
StringRef Indent,
519 "Decoding metadata strings blob needs two record entries.");
521 unsigned NumStrings =
Record[0];
522 unsigned StringsOffset =
Record[1];
523 OS <<
" num-strings = " << NumStrings <<
" {\n";
529 if (
R.AtEndOfStream())
536 if (Strings.size() <
Size)
539 OS << Indent <<
" '";
542 Strings = Strings.drop_front(
Size);
543 }
while (--NumStrings);
545 OS << Indent <<
" }";
553 BlockInfoStream.emplace(*BlockInfoBuffer);
562 CurStreamType = *MaybeType;
568 if (BlockInfoStream) {
572 return H.takeError();
579 return reportError(
"Invalid record at top-level in block info file");
587 if (!MaybeNewBlockInfo)
592 return reportError(
"Malformed BlockInfoBlock in block info file");
614 if (
Error E = parseBlock(MaybeBlockID.
get(), 0,
O, CheckHash))
628 O.OS <<
"of " << Filename->
data() <<
":\n";
629 O.OS <<
" Total size: ";
632 O.OS <<
" Stream type: ";
633 switch (CurStreamType) {
641 O.OS <<
"Clang Serialized AST\n";
644 O.OS <<
"Clang Serialized Diagnostics\n";
647 O.OS <<
"LLVM Remarks\n";
650 O.OS <<
" # Toplevel Blocks: " << NumTopBlocks <<
"\n";
654 O.OS <<
"Per-block Summary:\n";
655 for (std::map<unsigned, PerBlockIDStats>::iterator
I = BlockIDStats.begin(),
656 E = BlockIDStats.end();
658 O.OS <<
" Block ID #" <<
I->first;
661 O.OS <<
" (" << *BlockName <<
")";
664 const PerBlockIDStats &
Stats =
I->second;
665 O.OS <<
" Num Instances: " <<
Stats.NumInstances <<
"\n";
666 O.OS <<
" Total Size: ";
669 double pct = (
Stats.NumBits * 100.0) / BufferSizeBits;
670 O.OS <<
" Percent of file: " <<
format(
"%2.4f%%", pct) <<
"\n";
671 if (
Stats.NumInstances > 1) {
672 O.OS <<
" Average Size: ";
675 O.OS <<
" Tot/Avg SubBlocks: " <<
Stats.NumSubBlocks <<
"/"
677 O.OS <<
" Tot/Avg Abbrevs: " <<
Stats.NumAbbrevs <<
"/"
678 <<
Stats.NumAbbrevs / (
double)
Stats.NumInstances <<
"\n";
679 O.OS <<
" Tot/Avg Records: " <<
Stats.NumRecords <<
"/"
682 O.OS <<
" Num SubBlocks: " <<
Stats.NumSubBlocks <<
"\n";
683 O.OS <<
" Num Abbrevs: " <<
Stats.NumAbbrevs <<
"\n";
684 O.OS <<
" Num Records: " <<
Stats.NumRecords <<
"\n";
686 if (
Stats.NumRecords) {
687 double pct = (
Stats.NumAbbreviatedRecords * 100.0) /
Stats.NumRecords;
688 O.OS <<
" Percent Abbrevs: " <<
format(
"%2.4f%%", pct) <<
"\n";
693 if (
O.Histogram && !
Stats.CodeFreq.empty()) {
694 std::vector<std::pair<unsigned, unsigned>> FreqPairs;
695 for (
unsigned i = 0,
e =
Stats.CodeFreq.size();
i !=
e; ++
i)
696 if (
unsigned Freq =
Stats.CodeFreq[
i].NumInstances)
697 FreqPairs.push_back(std::make_pair(Freq,
i));
701 O.OS <<
"\tRecord Histogram:\n";
702 O.OS <<
"\t\t Count # Bits b/Rec % Abv Record Kind\n";
703 for (
unsigned i = 0,
e = FreqPairs.size();
i !=
e; ++
i) {
704 const PerRecordStats &RecStats =
Stats.CodeFreq[FreqPairs[
i].second];
706 O.OS <<
format(
"\t\t%7d %9lu", RecStats.NumInstances,
707 (
unsigned long)RecStats.TotalBits);
709 if (RecStats.NumInstances > 1)
711 (
double)RecStats.TotalBits / RecStats.NumInstances);
715 if (RecStats.NumAbbrev)
716 O.OS <<
format(
" %7.2f", (
double)RecStats.NumAbbrev /
717 RecStats.NumInstances * 100);
723 FreqPairs[
i].second,
I->first, BlockInfo, CurStreamType))
724 O.OS << *CodeName <<
"\n";
726 O.OS <<
"UnknownCode" << FreqPairs[
i].second <<
"\n";
733 Error BitcodeAnalyzer::parseBlock(
unsigned BlockID,
unsigned IndentLevel,
736 std::string Indent(IndentLevel * 2,
' ');
740 PerBlockIDStats &BlockStats = BlockIDStats[BlockID];
742 BlockStats.NumInstances++;
745 bool DumpRecords =
O.hasValue();
748 O->OS << Indent <<
"<BLOCKINFO_BLOCK/>\n";
751 if (!MaybeNewBlockInfo)
765 unsigned NumWords = 0;
774 O->OS << Indent <<
"<";
775 if ((BlockName =
GetBlockName(BlockID, BlockInfo, CurStreamType)))
778 O->OS <<
"UnknownBlock" << BlockID;
780 if (!
O->Symbolic && BlockName)
781 O->OS <<
" BlockID=" << BlockID;
783 O->OS <<
" NumWords=" << NumWords
790 uint64_t MetadataIndexOffset = 0;
805 switch (Entry.Kind) {
810 BlockStats.NumBits += BlockBitEnd - BlockBitStart;
812 O->OS << Indent <<
"</";
814 O->OS << *BlockName <<
">\n";
816 O->OS <<
"UnknownBlock" << BlockID <<
">\n";
823 if (
Error E = parseBlock(Entry.ID, IndentLevel + 1,
O, CheckHash))
825 ++BlockStats.NumSubBlocks;
829 BlockBitStart += SubBlockBitEnd - SubBlockBitStart;
840 ++BlockStats.NumAbbrevs;
846 ++BlockStats.NumRecords;
853 unsigned Code = MaybeCode.
get();
856 if (BlockStats.CodeFreq.size() <= Code)
857 BlockStats.CodeFreq.resize(Code + 1);
858 BlockStats.CodeFreq[
Code].NumInstances++;
859 BlockStats.CodeFreq[
Code].TotalBits +=
862 BlockStats.CodeFreq[
Code].NumAbbrev++;
863 ++BlockStats.NumAbbreviatedRecords;
867 O->OS << Indent <<
" <";
869 GetCodeName(Code, BlockID, BlockInfo, CurStreamType);
873 O->OS <<
"UnknownCode" <<
Code;
874 if (!
O->Symbolic && CodeName)
875 O->OS <<
" codeid=" <<
Code;
879 O->OS <<
" abbrevid=" << Entry.ID;
882 for (
unsigned i = 0,
e =
Record.size();
i !=
e; ++
i)
883 O->OS <<
" op" <<
i <<
"=" << (int64_t)
Record[
i];
890 O->OS <<
"(Invalid record)";
897 O->OS <<
" (offset ";
898 if (MetadataIndexOffset == RecordStartBit)
901 O->OS <<
"mismatch: " << MetadataIndexOffset <<
" vs "
902 << RecordStartBit <<
")";
910 O->OS <<
" (invalid)";
915 Hasher.update(*CheckHash);
917 int BlockSize = (CurrentRecordPos / 8) - BlockEntryPos;
920 Hash = Hasher.result();
922 std::array<char, 20> RecordedHash;
924 for (
auto &Val :
Record) {
925 assert(!(Val >> 32) &&
"Unexpected high bits set");
929 if (Hash ==
StringRef(RecordedHash.data(), RecordedHash.size()))
932 O->OS <<
" (!mismatch!)";
943 assert(
i + 2 ==
e &&
"Array op not second to last");
945 bool ArrayIsPrintable =
true;
946 for (
unsigned j =
i - 1, je =
Record.size();
j != je; ++
j) {
948 ArrayIsPrintable =
false;
953 if (ArrayIsPrintable)
954 O->OS <<
" record string = '" << Str <<
"'";
961 if (
Error E = decodeMetadataStringsBlob(Indent,
Record, Blob,
O->OS))
964 O->OS <<
" blob data = ";
965 if (
O->ShowBinaryBlobs) {
967 O->OS.write_escaped(Blob,
true) <<
"'";
969 bool BlobIsPrintable =
true;
970 for (
unsigned i = 0,
e = Blob.
size();
i !=
e; ++
i)
971 if (!
isPrint(
static_cast<unsigned char>(Blob[
i]))) {
972 BlobIsPrintable =
false;
977 O->OS <<
"'" << Blob <<
"'";
979 O->OS <<
"unprintable, " << Blob.
size() <<
" bytes.";
988 if (
Error Err = Stream.JumpToBit(CurrentRecordPos))
993 return Skipped.takeError();