//===- DebugCounter.h - Debug Counter support -------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef MLIR_TRACING_DEBUGCOUNTER_H #define MLIR_TRACING_DEBUGCOUNTER_H #include "mlir/IR/Action.h" #include "llvm/ADT/StringMap.h" #include namespace mlir { namespace tracing { /// This class implements an action handler that attaches a counter value /// to debug actions and enables/disables execution of these action based on the /// value of the counter. The counter controls the execution of the action with /// a "skip" and "count" value. The "skip" value is used to skip a certain /// number of initial executions of an action. The "count" value is used to /// prevent an action from executing after it has executed for a set number /// of times (not including any executions that have been skipped). For example, /// a counter for an action with `skip=47` and `count=2`, would skip the /// first 47 executions, then execute twice, and finally prevent any further /// executions. class DebugCounter { public: DebugCounter(); ~DebugCounter(); /// Add a counter for the given action tag. `countToSkip` is the number /// of counter executions to skip before enabling execution of the action. /// `countToStopAfter` is the number of executions of the counter to allow /// before preventing the action from executing any more. void addCounter(StringRef actionTag, int64_t countToSkip, int64_t countToStopAfter); /// Entry point for handling actions. void operator()(llvm::function_ref transform, const Action &action); /// Print the counters that have been registered with this instance to the /// provided output stream. void print(raw_ostream &os) const; /// Register the command line options for debug counters. static void registerCLOptions(); /// Returns true if any of the CL options are activated. static bool isActivated(); private: // Returns true if the next action matching this tag should be executed. bool shouldExecute(StringRef tag); /// Apply the registered CL options to this debug counter instance. void applyCLOptions(); /// This struct represents a specific counter being tracked. struct Counter { Counter(int64_t countToSkip = 0, int64_t countToStopAfter = -1) : countToSkip(countToSkip), countToStopAfter(countToStopAfter) {} /// The current count of this counter. int64_t count{0}; /// The number of initial executions of this counter to skip. int64_t countToSkip; /// The number of times to execute this counter before stopping. int64_t countToStopAfter; }; /// A mapping between a given action tag and its counter information. llvm::StringMap counters; }; } // namespace tracing } // namespace mlir #endif // MLIR_TRACING_DEBUGCOUNTER_H