Home | History | Annotate | Line # | Download | only in Bitcode
      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/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 
     25 namespace llvm {
     26 
     27 /// CurStreamTypeType - A type for CurStreamType
     28 enum CurStreamTypeType {
     29   UnknownBitstream,
     30   LLVMIRBitstream,
     31   ClangSerializedASTBitstream,
     32   ClangSerializedDiagnosticsBitstream,
     33   LLVMBitstreamRemarks
     34 };
     35 
     36 struct 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 
     49 class 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 
     84 public:
     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 
     92 private:
     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_BITCODEANALYZER_H
    105