Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===- llvm/Bitcode/BitcodeAnalyzer.h - Bitcode analyzer --------*- C++ -*-===// |
| 2 | // |
||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
| 6 | // |
||
| 7 | //===----------------------------------------------------------------------===// |
||
| 8 | // |
||
| 9 | // This header defines interfaces to analyze LLVM bitcode files/streams. |
||
| 10 | // |
||
| 11 | //===----------------------------------------------------------------------===// |
||
| 12 | |||
| 13 | #ifndef LLVM_BITCODE_BITCODEANALYZER_H |
||
| 14 | #define LLVM_BITCODE_BITCODEANALYZER_H |
||
| 15 | |||
| 16 | #include "llvm/ADT/ArrayRef.h" |
||
| 17 | #include "llvm/ADT/StringRef.h" |
||
| 18 | #include "llvm/Bitstream/BitstreamReader.h" |
||
| 19 | #include "llvm/Support/Error.h" |
||
| 20 | #include <map> |
||
| 21 | #include <optional> |
||
| 22 | #include <vector> |
||
| 23 | |||
| 24 | namespace llvm { |
||
| 25 | |||
| 26 | class raw_ostream; |
||
| 27 | |||
| 28 | /// CurStreamTypeType - A type for CurStreamType |
||
| 29 | enum CurStreamTypeType { |
||
| 30 | UnknownBitstream, |
||
| 31 | LLVMIRBitstream, |
||
| 32 | ClangSerializedASTBitstream, |
||
| 33 | ClangSerializedDiagnosticsBitstream, |
||
| 34 | LLVMBitstreamRemarks |
||
| 35 | }; |
||
| 36 | |||
| 37 | struct BCDumpOptions { |
||
| 38 | /// The stream. |
||
| 39 | raw_ostream &OS; |
||
| 40 | /// Print per-code histogram. |
||
| 41 | bool Histogram = false; |
||
| 42 | /// Don't emit numeric info in dump if symbolic info is available. |
||
| 43 | bool Symbolic = false; |
||
| 44 | /// Print binary blobs using hex escapes. |
||
| 45 | bool ShowBinaryBlobs = false; |
||
| 46 | /// Print BLOCKINFO block details. |
||
| 47 | bool DumpBlockinfo = false; |
||
| 48 | |||
| 49 | BCDumpOptions(raw_ostream &OS) : OS(OS) {} |
||
| 50 | }; |
||
| 51 | |||
| 52 | class BitcodeAnalyzer { |
||
| 53 | BitstreamCursor Stream; |
||
| 54 | BitstreamBlockInfo BlockInfo; |
||
| 55 | CurStreamTypeType CurStreamType; |
||
| 56 | std::optional<BitstreamCursor> BlockInfoStream; |
||
| 57 | unsigned NumTopBlocks = 0; |
||
| 58 | |||
| 59 | struct PerRecordStats { |
||
| 60 | unsigned NumInstances; |
||
| 61 | unsigned NumAbbrev; |
||
| 62 | uint64_t TotalBits; |
||
| 63 | PerRecordStats() : NumInstances(0), NumAbbrev(0), TotalBits(0) {} |
||
| 64 | }; |
||
| 65 | |||
| 66 | struct PerBlockIDStats { |
||
| 67 | /// NumInstances - This the number of times this block ID has been seen. |
||
| 68 | unsigned NumInstances; |
||
| 69 | /// NumBits - The total size in bits of all of these blocks. |
||
| 70 | uint64_t NumBits; |
||
| 71 | /// NumSubBlocks - The total number of blocks these blocks contain. |
||
| 72 | unsigned NumSubBlocks; |
||
| 73 | /// NumAbbrevs - The total number of abbreviations. |
||
| 74 | unsigned NumAbbrevs; |
||
| 75 | /// NumRecords - The total number of records these blocks contain, and the |
||
| 76 | /// number that are abbreviated. |
||
| 77 | unsigned NumRecords, NumAbbreviatedRecords; |
||
| 78 | /// CodeFreq - Keep track of the number of times we see each code. |
||
| 79 | std::vector<PerRecordStats> CodeFreq; |
||
| 80 | PerBlockIDStats() |
||
| 81 | : NumInstances(0), NumBits(0), NumSubBlocks(0), NumAbbrevs(0), |
||
| 82 | NumRecords(0), NumAbbreviatedRecords(0) {} |
||
| 83 | }; |
||
| 84 | |||
| 85 | std::map<unsigned, PerBlockIDStats> BlockIDStats; |
||
| 86 | |||
| 87 | public: |
||
| 88 | BitcodeAnalyzer(StringRef Buffer, |
||
| 89 | std::optional<StringRef> BlockInfoBuffer = std::nullopt); |
||
| 90 | /// Analyze the bitcode file. |
||
| 91 | Error analyze(std::optional<BCDumpOptions> O = std::nullopt, |
||
| 92 | std::optional<StringRef> CheckHash = std::nullopt); |
||
| 93 | /// Print stats about the bitcode file. |
||
| 94 | void printStats(BCDumpOptions O, |
||
| 95 | std::optional<StringRef> Filename = std::nullopt); |
||
| 96 | |||
| 97 | private: |
||
| 98 | /// Read a block, updating statistics, etc. |
||
| 99 | Error parseBlock(unsigned BlockID, unsigned IndentLevel, |
||
| 100 | std::optional<BCDumpOptions> O = std::nullopt, |
||
| 101 | std::optional<StringRef> CheckHash = std::nullopt); |
||
| 102 | |||
| 103 | Error decodeMetadataStringsBlob(StringRef Indent, ArrayRef<uint64_t> Record, |
||
| 104 | StringRef Blob, raw_ostream &OS); |
||
| 105 | }; |
||
| 106 | |||
| 107 | } // end namespace llvm |
||
| 108 | |||
| 109 | #endif // LLVM_BITCODE_BITCODEANALYZER_H |