mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
ae65e281f3
to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
108 lines
3.7 KiB
C++
108 lines
3.7 KiB
C++
//===- 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/Any.h"
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/Timer.h"
|
|
#include "llvm/Support/TypeName.h"
|
|
#include <memory>
|
|
namespace llvm {
|
|
|
|
class Pass;
|
|
class PassInstrumentationCallbacks;
|
|
|
|
/// If -time-passes has been specified, report the timings immediately and then
|
|
/// reset the timers to zero.
|
|
void reportAndResetTimings();
|
|
|
|
/// Request the timer for this legacy-pass-manager's pass instance.
|
|
Timer *getPassTimer(Pass *);
|
|
|
|
/// If the user specifies the -time-passes argument on an LLVM tool command line
|
|
/// then the value of this boolean will be true, otherwise false.
|
|
/// This is the storage for the -time-passes option.
|
|
extern bool TimePassesIsEnabled;
|
|
|
|
/// 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>;
|
|
|
|
/// A group of all pass-timing timers.
|
|
TimerGroup TG;
|
|
|
|
/// Map of timers for pass invocations
|
|
DenseMap<PassInvocationID, std::unique_ptr<Timer>> TimingData;
|
|
|
|
/// Map that counts invocations of passes, for use in UniqPassID construction.
|
|
StringMap<unsigned> PassIDCountMap;
|
|
|
|
/// Stack of currently active timers.
|
|
SmallVector<Timer *, 8> TimerStack;
|
|
|
|
bool Enabled;
|
|
|
|
public:
|
|
TimePassesHandler(bool Enabled = TimePassesIsEnabled);
|
|
|
|
/// Destructor handles the print action if it has not been handled before.
|
|
~TimePassesHandler() {
|
|
// First destroying the timers from TimingData, which deploys all their
|
|
// collected data into the TG time group member, which later prints itself
|
|
// when being destroyed.
|
|
TimingData.clear();
|
|
}
|
|
|
|
/// 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);
|
|
|
|
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);
|
|
|
|
/// Returns the incremented counter for the next invocation of \p PassID.
|
|
unsigned nextPassID(StringRef PassID) { return ++PassIDCountMap[PassID]; }
|
|
|
|
void startTimer(StringRef PassID);
|
|
void stopTimer(StringRef PassID);
|
|
|
|
// Implementation of pass instrumentation callbacks.
|
|
bool runBeforePass(StringRef PassID);
|
|
void runAfterPass(StringRef PassID);
|
|
};
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|