123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|