1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceTimerTree.h - Pass timer defs -------------*- C++ -*-===// 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker // 5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker // 8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker /// 10*03ce13f7SAndroid Build Coastguard Worker /// \file 11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares the TimerTree class, which allows flat and cumulative 12*03ce13f7SAndroid Build Coastguard Worker /// execution time collection of call chains. 13*03ce13f7SAndroid Build Coastguard Worker /// 14*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 15*03ce13f7SAndroid Build Coastguard Worker 16*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICETIMERTREE_H 17*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICETIMERTREE_H 18*03ce13f7SAndroid Build Coastguard Worker 19*03ce13f7SAndroid Build Coastguard Worker // TODO(jpp): Refactor IceDefs. 20*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h" 21*03ce13f7SAndroid Build Coastguard Worker #include "IceTimerTree.def" 22*03ce13f7SAndroid Build Coastguard Worker 23*03ce13f7SAndroid Build Coastguard Worker namespace Ice { 24*03ce13f7SAndroid Build Coastguard Worker 25*03ce13f7SAndroid Build Coastguard Worker class TimerStack { 26*03ce13f7SAndroid Build Coastguard Worker TimerStack() = delete; 27*03ce13f7SAndroid Build Coastguard Worker TimerStack &operator=(const TimerStack &) = delete; 28*03ce13f7SAndroid Build Coastguard Worker 29*03ce13f7SAndroid Build Coastguard Worker /// Timer tree index type. A variable of this type is used to access an 30*03ce13f7SAndroid Build Coastguard Worker /// interior, not-necessarily-leaf node of the tree. 31*03ce13f7SAndroid Build Coastguard Worker using TTindex = std::vector<class TimerTreeNode>::size_type; 32*03ce13f7SAndroid Build Coastguard Worker /// Representation of a path of leaf values leading to a particular node. The 33*03ce13f7SAndroid Build Coastguard Worker /// representation happens to be in "reverse" order, i.e. from leaf/interior 34*03ce13f7SAndroid Build Coastguard Worker /// to root, for implementation efficiency. 35*03ce13f7SAndroid Build Coastguard Worker using PathType = llvm::SmallVector<TTindex, 8>; 36*03ce13f7SAndroid Build Coastguard Worker /// Representation of a mapping of leaf node indexes from one timer stack to 37*03ce13f7SAndroid Build Coastguard Worker /// another. 38*03ce13f7SAndroid Build Coastguard Worker using TranslationType = std::vector<TimerIdT>; 39*03ce13f7SAndroid Build Coastguard Worker 40*03ce13f7SAndroid Build Coastguard Worker /// TimerTreeNode represents an interior or leaf node in the call tree. It 41*03ce13f7SAndroid Build Coastguard Worker /// contains a list of children, a pointer to its parent, and the timer ID for 42*03ce13f7SAndroid Build Coastguard Worker /// the node. It also holds the cumulative time spent at this node and below. 43*03ce13f7SAndroid Build Coastguard Worker /// The children are always at a higher index in the TimerTreeNode::Nodes 44*03ce13f7SAndroid Build Coastguard Worker /// array, and the parent is always at a lower index. 45*03ce13f7SAndroid Build Coastguard Worker class TimerTreeNode { 46*03ce13f7SAndroid Build Coastguard Worker TimerTreeNode &operator=(const TimerTreeNode &) = delete; 47*03ce13f7SAndroid Build Coastguard Worker 48*03ce13f7SAndroid Build Coastguard Worker public: 49*03ce13f7SAndroid Build Coastguard Worker TimerTreeNode() = default; 50*03ce13f7SAndroid Build Coastguard Worker TimerTreeNode(const TimerTreeNode &) = default; 51*03ce13f7SAndroid Build Coastguard Worker std::vector<TTindex> Children; // indexed by TimerIdT 52*03ce13f7SAndroid Build Coastguard Worker TTindex Parent = 0; 53*03ce13f7SAndroid Build Coastguard Worker TimerIdT Interior = 0; 54*03ce13f7SAndroid Build Coastguard Worker double Time = 0; 55*03ce13f7SAndroid Build Coastguard Worker size_t UpdateCount = 0; 56*03ce13f7SAndroid Build Coastguard Worker }; 57*03ce13f7SAndroid Build Coastguard Worker 58*03ce13f7SAndroid Build Coastguard Worker public: 59*03ce13f7SAndroid Build Coastguard Worker enum TimerTag { 60*03ce13f7SAndroid Build Coastguard Worker #define X(tag) TT_##tag, 61*03ce13f7SAndroid Build Coastguard Worker TIMERTREE_TABLE 62*03ce13f7SAndroid Build Coastguard Worker #undef X 63*03ce13f7SAndroid Build Coastguard Worker TT__num 64*03ce13f7SAndroid Build Coastguard Worker }; 65*03ce13f7SAndroid Build Coastguard Worker explicit TimerStack(const std::string &Name); 66*03ce13f7SAndroid Build Coastguard Worker TimerStack(const TimerStack &) = default; 67*03ce13f7SAndroid Build Coastguard Worker TimerIdT getTimerID(const std::string &Name); 68*03ce13f7SAndroid Build Coastguard Worker void mergeFrom(const TimerStack &Src); setName(const std::string & NewName)69*03ce13f7SAndroid Build Coastguard Worker void setName(const std::string &NewName) { Name = NewName; } getName()70*03ce13f7SAndroid Build Coastguard Worker const std::string &getName() const { return Name; } 71*03ce13f7SAndroid Build Coastguard Worker void push(TimerIdT ID); 72*03ce13f7SAndroid Build Coastguard Worker void pop(TimerIdT ID); 73*03ce13f7SAndroid Build Coastguard Worker void reset(); 74*03ce13f7SAndroid Build Coastguard Worker void dump(Ostream &Str, bool DumpCumulative); 75*03ce13f7SAndroid Build Coastguard Worker 76*03ce13f7SAndroid Build Coastguard Worker private: 77*03ce13f7SAndroid Build Coastguard Worker void update(bool UpdateCounts); 78*03ce13f7SAndroid Build Coastguard Worker static double timestamp(); 79*03ce13f7SAndroid Build Coastguard Worker TranslationType translateIDsFrom(const TimerStack &Src); 80*03ce13f7SAndroid Build Coastguard Worker PathType getPath(TTindex Index, const TranslationType &Mapping) const; 81*03ce13f7SAndroid Build Coastguard Worker TTindex getChildIndex(TTindex Parent, TimerIdT ID); 82*03ce13f7SAndroid Build Coastguard Worker TTindex findPath(const PathType &Path); 83*03ce13f7SAndroid Build Coastguard Worker std::string Name; 84*03ce13f7SAndroid Build Coastguard Worker double FirstTimestamp; 85*03ce13f7SAndroid Build Coastguard Worker double LastTimestamp; 86*03ce13f7SAndroid Build Coastguard Worker uint64_t StateChangeCount = 0; 87*03ce13f7SAndroid Build Coastguard Worker /// IDsIndex maps a symbolic timer name to its integer ID. 88*03ce13f7SAndroid Build Coastguard Worker std::map<std::string, TimerIdT> IDsIndex; 89*03ce13f7SAndroid Build Coastguard Worker std::vector<std::string> IDs; /// indexed by TimerIdT 90*03ce13f7SAndroid Build Coastguard Worker std::vector<TimerTreeNode> Nodes; /// indexed by TTindex 91*03ce13f7SAndroid Build Coastguard Worker std::vector<double> LeafTimes; /// indexed by TimerIdT 92*03ce13f7SAndroid Build Coastguard Worker std::vector<size_t> LeafCounts; /// indexed by TimerIdT 93*03ce13f7SAndroid Build Coastguard Worker TTindex StackTop = 0; 94*03ce13f7SAndroid Build Coastguard Worker }; 95*03ce13f7SAndroid Build Coastguard Worker 96*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice 97*03ce13f7SAndroid Build Coastguard Worker 98*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICETIMERTREE_H 99