| //===- 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/BasicBlock.h" | |
| #include "llvm/Analysis/PathNumbering.h" | |
| namespace llvm { | |
| class ProfilePath; | |
| class ProfilePathEdge; | |
| class PathProfileInfo; | |
| typedef std::vector<ProfilePathEdge> ProfilePathEdgeVector; | |
| typedef std::vector<ProfilePathEdge>::iterator ProfilePathEdgeIterator; | |
| typedef std::vector<BasicBlock*> ProfilePathBlockVector; | |
| typedef std::vector<BasicBlock*>::iterator ProfilePathBlockIterator; | |
| typedef std::map<unsigned int,ProfilePath*> ProfilePathMap; | |
| typedef std::map<unsigned int,ProfilePath*>::iterator ProfilePathIterator; | |
| typedef std::map<Function*,unsigned int> FunctionPathCountMap; | |
| typedef std::map<Function*,ProfilePathMap> FunctionPathMap; | |
| typedef std::map<Function*,ProfilePathMap>::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 |