//===- PassTimingInfo.h - pass execution timing -----------------*- 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
 
//
 
//===----------------------------------------------------------------------===//
 
/// \file
 
///
 
/// This header defines classes/functions to handle pass execution timing
 
/// information with interfaces for both pass managers.
 
///
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_IR_PASSTIMINGINFO_H
 
#define LLVM_IR_PASSTIMINGINFO_H
 
 
 
#include "llvm/ADT/SmallVector.h"
 
#include "llvm/ADT/StringMap.h"
 
#include "llvm/ADT/StringRef.h"
 
#include "llvm/Support/Timer.h"
 
#include <memory>
 
#include <utility>
 
 
 
namespace llvm {
 
 
 
class Pass;
 
class PassInstrumentationCallbacks;
 
class raw_ostream;
 
 
 
/// If -time-passes has been specified, report the timings immediately and then
 
/// reset the timers to zero. By default it uses the stream created by
 
/// CreateInfoOutputFile().
 
void reportAndResetTimings(raw_ostream *OutStream = nullptr);
 
 
 
/// Request the timer for this legacy-pass-manager's pass instance.
 
Timer *getPassTimer(Pass *);
 
 
 
/// This class implements -time-passes functionality for new pass manager.
 
/// It provides the pass-instrumentation callbacks that measure the pass
 
/// execution time. They collect timing info into individual timers as
 
/// passes are being run. At the end of its life-time it prints the resulting
 
/// timing report.
 
class TimePassesHandler {
 
  /// Value of this type is capable of uniquely identifying pass invocations.
 
  /// It is a pair of string Pass-Identifier (which for now is common
 
  /// to all the instance of a given pass) + sequential invocation counter.
 
  using PassInvocationID = std::pair<StringRef, unsigned>;
 
 
 
  /// Groups of timers for passes and analyses.
 
  TimerGroup PassTG;
 
  TimerGroup AnalysisTG;
 
 
 
  using TimerVector = llvm::SmallVector<std::unique_ptr<Timer>, 4>;
 
  /// Map of timers for pass invocations
 
  StringMap<TimerVector> TimingData;
 
 
 
  /// Currently active pass timer.
 
  Timer *ActivePassTimer = nullptr;
 
  /// Stack of currently active analysis timers. Analyses can request other
 
  /// analyses.
 
  SmallVector<Timer *, 8> AnalysisActiveTimerStack;
 
 
 
  /// Custom output stream to print timing information into.
 
  /// By default (== nullptr) we emit time report into the stream created by
 
  /// CreateInfoOutputFile().
 
  raw_ostream *OutStream = nullptr;
 
 
 
  bool Enabled;
 
  bool PerRun;
 
 
 
public:
 
  TimePassesHandler();
 
  TimePassesHandler(bool Enabled, bool PerRun = false);
 
 
 
  /// Destructor handles the print action if it has not been handled before.
 
  ~TimePassesHandler() { print(); }
 
 
 
  /// Prints out timing information and then resets the timers.
 
  void print();
 
 
 
  // We intend this to be unique per-compilation, thus no copies.
 
  TimePassesHandler(const TimePassesHandler &) = delete;
 
  void operator=(const TimePassesHandler &) = delete;
 
 
 
  void registerCallbacks(PassInstrumentationCallbacks &PIC);
 
 
 
  /// Set a custom output stream for subsequent reporting.
 
  void setOutStream(raw_ostream &OutStream);
 
 
 
private:
 
  /// Dumps information for running/triggered timers, useful for debugging
 
  LLVM_DUMP_METHOD void dump() const;
 
 
 
  /// Returns the new timer for each new run of the pass.
 
  Timer &getPassTimer(StringRef PassID, bool IsPass);
 
 
 
  void startAnalysisTimer(StringRef PassID);
 
  void stopAnalysisTimer(StringRef PassID);
 
  void startPassTimer(StringRef PassID);
 
  void stopPassTimer(StringRef PassID);
 
};
 
 
 
} // namespace llvm
 
 
 
#endif