81 lines
3.0 KiB
C++
81 lines
3.0 KiB
C++
//===- 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 <string>
|
|
|
|
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<void()> 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<Counter> counters;
|
|
};
|
|
|
|
} // namespace tracing
|
|
} // namespace mlir
|
|
|
|
#endif // MLIR_TRACING_DEBUGCOUNTER_H
|