Provide an accessor for getting function count information. Print a simple
[oota-llvm.git] / tools / llvm-prof / llvm-prof.cpp
index e527cfecaeea2e4e27c85ee58b27c9f3630cd85e..cb907258e5d76785a6f03485109ada2cf48e4bc8 100644 (file)
 //===----------------------------------------------------------------------===//
 
 #include "ProfileInfo.h"
+#include "llvm/Function.h"
 #include "llvm/Bytecode/Reader.h"
 #include "Support/CommandLine.h"
 #include <iostream>
+#include <cstdio>
 
 namespace {
   cl::opt<std::string> 
@@ -28,20 +30,52 @@ namespace {
                   cl::Optional, cl::init("llvmprof.out"));
 }
 
+// PairSecondSort - A sorting predicate to sort by the second element of a pair.
+template<class T>
+struct PairSecondSort
+  : public std::binary_function<std::pair<T, unsigned>,
+                                std::pair<T, unsigned>, bool> {
+  bool operator()(const std::pair<T, unsigned> &LHS,
+                  const std::pair<T, unsigned> &RHS) const {
+    return LHS.second < RHS.second;
+  }
+};
+
+
 int main(int argc, char **argv) {
   cl::ParseCommandLineOptions(argc, argv, " llvm profile dump decoder\n");
 
   // Read in the bytecode file...
   std::string ErrorMessage;
-  Module *Result = ParseBytecodeFile(BytecodeFile, &ErrorMessage);
-  if (Result == 0) {
+  Module *M = ParseBytecodeFile(BytecodeFile, &ErrorMessage);
+  if (M == 0) {
     std::cerr << argv[0] << ": " << BytecodeFile << ": " << ErrorMessage
               << "\n";
     return 1;
   }
 
   // Read the profiling information
-  ProfileInfo PI(argv[0], ProfileDataFile);
+  ProfileInfo PI(argv[0], ProfileDataFile, *M);
+
+  // Output a report.  Eventually, there will be multiple reports selectable on
+  // the command line, for now, just keep things simple.
+
+  // Emit the most frequent function table...
+  std::vector<std::pair<Function*, unsigned> > FunctionCounts;
+  PI.getFunctionCounts(FunctionCounts);
+
+  // Sort by the frequency, backwards.
+  std::sort(FunctionCounts.begin(), FunctionCounts.end(),
+            std::not2(PairSecondSort<Function*>()));
 
+  unsigned TotalExecutions = 0;
+  for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i)
+    TotalExecutions += FunctionCounts[i].second;
+  
+  // Print out the function frequencies...
+  printf(" ##   Frequency\n");
+  for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i)
+    printf("%3d. %5d/%d %s\n", i, FunctionCounts[i].second, TotalExecutions,
+           FunctionCounts[i].first->getName().c_str());
   return 0;
 }