aboutsummaryrefslogtreecommitdiff
path: root/tools/llvm-prof/llvm-prof.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-10-28 21:08:18 +0000
committerChris Lattner <sabre@nondot.org>2003-10-28 21:08:18 +0000
commit7a78d819b77e3143b678864f8431fd0b724786d5 (patch)
tree7270739d9bf06d517d332e67a805a6f244c71779 /tools/llvm-prof/llvm-prof.cpp
parente436779c5a275e98a488b9ddbceada223f238a8b (diff)
Provide an accessor for getting function count information. Print a simple
report git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9557 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-prof/llvm-prof.cpp')
-rw-r--r--tools/llvm-prof/llvm-prof.cpp40
1 files changed, 37 insertions, 3 deletions
diff --git a/tools/llvm-prof/llvm-prof.cpp b/tools/llvm-prof/llvm-prof.cpp
index e527cfecae..cb907258e5 100644
--- a/tools/llvm-prof/llvm-prof.cpp
+++ b/tools/llvm-prof/llvm-prof.cpp
@@ -14,9 +14,11 @@
//===----------------------------------------------------------------------===//
#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;
}