blob: 5913b4d665884041aead37b94e50a8ce6b429a76 [file] [log] [blame]
//===- 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_SUPPORT_DEBUGCOUNTER_H
#define MLIR_SUPPORT_DEBUGCOUNTER_H
#include "mlir/Support/DebugAction.h"
#include "llvm/ADT/StringMap.h"
#include <string>
namespace mlir {
/// This class implements a debug 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 a debug action. The "count" value is used to
/// prevent a debug 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 a debug 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 DebugActionManager::GenericHandler {
public:
DebugCounter();
~DebugCounter() override;
/// Add a counter for the given debug 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);
/// Register a counter with the specified name.
FailureOr<bool> shouldExecute(StringRef tag, StringRef description) final;
/// 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();
private:
/// 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)
: count(0), countToSkip(countToSkip),
countToStopAfter(countToStopAfter) {}
/// The current count of this counter.
int64_t count;
/// 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 mlir
#endif