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) countToSkipCounter63 : 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