| //===--------------------- SourceMgr.h --------------------------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// \file | |
| /// This file implements class SourceMgr. Class SourceMgr abstracts the input | |
| /// code sequence (a sequence of MCInst), and assings unique identifiers to | |
| /// every instruction in the sequence. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_TOOLS_LLVM_MCA_SOURCEMGR_H | |
| #define LLVM_TOOLS_LLVM_MCA_SOURCEMGR_H | |
| #include "llvm/MC/MCInst.h" | |
| #include <vector> | |
| namespace mca { | |
| typedef std::pair<unsigned, const llvm::MCInst *> SourceRef; | |
| class SourceMgr { | |
| using InstVec = std::vector<std::unique_ptr<const llvm::MCInst>>; | |
| const InstVec &Sequence; | |
| unsigned Current; | |
| unsigned Iterations; | |
| static const unsigned DefaultIterations = 100; | |
| public: | |
| SourceMgr(const InstVec &MCInstSequence, unsigned NumIterations) | |
| : Sequence(MCInstSequence), Current(0), | |
| Iterations(NumIterations ? NumIterations : DefaultIterations) {} | |
| unsigned getCurrentIteration() const { return Current / Sequence.size(); } | |
| unsigned getNumIterations() const { return Iterations; } | |
| unsigned size() const { return Sequence.size(); } | |
| const InstVec &getSequence() const { return Sequence; } | |
| bool hasNext() const { return Current < (Iterations * size()); } | |
| void updateNext() { Current++; } | |
| const SourceRef peekNext() const { | |
| unsigned Index = getCurrentInstructionIndex(); | |
| return SourceRef(Current, Sequence[Index].get()); | |
| } | |
| unsigned getCurrentInstructionIndex() const { | |
| return Current % Sequence.size(); | |
| } | |
| const llvm::MCInst &getMCInstFromIndex(unsigned Index) const { | |
| return *Sequence[Index % size()]; | |
| } | |
| bool isEmpty() const { return size() == 0; } | |
| }; | |
| } // namespace mca | |
| #endif |