diff options
| author | Chris Lattner <sabre@nondot.org> | 2002-10-01 22:35:45 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2002-10-01 22:35:45 +0000 | 
| commit | c758fe6b727fa69534e6c096856ab4ff452ad400 (patch) | |
| tree | 84330d90005489b64fe375cf43c6eda3aff71e61 /llvm/lib/Support | |
| parent | 7c91242aef4d0c74910184c6282c3aef769a62d6 (diff) | |
| download | bcm5719-llvm-c758fe6b727fa69534e6c096856ab4ff452ad400.tar.gz bcm5719-llvm-c758fe6b727fa69534e6c096856ab4ff452ad400.zip  | |
  - Rework Statistics:
    * Renamed StatisticReporter.h/cpp to Statistic.h/cpp
    * Broke constructor to take two const char * arguments instead of one, so
      that indendation can be taken care of automatically.
    * Sort the list by pass name when printing
    * Make sure to print all statistics as a group, instead of randomly when
      the statistics dtors are called.
llvm-svn: 3999
Diffstat (limited to 'llvm/lib/Support')
| -rw-r--r-- | llvm/lib/Support/Statistic.cpp | 65 | 
1 files changed, 59 insertions, 6 deletions
diff --git a/llvm/lib/Support/Statistic.cpp b/llvm/lib/Support/Statistic.cpp index a6b2dbdef6a..b6c75c2adee 100644 --- a/llvm/lib/Support/Statistic.cpp +++ b/llvm/lib/Support/Statistic.cpp @@ -1,4 +1,4 @@ -//===-- StatisticReporter.cpp - Easy way to expose stats information -------==// +//===-- Statistic.cpp - Easy way to expose stats information --------------===//  //  // This file implements the 'Statistic' class, which is designed to be an easy  // way to expose various success metrics from passes.  These statistics are @@ -14,12 +14,15 @@  //  //===----------------------------------------------------------------------===// -#include "Support/StatisticReporter.h" +#include "Support/Statistic.h"  #include "Support/CommandLine.h"  #include <iostream> +#include <sstream>  bool DebugFlag;  // DebugFlag - Exported boolean set by the -debug option +unsigned StatisticBase::NumStats = 0; +  // -stats - Command line option to cause transformations to emit stats about  // what they did.  // @@ -31,12 +34,62 @@ static cl::opt<bool, true>  Debug("debug", cl::desc("Enable debug output"), cl::Hidden,        cl::location(DebugFlag)); +struct StatRecord { +  std::string Value; +  const char *Name, *Desc; + +  StatRecord(const std::string V, const char *N, const char *D) +    : Value(V), Name(N), Desc(D) {} + +  bool operator<(const StatRecord &SR) const { +    return std::strcmp(Name, SR.Name) < 0; +  } + +  void print(unsigned ValFieldSize, unsigned NameFieldSize) { +    std::cerr << std::string(ValFieldSize-Value.length(), ' ') +              << Value << " " << Name +              << std::string(NameFieldSize-std::strlen(Name), ' ') +              << " - " << Desc << "\n"; +  } +}; + +static std::vector<StatRecord> *AccumStats = 0; +  // Print information when destroyed, iff command line option is specified  void StatisticBase::destroy() const {    if (Enabled && hasSomeData()) { -    std::cerr.width(7); -    printValue(std::cerr); -    std::cerr.width(0); -    std::cerr << "\t" << Name << "\n"; +    if (AccumStats == 0) +      AccumStats = new std::vector<StatRecord>(); + +    std::ostringstream Out; +    printValue(Out); +    AccumStats->push_back(StatRecord(Out.str(), Name, Desc)); +  } + +  if (--NumStats == 0 && AccumStats) { +    // Figure out how long the biggest Value and Name fields are... +    unsigned MaxNameLen = 0, MaxValLen = 0; +    for (unsigned i = 0, e = AccumStats->size(); i != e; ++i) { +      MaxValLen = std::max(MaxValLen, (*AccumStats)[i].Value.length()); +      MaxNameLen = std::max(MaxNameLen, std::strlen((*AccumStats)[i].Name)); +    } + +    // Sort the fields... +    std::stable_sort(AccumStats->begin(), AccumStats->end()); + +    // Print out the statistics header... +    std::cerr << "===" << std::string(73, '-') << "===\n" +              << "                          ... Statistics Collected ...\n" +              << "===" << std::string(73, '-') << "===\n\n"; + +    // Print all of the statistics accumulated... +    for (unsigned i = 0, e = AccumStats->size(); i != e; ++i) +      (*AccumStats)[i].print(MaxValLen, MaxNameLen); + +    std::cerr << std::endl;  // Flush the output stream... + +    // Free all accumulated statistics... +    delete AccumStats; +    AccumStats = 0;    }  }  | 

