Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- PassTimingInfo.h - pass execution timing -----------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. /// \file
  9. ///
  10. /// This header defines classes/functions to handle pass execution timing
  11. /// information with interfaces for both pass managers.
  12. ///
  13. //===----------------------------------------------------------------------===//
  14.  
  15. #ifndef LLVM_IR_PASSTIMINGINFO_H
  16. #define LLVM_IR_PASSTIMINGINFO_H
  17.  
  18. #include "llvm/ADT/SmallVector.h"
  19. #include "llvm/ADT/StringMap.h"
  20. #include "llvm/ADT/StringRef.h"
  21. #include "llvm/Support/Timer.h"
  22. #include <memory>
  23. #include <utility>
  24.  
  25. namespace llvm {
  26.  
  27. class Pass;
  28. class PassInstrumentationCallbacks;
  29. class raw_ostream;
  30.  
  31. /// If -time-passes has been specified, report the timings immediately and then
  32. /// reset the timers to zero. By default it uses the stream created by
  33. /// CreateInfoOutputFile().
  34. void reportAndResetTimings(raw_ostream *OutStream = nullptr);
  35.  
  36. /// Request the timer for this legacy-pass-manager's pass instance.
  37. Timer *getPassTimer(Pass *);
  38.  
  39. /// This class implements -time-passes functionality for new pass manager.
  40. /// It provides the pass-instrumentation callbacks that measure the pass
  41. /// execution time. They collect timing info into individual timers as
  42. /// passes are being run. At the end of its life-time it prints the resulting
  43. /// timing report.
  44. class TimePassesHandler {
  45.   /// Value of this type is capable of uniquely identifying pass invocations.
  46.   /// It is a pair of string Pass-Identifier (which for now is common
  47.   /// to all the instance of a given pass) + sequential invocation counter.
  48.   using PassInvocationID = std::pair<StringRef, unsigned>;
  49.  
  50.   /// Groups of timers for passes and analyses.
  51.   TimerGroup PassTG;
  52.   TimerGroup AnalysisTG;
  53.  
  54.   using TimerVector = llvm::SmallVector<std::unique_ptr<Timer>, 4>;
  55.   /// Map of timers for pass invocations
  56.   StringMap<TimerVector> TimingData;
  57.  
  58.   /// Currently active pass timer.
  59.   Timer *ActivePassTimer = nullptr;
  60.   /// Stack of currently active analysis timers. Analyses can request other
  61.   /// analyses.
  62.   SmallVector<Timer *, 8> AnalysisActiveTimerStack;
  63.  
  64.   /// Custom output stream to print timing information into.
  65.   /// By default (== nullptr) we emit time report into the stream created by
  66.   /// CreateInfoOutputFile().
  67.   raw_ostream *OutStream = nullptr;
  68.  
  69.   bool Enabled;
  70.   bool PerRun;
  71.  
  72. public:
  73.   TimePassesHandler();
  74.   TimePassesHandler(bool Enabled, bool PerRun = false);
  75.  
  76.   /// Destructor handles the print action if it has not been handled before.
  77.   ~TimePassesHandler() { print(); }
  78.  
  79.   /// Prints out timing information and then resets the timers.
  80.   void print();
  81.  
  82.   // We intend this to be unique per-compilation, thus no copies.
  83.   TimePassesHandler(const TimePassesHandler &) = delete;
  84.   void operator=(const TimePassesHandler &) = delete;
  85.  
  86.   void registerCallbacks(PassInstrumentationCallbacks &PIC);
  87.  
  88.   /// Set a custom output stream for subsequent reporting.
  89.   void setOutStream(raw_ostream &OutStream);
  90.  
  91. private:
  92.   /// Dumps information for running/triggered timers, useful for debugging
  93.   LLVM_DUMP_METHOD void dump() const;
  94.  
  95.   /// Returns the new timer for each new run of the pass.
  96.   Timer &getPassTimer(StringRef PassID, bool IsPass);
  97.  
  98.   void startAnalysisTimer(StringRef PassID);
  99.   void stopAnalysisTimer(StringRef PassID);
  100.   void startPassTimer(StringRef PassID);
  101.   void stopPassTimer(StringRef PassID);
  102. };
  103.  
  104. } // namespace llvm
  105.  
  106. #endif
  107.