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