1 //===- llvm-prof.cpp - Read in and process llvmprof.out data files --------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This tools is meant for use with the various LLVM profiling instrumentation
11 // passes. It reads in the data file produced by executing an instrumented
12 // program, and outputs a nice report.
14 //===----------------------------------------------------------------------===//
16 #include "llvm/InstrTypes.h"
17 #include "llvm/LLVMContext.h"
18 #include "llvm/Module.h"
19 #include "llvm/PassManager.h"
20 #include "llvm/Assembly/AsmAnnotationWriter.h"
21 #include "llvm/Analysis/ProfileInfo.h"
22 #include "llvm/Analysis/ProfileInfoLoader.h"
23 #include "llvm/Analysis/Passes.h"
24 #include "llvm/Bitcode/ReaderWriter.h"
25 #include "llvm/Support/CommandLine.h"
26 #include "llvm/Support/ManagedStatic.h"
27 #include "llvm/Support/MemoryBuffer.h"
28 #include "llvm/Support/PrettyStackTrace.h"
29 #include "llvm/Support/raw_ostream.h"
30 #include "llvm/Support/Format.h"
31 #include "llvm/System/Signals.h"
41 BitcodeFile(cl::Positional
, cl::desc("<program bitcode file>"),
45 ProfileDataFile(cl::Positional
, cl::desc("<llvmprof.out file>"),
46 cl::Optional
, cl::init("llvmprof.out"));
49 PrintAnnotatedLLVM("annotated-llvm",
50 cl::desc("Print LLVM code with frequency annotations"));
51 cl::alias
PrintAnnotated2("A", cl::desc("Alias for --annotated-llvm"),
52 cl::aliasopt(PrintAnnotatedLLVM
));
54 PrintAllCode("print-all-code",
55 cl::desc("Print annotated code for the entire program"));
58 // PairSecondSort - A sorting predicate to sort by the second element of a pair.
60 struct PairSecondSortReverse
61 : public std::binary_function
<std::pair
<T
, double>,
62 std::pair
<T
, double>, bool> {
63 bool operator()(const std::pair
<T
, double> &LHS
,
64 const std::pair
<T
, double> &RHS
) const {
65 return LHS
.second
> RHS
.second
;
69 static double ignoreMissing(double w
) {
70 if (w
== ProfileInfo::MissingValue
) return 0;
75 class ProfileAnnotator
: public AssemblyAnnotationWriter
{
78 ProfileAnnotator(ProfileInfo
& pi
) : PI(pi
) {}
80 virtual void emitFunctionAnnot(const Function
*F
, raw_ostream
&OS
) {
81 double w
= PI
.getExecutionCount(F
);
82 if (w
!= ProfileInfo::MissingValue
) {
83 OS
<< ";;; %" << F
->getName() << " called "<<(unsigned)w
87 virtual void emitBasicBlockStartAnnot(const BasicBlock
*BB
,
89 double w
= PI
.getExecutionCount(BB
);
90 if (w
!= ProfileInfo::MissingValue
) {
92 OS
<< "\t;;; Basic block executed " << (unsigned)w
<< " times.\n";
94 OS
<< "\t;;; Never executed!\n";
99 virtual void emitBasicBlockEndAnnot(const BasicBlock
*BB
, raw_ostream
&OS
) {
100 // Figure out how many times each successor executed.
101 std::vector
<std::pair
<ProfileInfo::Edge
, double> > SuccCounts
;
103 const TerminatorInst
*TI
= BB
->getTerminator();
104 for (unsigned s
= 0, e
= TI
->getNumSuccessors(); s
!= e
; ++s
) {
105 BasicBlock
* Succ
= TI
->getSuccessor(s
);
106 double w
= ignoreMissing(PI
.getEdgeWeight(std::make_pair(BB
, Succ
)));
108 SuccCounts
.push_back(std::make_pair(std::make_pair(BB
, Succ
), w
));
110 if (!SuccCounts
.empty()) {
111 OS
<< "\t;;; Out-edge counts:";
112 for (unsigned i
= 0, e
= SuccCounts
.size(); i
!= e
; ++i
)
113 OS
<< " [" << (SuccCounts
[i
]).second
<< " -> "
114 << (SuccCounts
[i
]).first
.second
->getName() << "]";
122 /// ProfileInfoPrinterPass - Helper pass to dump the profile information for
125 // FIXME: This should move elsewhere.
126 class ProfileInfoPrinterPass
: public ModulePass
{
127 ProfileInfoLoader
&PIL
;
129 static char ID
; // Class identification, replacement for typeinfo.
130 explicit ProfileInfoPrinterPass(ProfileInfoLoader
&_PIL
)
131 : ModulePass(&ID
), PIL(_PIL
) {}
133 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
134 AU
.setPreservesAll();
135 AU
.addRequired
<ProfileInfo
>();
138 bool runOnModule(Module
&M
);
142 char ProfileInfoPrinterPass::ID
= 0;
144 bool ProfileInfoPrinterPass::runOnModule(Module
&M
) {
145 ProfileInfo
&PI
= getAnalysis
<ProfileInfo
>();
146 std::map
<const Function
*, unsigned> FuncFreqs
;
147 std::map
<const BasicBlock
*, unsigned> BlockFreqs
;
148 std::map
<ProfileInfo::Edge
, unsigned> EdgeFreqs
;
150 // Output a report. Eventually, there will be multiple reports selectable on
151 // the command line, for now, just keep things simple.
153 // Emit the most frequent function table...
154 std::vector
<std::pair
<Function
*, double> > FunctionCounts
;
155 std::vector
<std::pair
<BasicBlock
*, double> > Counts
;
156 for (Module::iterator FI
= M
.begin(), FE
= M
.end(); FI
!= FE
; ++FI
) {
157 if (FI
->isDeclaration()) continue;
158 double w
= ignoreMissing(PI
.getExecutionCount(FI
));
159 FunctionCounts
.push_back(std::make_pair(FI
, w
));
160 for (Function::iterator BB
= FI
->begin(), BBE
= FI
->end();
162 double w
= ignoreMissing(PI
.getExecutionCount(BB
));
163 Counts
.push_back(std::make_pair(BB
, w
));
167 // Sort by the frequency, backwards.
168 sort(FunctionCounts
.begin(), FunctionCounts
.end(),
169 PairSecondSortReverse
<Function
*>());
171 double TotalExecutions
= 0;
172 for (unsigned i
= 0, e
= FunctionCounts
.size(); i
!= e
; ++i
)
173 TotalExecutions
+= FunctionCounts
[i
].second
;
175 outs() << "===" << std::string(73, '-') << "===\n"
176 << "LLVM profiling output for execution";
177 if (PIL
.getNumExecutions() != 1) outs() << "s";
180 for (unsigned i
= 0, e
= PIL
.getNumExecutions(); i
!= e
; ++i
) {
182 if (e
!= 1) outs() << i
+1 << ". ";
183 outs() << PIL
.getExecution(i
) << "\n";
186 outs() << "\n===" << std::string(73, '-') << "===\n";
187 outs() << "Function execution frequencies:\n\n";
189 // Print out the function frequencies...
190 outs() << " ## Frequency\n";
191 for (unsigned i
= 0, e
= FunctionCounts
.size(); i
!= e
; ++i
) {
192 if (FunctionCounts
[i
].second
== 0) {
193 outs() << "\n NOTE: " << e
-i
<< " function"
194 << (e
-i
-1 ? "s were" : " was") << " never executed!\n";
198 outs() << format("%3d", i
+1) << ". "
199 << format("%5.2g", FunctionCounts
[i
].second
) << "/"
200 << format("%g", TotalExecutions
) << " "
201 << FunctionCounts
[i
].first
->getNameStr() << "\n";
204 std::set
<Function
*> FunctionsToPrint
;
207 for (unsigned i
= 0, e
= Counts
.size(); i
!= e
; ++i
)
208 TotalExecutions
+= Counts
[i
].second
;
210 // Sort by the frequency, backwards.
211 sort(Counts
.begin(), Counts
.end(),
212 PairSecondSortReverse
<BasicBlock
*>());
214 outs() << "\n===" << std::string(73, '-') << "===\n";
215 outs() << "Top 20 most frequently executed basic blocks:\n\n";
217 // Print out the function frequencies...
218 outs() <<" ## %% \tFrequency\n";
219 unsigned BlocksToPrint
= Counts
.size();
220 if (BlocksToPrint
> 20) BlocksToPrint
= 20;
221 for (unsigned i
= 0; i
!= BlocksToPrint
; ++i
) {
222 if (Counts
[i
].second
== 0) break;
223 Function
*F
= Counts
[i
].first
->getParent();
224 outs() << format("%3d", i
+1) << ". "
225 << format("%5g", Counts
[i
].second
/(double)TotalExecutions
*100) << "% "
226 << format("%5.0f", Counts
[i
].second
) << "/"
227 << format("%g", TotalExecutions
) << "\t"
228 << F
->getNameStr() << "() - "
229 << Counts
[i
].first
->getNameStr() << "\n";
230 FunctionsToPrint
.insert(F
);
233 if (PrintAnnotatedLLVM
|| PrintAllCode
) {
234 outs() << "\n===" << std::string(73, '-') << "===\n";
235 outs() << "Annotated LLVM code for the module:\n\n";
237 ProfileAnnotator
PA(PI
);
239 if (FunctionsToPrint
.empty() || PrintAllCode
)
240 M
.print(outs(), &PA
);
242 // Print just a subset of the functions.
243 for (std::set
<Function
*>::iterator I
= FunctionsToPrint
.begin(),
244 E
= FunctionsToPrint
.end(); I
!= E
; ++I
)
245 (*I
)->print(outs(), &PA
);
251 int main(int argc
, char **argv
) {
252 // Print a stack trace if we signal out.
253 sys::PrintStackTraceOnErrorSignal();
254 PrettyStackTraceProgram
X(argc
, argv
);
256 LLVMContext
&Context
= getGlobalContext();
257 llvm_shutdown_obj Y
; // Call llvm_shutdown() on exit.
259 cl::ParseCommandLineOptions(argc
, argv
, "llvm profile dump decoder\n");
261 // Read in the bitcode file...
262 std::string ErrorMessage
;
264 if (MemoryBuffer
*Buffer
= MemoryBuffer::getFileOrSTDIN(BitcodeFile
,
266 M
= ParseBitcodeFile(Buffer
, Context
, &ErrorMessage
);
270 errs() << argv
[0] << ": " << BitcodeFile
<< ": "
271 << ErrorMessage
<< "\n";
275 // Read the profiling information. This is redundant since we load it again
276 // using the standard profile info provider pass, but for now this gives us
277 // access to additional information not exposed via the ProfileInfo
279 ProfileInfoLoader
PIL(argv
[0], ProfileDataFile
, *M
);
281 // Run the printer pass.
283 PassMgr
.add(createProfileLoaderPass(ProfileDataFile
));
284 PassMgr
.add(new ProfileInfoPrinterPass(PIL
));
288 } catch (const std::string
& msg
) {
289 errs() << argv
[0] << ": " << msg
<< "\n";
291 errs() << argv
[0] << ": Unexpected unknown exception occurred.\n";