//===- PathProfileInfo.h --------------------------------------*- C++ -*---===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file outlines the interface used by optimizers to load path profiles. // //===----------------------------------------------------------------------===// #ifndef LLVM_PATHPROFILEINFO_H #define LLVM_PATHPROFILEINFO_H #include "llvm/Analysis/PathNumbering.h" #include "llvm/BasicBlock.h" namespace llvm { class ProfilePath; class ProfilePathEdge; class PathProfileInfo; typedef std::vector ProfilePathEdgeVector; typedef std::vector::iterator ProfilePathEdgeIterator; typedef std::vector ProfilePathBlockVector; typedef std::vector::iterator ProfilePathBlockIterator; typedef std::map ProfilePathMap; typedef std::map::iterator ProfilePathIterator; typedef std::map FunctionPathCountMap; typedef std::map FunctionPathMap; typedef std::map::iterator FunctionPathIterator; class ProfilePathEdge { public: ProfilePathEdge(BasicBlock* source, BasicBlock* target, unsigned duplicateNumber); inline unsigned getDuplicateNumber() { return _duplicateNumber; } inline BasicBlock* getSource() { return _source; } inline BasicBlock* getTarget() { return _target; } protected: BasicBlock* _source; BasicBlock* _target; unsigned _duplicateNumber; }; class ProfilePath { public: ProfilePath(unsigned int number, unsigned int count, double countStdDev, PathProfileInfo* ppi); double getFrequency() const; inline unsigned int getNumber() const { return _number; } inline unsigned int getCount() const { return _count; } inline double getCountStdDev() const { return _countStdDev; } ProfilePathEdgeVector* getPathEdges() const; ProfilePathBlockVector* getPathBlocks() const; BasicBlock* getFirstBlockInPath() const; private: unsigned int _number; unsigned int _count; double _countStdDev; // double pointer back to the profiling info PathProfileInfo* _ppi; }; // TODO: overload [] operator for getting path // Add: getFunctionCallCount() class PathProfileInfo { public: PathProfileInfo(); ~PathProfileInfo(); void setCurrentFunction(Function* F); Function* getCurrentFunction() const; BasicBlock* getCurrentFunctionEntry(); ProfilePath* getPath(unsigned int number); unsigned int getPotentialPathCount(); ProfilePathIterator pathBegin(); ProfilePathIterator pathEnd(); unsigned int pathsRun(); static char ID; // Pass identification std::string argList; protected: FunctionPathMap _functionPaths; FunctionPathCountMap _functionPathCounts; private: BallLarusDag* _currentDag; Function* _currentFunction; friend class ProfilePath; }; } // end namespace llvm #endif