diff options
author | Chris Lattner <sabre@nondot.org> | 2003-10-28 21:08:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-10-28 21:08:18 +0000 |
commit | 8b8a777e41b9b84fde221a86906a3067f1b4190a (patch) | |
tree | 9abab5fad4c160505446e7987bf3224c1bf055d9 /llvm/tools/llvm-prof/llvm-prof.cpp | |
parent | fc8bd0622f434cecd511a5785d345b4492e06732 (diff) | |
download | bcm5719-llvm-8b8a777e41b9b84fde221a86906a3067f1b4190a.tar.gz bcm5719-llvm-8b8a777e41b9b84fde221a86906a3067f1b4190a.zip |
Provide an accessor for getting function count information. Print a simple
report
llvm-svn: 9557
Diffstat (limited to 'llvm/tools/llvm-prof/llvm-prof.cpp')
-rw-r--r-- | llvm/tools/llvm-prof/llvm-prof.cpp | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/llvm/tools/llvm-prof/llvm-prof.cpp b/llvm/tools/llvm-prof/llvm-prof.cpp index e527cfecaee..cb907258e5d 100644 --- a/llvm/tools/llvm-prof/llvm-prof.cpp +++ b/llvm/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; } |