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