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

#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() : Parent(0), Interior(0), Time(0), UpdateCount(0) {}
    TimerTreeNode(const TimerTreeNode &) = default;
    std::vector<TTindex> Children; // indexed by TimerIdT
    TTindex Parent;
    TimerIdT Interior;
    double Time;
    size_t UpdateCount;
  };

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;
  // 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;
};

} // end of namespace Ice

#endif // SUBZERO_SRC_ICETIMERTREE_H
