blob: aabeb292939e566cc45ec356477dc996099db3c0 [file] [log] [blame]
//===- subzero/src/IceTimerTree.h - Pass timer defs -------------*- C++ -*-===//
//
// The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file declares the TimerTree class, which allows flat and
/// cumulative execution time collection of call chains.
///
//===----------------------------------------------------------------------===//
#ifndef SUBZERO_SRC_ICETIMERTREE_H
#define SUBZERO_SRC_ICETIMERTREE_H
// TODO(jpp): Refactor IceDefs.
#include "IceDefs.h"
#include "IceTimerTree.def"
namespace Ice {
class TimerStack {
TimerStack() = delete;
TimerStack &operator=(const TimerStack &) = delete;
/// Timer tree index type. A variable of this type is used to access
/// an interior, not-necessarily-leaf node of the tree.
typedef std::vector<class TimerTreeNode>::size_type TTindex;
/// Representation of a path of leaf values leading to a particular
/// node. The representation happens to be in "reverse" order,
/// i.e. from leaf/interior to root, for implementation efficiency.
typedef llvm::SmallVector<TTindex, 8> PathType;
/// Representation of a mapping of leaf node indexes from one timer
/// stack to another.
typedef std::vector<TimerIdT> TranslationType;
/// TimerTreeNode represents an interior or leaf node in the call tree.
/// It contains a list of children, a pointer to its parent, and the
/// timer ID for the node. It also holds the cumulative time spent at
/// this node and below. The children are always at a higher index in
/// the TimerTreeNode::Nodes array, and the parent is always at a lower
/// index.
class TimerTreeNode {
TimerTreeNode &operator=(const TimerTreeNode &) = delete;
public:
TimerTreeNode() = default;
TimerTreeNode(const TimerTreeNode &) = default;
std::vector<TTindex> Children; // indexed by TimerIdT
TTindex Parent = 0;
TimerIdT Interior = 0;
double Time = 0;
size_t UpdateCount = 0;
};
public:
enum TimerTag {
#define X(tag) TT_##tag,
TIMERTREE_TABLE
#undef X
TT__num
};
explicit TimerStack(const IceString &Name);
TimerStack(const TimerStack &) = default;
TimerIdT getTimerID(const IceString &Name);
void mergeFrom(const TimerStack &Src);
void setName(const IceString &NewName) { Name = NewName; }
const IceString &getName() const { return Name; }
void push(TimerIdT ID);
void pop(TimerIdT ID);
void reset();
void dump(Ostream &Str, bool DumpCumulative);
private:
void update(bool UpdateCounts);
static double timestamp();
TranslationType translateIDsFrom(const TimerStack &Src);
PathType getPath(TTindex Index, const TranslationType &Mapping) const;
TTindex getChildIndex(TTindex Parent, TimerIdT ID);
TTindex findPath(const PathType &Path);
IceString Name;
double FirstTimestamp;
double LastTimestamp;
uint64_t StateChangeCount = 0;
/// IDsIndex maps a symbolic timer name to its integer ID.
std::map<IceString, TimerIdT> IDsIndex;
std::vector<IceString> IDs; /// indexed by TimerIdT
std::vector<TimerTreeNode> Nodes; /// indexed by TTindex
std::vector<double> LeafTimes; /// indexed by TimerIdT
std::vector<size_t> LeafCounts; /// indexed by TimerIdT
TTindex StackTop = 0;
};
} // end of namespace Ice
#endif // SUBZERO_SRC_ICETIMERTREE_H