1 | //===- DebugCounter.h - Debug Counter support -------------------*- C++ -*-===// |
2 | // |
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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef MLIR_TRACING_DEBUGCOUNTER_H |
10 | #define MLIR_TRACING_DEBUGCOUNTER_H |
11 | |
12 | #include "mlir/IR/Action.h" |
13 | #include "llvm/ADT/StringMap.h" |
14 | #include <string> |
15 | |
16 | namespace mlir { |
17 | namespace tracing { |
18 | |
19 | /// This class implements an action handler that attaches a counter value |
20 | /// to debug actions and enables/disables execution of these action based on the |
21 | /// value of the counter. The counter controls the execution of the action with |
22 | /// a "skip" and "count" value. The "skip" value is used to skip a certain |
23 | /// number of initial executions of an action. The "count" value is used to |
24 | /// prevent an action from executing after it has executed for a set number |
25 | /// of times (not including any executions that have been skipped). For example, |
26 | /// a counter for an action with `skip=47` and `count=2`, would skip the |
27 | /// first 47 executions, then execute twice, and finally prevent any further |
28 | /// executions. |
29 | class DebugCounter { |
30 | public: |
31 | DebugCounter(); |
32 | ~DebugCounter(); |
33 | |
34 | /// Add a counter for the given action tag. `countToSkip` is the number |
35 | /// of counter executions to skip before enabling execution of the action. |
36 | /// `countToStopAfter` is the number of executions of the counter to allow |
37 | /// before preventing the action from executing any more. |
38 | void addCounter(StringRef actionTag, int64_t countToSkip, |
39 | int64_t countToStopAfter); |
40 | |
41 | /// Entry point for handling actions. |
42 | void operator()(llvm::function_ref<void()> transform, const Action &action); |
43 | |
44 | /// Print the counters that have been registered with this instance to the |
45 | /// provided output stream. |
46 | void print(raw_ostream &os) const; |
47 | |
48 | /// Register the command line options for debug counters. |
49 | static void registerCLOptions(); |
50 | /// Returns true if any of the CL options are activated. |
51 | static bool isActivated(); |
52 | |
53 | private: |
54 | // Returns true if the next action matching this tag should be executed. |
55 | bool shouldExecute(StringRef tag); |
56 | |
57 | /// Apply the registered CL options to this debug counter instance. |
58 | void applyCLOptions(); |
59 | |
60 | /// This struct represents a specific counter being tracked. |
61 | struct Counter { |
62 | Counter(int64_t countToSkip = 0, int64_t countToStopAfter = -1) |
63 | : countToSkip(countToSkip), countToStopAfter(countToStopAfter) {} |
64 | |
65 | /// The current count of this counter. |
66 | int64_t count{0}; |
67 | /// The number of initial executions of this counter to skip. |
68 | int64_t countToSkip; |
69 | /// The number of times to execute this counter before stopping. |
70 | int64_t countToStopAfter; |
71 | }; |
72 | |
73 | /// A mapping between a given action tag and its counter information. |
74 | llvm::StringMap<Counter> counters; |
75 | }; |
76 | |
77 | } // namespace tracing |
78 | } // namespace mlir |
79 | |
80 | #endif // MLIR_TRACING_DEBUGCOUNTER_H |
81 | |