Introduce namespace-scope functions to enable LLVM statistics without

passing the command-line parameter "-stats" and to print the resulting
statistics without calling llvm_shutdown().

llvm-svn: 99893
This commit is contained in:
Douglas Gregor 2010-03-30 17:32:08 +00:00
parent 9f8176a721
commit 83fd0156a9
2 changed files with 47 additions and 21 deletions

View File

@ -29,6 +29,7 @@
#include "llvm/System/Atomic.h"
namespace llvm {
class raw_ostream;
class Statistic {
public:
@ -113,6 +114,15 @@ protected:
#define STATISTIC(VARNAME, DESC) \
static llvm::Statistic VARNAME = { DEBUG_TYPE, DESC, 0, 0 }
/// \brief Enable the collection and printing of statistics.
void EnableStatistics();
/// \brief Print statistics to the file returned by CreateInfoOutputFile().
void PrintStatistics();
/// \brief Print statistics to the given output stream.
void PrintStatistics(raw_ostream &OS);
} // End llvm namespace
#endif

View File

@ -48,6 +48,8 @@ namespace {
/// llvm_shutdown is called. We print statistics from the destructor.
class StatisticInfo {
std::vector<const Statistic*> Stats;
friend void llvm::PrintStatistics();
friend void llvm::PrintStatistics(raw_ostream &OS);
public:
~StatisticInfo();
@ -92,41 +94,55 @@ struct NameCompare {
// Print information when destroyed, iff command line option is specified.
StatisticInfo::~StatisticInfo() {
// Statistics not enabled?
if (Stats.empty()) return;
llvm::PrintStatistics();
}
// Get the stream to write to.
raw_ostream &OutStream = *CreateInfoOutputFile();
void llvm::EnableStatistics() {
Enabled.setValue(true);
}
void llvm::PrintStatistics(raw_ostream &OS) {
StatisticInfo &Stats = *StatInfo;
// Figure out how long the biggest Value and Name fields are.
unsigned MaxNameLen = 0, MaxValLen = 0;
for (size_t i = 0, e = Stats.size(); i != e; ++i) {
for (size_t i = 0, e = Stats.Stats.size(); i != e; ++i) {
MaxValLen = std::max(MaxValLen,
(unsigned)utostr(Stats[i]->getValue()).size());
(unsigned)utostr(Stats.Stats[i]->getValue()).size());
MaxNameLen = std::max(MaxNameLen,
(unsigned)std::strlen(Stats[i]->getName()));
(unsigned)std::strlen(Stats.Stats[i]->getName()));
}
// Sort the fields by name.
std::stable_sort(Stats.begin(), Stats.end(), NameCompare());
std::stable_sort(Stats.Stats.begin(), Stats.Stats.end(), NameCompare());
// Print out the statistics header...
OutStream << "===" << std::string(73, '-') << "===\n"
<< " ... Statistics Collected ...\n"
<< "===" << std::string(73, '-') << "===\n\n";
OS << "===" << std::string(73, '-') << "===\n"
<< " ... Statistics Collected ...\n"
<< "===" << std::string(73, '-') << "===\n\n";
// Print all of the statistics.
for (size_t i = 0, e = Stats.size(); i != e; ++i) {
std::string CountStr = utostr(Stats[i]->getValue());
OutStream << std::string(MaxValLen-CountStr.size(), ' ')
<< CountStr << " " << Stats[i]->getName()
<< std::string(MaxNameLen-std::strlen(Stats[i]->getName()), ' ')
<< " - " << Stats[i]->getDesc() << "\n";
for (size_t i = 0, e = Stats.Stats.size(); i != e; ++i) {
std::string CountStr = utostr(Stats.Stats[i]->getValue());
OS << std::string(MaxValLen-CountStr.size(), ' ')
<< CountStr << " " << Stats.Stats[i]->getName()
<< std::string(MaxNameLen-std::strlen(Stats.Stats[i]->getName()), ' ')
<< " - " << Stats.Stats[i]->getDesc() << "\n";
}
OutStream << '\n'; // Flush the output stream.
OutStream.flush();
OS << '\n'; // Flush the output stream.
OS.flush();
}
void llvm::PrintStatistics() {
StatisticInfo &Stats = *StatInfo;
// Statistics not enabled?
if (Stats.Stats.empty()) return;
// Get the stream to write to.
raw_ostream &OutStream = *CreateInfoOutputFile();
PrintStatistics(OutStream);
delete &OutStream; // Close the file.
}