Statistic.h revision f9a5f780bf2ee162468749329c21e51685db649e
1//===-- Support/Statistic.h - Easy way to expose stats ----------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the 'Statistic' class, which is designed to be an easy way
11// to expose various success metrics from passes.  These statistics are printed
12// at the end of a run, when the -stats command line option is enabled on the
13// command line.
14//
15// This is useful for reporting information like the number of instructions
16// simplified, optimized or removed by various transformations, like this:
17//
18// static Statistic<> NumInstsKilled("gcse", "Number of instructions killed");
19//
20// Later, in the code: ++NumInstsKilled;
21//
22//===----------------------------------------------------------------------===//
23
24#ifndef SUPPORT_STATISTIC_H
25#define SUPPORT_STATISTIC_H
26
27#include <iostream>
28
29namespace llvm {
30
31// StatisticBase - Nontemplated base class for Statistic<> class...
32class StatisticBase {
33  const char *Name;
34  const char *Desc;
35  static unsigned NumStats;
36protected:
37  StatisticBase(const char *name, const char *desc) : Name(name), Desc(desc) {
38    ++NumStats;  // Keep track of how many stats are created...
39  }
40  virtual ~StatisticBase() {}
41
42  // destroy - Called by subclass dtor so that we can still invoke virtual
43  // functions on the subclass.
44  void destroy() const;
45
46  // printValue - Overridden by template class to print out the value type...
47  virtual void printValue(std::ostream &o) const = 0;
48
49  // hasSomeData - Return true if some data has been aquired.  Avoid printing
50  // lots of zero counts.
51  //
52  virtual bool hasSomeData() const = 0;
53};
54
55// Statistic Class - templated on the data type we are monitoring...
56template <typename DataType=unsigned>
57class Statistic : private StatisticBase {
58  DataType Value;
59
60  virtual void printValue(std::ostream &o) const { o << Value; }
61  virtual bool hasSomeData() const { return Value != DataType(); }
62public:
63  // Normal constructor, default initialize data item...
64  Statistic(const char *name, const char *desc)
65    : StatisticBase(name, desc), Value(DataType()) {}
66
67  // Constructor to provide an initial value...
68  Statistic(const DataType &Val, const char *name, const char *desc)
69    : StatisticBase(name, desc), Value(Val) {}
70
71  // Print information when destroyed, iff command line option is specified
72  ~Statistic() { destroy(); }
73
74  // Allow use of this class as the value itself...
75  operator DataType() const { return Value; }
76  const Statistic &operator=(DataType Val) { Value = Val; return *this; }
77  const Statistic &operator++() { ++Value; return *this; }
78  DataType operator++(int) { return Value++; }
79  const Statistic &operator--() { --Value; return *this; }
80  DataType operator--(int) { return Value--; }
81  const Statistic &operator+=(const DataType &V) { Value += V; return *this; }
82  const Statistic &operator-=(const DataType &V) { Value -= V; return *this; }
83};
84
85} // End llvm namespace
86
87#endif
88