summaryrefslogtreecommitdiff
path: root/include/llvm/Bytecode/Analyzer.h
blob: d3e1b9550339ffc727103b41e5fae97835fa72ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//===-- llvm/Bytecode/Analyzer.h - Analyzer for bytecode files --*- C++ -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by Reid Spencer and is distributed under the 
// University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
// This functionality is implemented by the lib/Bytecode/Analysis library.
// This library is used to read VM bytecode files from an iostream and print
// out a diagnostic analysis of the contents of the file. It is intended for
// three uses: (a) understanding the bytecode format, (b) ensuring correctness
// of bytecode format, (c) statistical analysis of generated bytecode files.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_BYTECODE_ANALYZER_H
#define LLVM_BYTECODE_ANALYZER_H

#include <string>
#include <map>

namespace llvm {

/// This structure is used to contain the output of the Bytecode Analysis 
/// library. It simply contains fields to hold each item of the analysis 
/// results.
/// @brief Bytecode Analysis results structure
struct BytecodeAnalysis {
  unsigned byteSize;            ///< The size of the bytecode file in bytes
  unsigned numTypes;        ///< The number of types
  unsigned numValues;       ///< The number of values
  unsigned numFunctions;    ///< The number of functions defined
  unsigned numConstants;    ///< The number of constants
  unsigned numGlobalVars;   ///< The number of global variables
  unsigned numInstructions; ///< The number of instructions in all functions
  unsigned numBasicBlocks;  ///< The number of BBs in all functions
  unsigned numOperands;     ///< The number of BBs in all functions
  unsigned maxTypeSlot;     ///< The maximum slot number for types
  unsigned maxValueSlot;    ///< The maximum slot number for values
  double   density;         ///< Density of file (bytes/defs) 

  /// A structure that contains various pieces of information related to
  /// an analysis of a single function.
  struct BytecodeFunctionInfo {
    unsigned byteSize;        ///< The size of the function in bytecode bytes
    unsigned numInstructions; ///< The number of instructions in the function
    unsigned numBasicBlocks;  ///< The number of basic blocks in the function
    unsigned numOperands;     ///< The number of operands in the function
    double density;           ///< Density of function
    double vbrEffectiveness;  ///< Effectiveness of variable bit rate encoding.
    ///< This is the average number of bytes per unsigned value written in the
    ///< vbr encoding. A "perfect" score of 1.0 means all vbr values were 
    ///< encoded in one byte. A score between 1.0 and 4.0 means that some
    ///< savings were achieved. A score of 4.0 means vbr didn't help. A score
    ///< greater than 4.0 means vbr negatively impacted size of the file.
  };

  /// A mapping of function names to the collected information about the 
  /// function.
  std::map<std::string,BytecodeFunctionInfo> FunctionInfo; 

  /// Flags for what should be done
  bool dumpBytecode;
};

/// This function is the main entry point into the bytecode analysis library. It
/// allows you to simply provide a \P filename and storage for the \P Results 
/// that will be filled in with the analysis results.
/// @brief Analyze contents of a bytecode File
void AnalyzeBytecodeFile(
      const std::string& Filename, ///< The name of the bytecode file to read
      BytecodeAnalysis& Results,   ///< The results of the analysis
      std::string* ErrorStr = 0    ///< Errors, if any.
    );

/// This function is an alternate entry point into the bytecode analysis
/// library. It allows you to provide an arbitrary memory buffer which is
/// assumed to contain a complete bytecode file. The \P Buffer is analyzed and
/// the \P Results are filled in.
/// @brief Analyze contents of a bytecode buffer.
void AnalyzeBytecodeBuffer(
       const unsigned char* Buffer, ///< Pointer to start of bytecode buffer
       unsigned BufferSize,         ///< Size of the bytecode buffer
       BytecodeAnalysis& Results,   ///< The results of the analysis
       std::string* ErrorStr = 0    ///< Errors, if any.
     );

/// This function prints the contents of rhe BytecodeAnalysis structure in
/// a human legible form.
/// @brief Print BytecodeAnalysis structure to an ostream
void PrintBytecodeAnalysis(BytecodeAnalysis& bca, std::ostream& Out );

} // End llvm namespace

#endif