1 //===- PassTimingInfo.h - pass execution timing -----------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// This header defines classes/functions to handle pass execution timing
11 /// information with interfaces for both pass managers.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_IR_PASSTIMINGINFO_H
16 #define LLVM_IR_PASSTIMINGINFO_H
18 #include "llvm/ADT/Any.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/StringMap.h"
21 #include "llvm/ADT/StringRef.h"
22 #include "llvm/Support/Timer.h"
23 #include "llvm/Support/TypeName.h"
28 class PassInstrumentationCallbacks
;
31 /// If -time-passes has been specified, report the timings immediately and then
32 /// reset the timers to zero. By default it uses the stream created by
33 /// CreateInfoOutputFile().
34 void reportAndResetTimings(raw_ostream
*OutStream
= nullptr);
36 /// Request the timer for this legacy-pass-manager's pass instance.
37 Timer
*getPassTimer(Pass
*);
39 /// If the user specifies the -time-passes argument on an LLVM tool command line
40 /// then the value of this boolean will be true, otherwise false.
41 /// This is the storage for the -time-passes option.
42 extern bool TimePassesIsEnabled
;
44 /// This class implements -time-passes functionality for new pass manager.
45 /// It provides the pass-instrumentation callbacks that measure the pass
46 /// execution time. They collect timing info into individual timers as
47 /// passes are being run. At the end of its life-time it prints the resulting
49 class TimePassesHandler
{
50 /// Value of this type is capable of uniquely identifying pass invocations.
51 /// It is a pair of string Pass-Identifier (which for now is common
52 /// to all the instance of a given pass) + sequential invocation counter.
53 using PassInvocationID
= std::pair
<StringRef
, unsigned>;
55 /// A group of all pass-timing timers.
58 /// Map of timers for pass invocations
59 DenseMap
<PassInvocationID
, std::unique_ptr
<Timer
>> TimingData
;
61 /// Map that counts invocations of passes, for use in UniqPassID construction.
62 StringMap
<unsigned> PassIDCountMap
;
64 /// Stack of currently active timers.
65 SmallVector
<Timer
*, 8> TimerStack
;
67 /// Custom output stream to print timing information into.
68 /// By default (== nullptr) we emit time report into the stream created by
69 /// CreateInfoOutputFile().
70 raw_ostream
*OutStream
= nullptr;
75 TimePassesHandler(bool Enabled
= TimePassesIsEnabled
);
77 /// Destructor handles the print action if it has not been handled before.
78 ~TimePassesHandler() { print(); }
80 /// Prints out timing information and then resets the timers.
83 // We intend this to be unique per-compilation, thus no copies.
84 TimePassesHandler(const TimePassesHandler
&) = delete;
85 void operator=(const TimePassesHandler
&) = delete;
87 void registerCallbacks(PassInstrumentationCallbacks
&PIC
);
89 /// Set a custom output stream for subsequent reporting.
90 void setOutStream(raw_ostream
&OutStream
);
93 /// Dumps information for running/triggered timers, useful for debugging
94 LLVM_DUMP_METHOD
void dump() const;
96 /// Returns the new timer for each new run of the pass.
97 Timer
&getPassTimer(StringRef PassID
);
99 /// Returns the incremented counter for the next invocation of \p PassID.
100 unsigned nextPassID(StringRef PassID
) { return ++PassIDCountMap
[PassID
]; }
102 void startTimer(StringRef PassID
);
103 void stopTimer(StringRef PassID
);
105 // Implementation of pass instrumentation callbacks.
106 bool runBeforePass(StringRef PassID
);
107 void runAfterPass(StringRef PassID
);