|  | //===- 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 |