- if (--NumStats == 0 && AccumStats) {
- std::ostream *OutStream = GetLibSupportInfoOutputFile();
-
- // 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,
- (unsigned)(*AccumStats)[i].Value.length());
- MaxNameLen = std::max(MaxNameLen,
- (unsigned)std::strlen((*AccumStats)[i].Name));
- }
-
- // Sort the fields...
- std::stable_sort(AccumStats->begin(), AccumStats->end());
-
- // Print out the statistics header...
- *OutStream << "===" << 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, *OutStream);
-
- *OutStream << std::endl; // Flush the output stream...
-
- // Free all accumulated statistics...
- delete AccumStats;
- AccumStats = 0;
- if (OutStream != &std::cerr && OutStream != &std::cout)
- delete OutStream; // Close the file...
+ // Sort the fields by name.
+ std::stable_sort(Stats.Stats.begin(), Stats.Stats.end(),
+ [](const Statistic *LHS, const Statistic *RHS) {
+ if (int Cmp = std::strcmp(LHS->getName(), RHS->getName()))
+ return Cmp < 0;
+
+ // Secondary key is the description.
+ return std::strcmp(LHS->getDesc(), RHS->getDesc()) < 0;
+ });
+
+ // Print out the statistics header...
+ 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.Stats.size(); i != e; ++i)
+ OS << format("%*u %-*s - %s\n",
+ MaxValLen, Stats.Stats[i]->getValue(),
+ MaxNameLen, Stats.Stats[i]->getName(),
+ Stats.Stats[i]->getDesc());
+
+ OS << '\n'; // Flush the output stream.
+ OS.flush();
+
+}
+
+void llvm::PrintStatistics() {
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_STATS)
+ 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.
+#else
+ // Check if the -stats option is set instead of checking
+ // !Stats.Stats.empty(). In release builds, Statistics operators
+ // do nothing, so stats are never Registered.
+ if (Enabled) {
+ // Get the stream to write to.
+ raw_ostream &OutStream = *CreateInfoOutputFile();
+ OutStream << "Statistics are disabled. "
+ << "Build with asserts or with -DLLVM_ENABLE_STATS\n";
+ OutStream.flush();
+ delete &OutStream; // Close the file.