BitcodeAnalyzer.h revision 360784
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_BITCODE_ANALYZER_H 14#define LLVM_BITCODE_BITCODE_ANALYZER_H 15 16#include "llvm/ADT/ArrayRef.h" 17#include "llvm/ADT/Optional.h" 18#include "llvm/ADT/StringRef.h" 19#include "llvm/Bitstream/BitstreamReader.h" 20#include "llvm/Support/Error.h" 21#include "llvm/Support/raw_ostream.h" 22#include <map> 23#include <vector> 24 25namespace llvm { 26 27/// CurStreamTypeType - A type for CurStreamType 28enum CurStreamTypeType { 29 UnknownBitstream, 30 LLVMIRBitstream, 31 ClangSerializedASTBitstream, 32 ClangSerializedDiagnosticsBitstream, 33 LLVMBitstreamRemarks 34}; 35 36struct BCDumpOptions { 37 /// The stream. 38 raw_ostream &OS; 39 /// Print per-code histogram. 40 bool Histogram = false; 41 /// Don't emit numeric info in dump if symbolic info is available. 42 bool Symbolic = false; 43 /// Print binary blobs using hex escapes. 44 bool ShowBinaryBlobs = false; 45 46 BCDumpOptions(raw_ostream &OS) : OS(OS) {} 47}; 48 49class BitcodeAnalyzer { 50 BitstreamCursor Stream; 51 BitstreamBlockInfo BlockInfo; 52 CurStreamTypeType CurStreamType; 53 Optional<BitstreamCursor> BlockInfoStream; 54 unsigned NumTopBlocks = 0; 55 56 struct PerRecordStats { 57 unsigned NumInstances; 58 unsigned NumAbbrev; 59 uint64_t TotalBits; 60 PerRecordStats() : NumInstances(0), NumAbbrev(0), TotalBits(0) {} 61 }; 62 63 struct PerBlockIDStats { 64 /// NumInstances - This the number of times this block ID has been seen. 65 unsigned NumInstances; 66 /// NumBits - The total size in bits of all of these blocks. 67 uint64_t NumBits; 68 /// NumSubBlocks - The total number of blocks these blocks contain. 69 unsigned NumSubBlocks; 70 /// NumAbbrevs - The total number of abbreviations. 71 unsigned NumAbbrevs; 72 /// NumRecords - The total number of records these blocks contain, and the 73 /// number that are abbreviated. 74 unsigned NumRecords, NumAbbreviatedRecords; 75 /// CodeFreq - Keep track of the number of times we see each code. 76 std::vector<PerRecordStats> CodeFreq; 77 PerBlockIDStats() 78 : NumInstances(0), NumBits(0), NumSubBlocks(0), NumAbbrevs(0), 79 NumRecords(0), NumAbbreviatedRecords(0) {} 80 }; 81 82 std::map<unsigned, PerBlockIDStats> BlockIDStats; 83 84public: 85 BitcodeAnalyzer(StringRef Buffer, Optional<StringRef> BlockInfoBuffer = None); 86 /// Analyze the bitcode file. 87 Error analyze(Optional<BCDumpOptions> O = None, 88 Optional<StringRef> CheckHash = None); 89 /// Print stats about the bitcode file. 90 void printStats(BCDumpOptions O, Optional<StringRef> Filename = None); 91 92private: 93 /// Read a block, updating statistics, etc. 94 Error parseBlock(unsigned BlockID, unsigned IndentLevel, 95 Optional<BCDumpOptions> O = None, 96 Optional<StringRef> CheckHash = None); 97 98 Error decodeMetadataStringsBlob(StringRef Indent, ArrayRef<uint64_t> Record, 99 StringRef Blob, raw_ostream &OS); 100}; 101 102} // end namespace llvm 103 104#endif // LLVM_BITCODE_BITCODE_ANALYZER_H 105