14 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H 15 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H 19 #include "llvm/ADT/DenseMap.h" 20 #include "llvm/ADT/DenseSet.h" 21 #include "llvm/ADT/Optional.h" 22 #include "llvm/ADT/SmallBitVector.h" 32 class FunctionSummary {
35 llvm::SmallBitVector VisitedBasicBlocks;
38 unsigned TotalBasicBlocks : 30;
42 unsigned InlineChecked : 1;
45 unsigned MayInline : 1;
48 unsigned TimesInlined : 32;
56 typedef llvm::DenseMap<const Decl *, FunctionSummary> MapTy;
61 MapTy::iterator I = Map.find(D);
65 typedef std::pair<const Decl *, FunctionSummary> KVPair;
66 I = Map.insert(KVPair(D, FunctionSummary())).first;
67 assert(I != Map.end());
73 I->second.InlineChecked = 1;
74 I->second.MayInline = 1;
79 I->second.InlineChecked = 1;
80 I->second.MayInline = 0;
88 MapTy::const_iterator I = Map.find(D);
89 if (I != Map.end() && I->second.InlineChecked)
90 return I->second.MayInline;
96 llvm::SmallBitVector &Blocks = I->second.VisitedBasicBlocks;
97 assert(ID < TotalIDs);
98 if (TotalIDs > Blocks.size()) {
99 Blocks.resize(TotalIDs);
100 I->second.TotalBasicBlocks = TotalIDs;
106 MapTy::const_iterator I = Map.find(D);
108 return I->second.VisitedBasicBlocks.count();
113 MapTy::const_iterator I = Map.find(D);
115 return I->second.TimesInlined;
121 I->second.TimesInlined++;
126 MapTy::const_iterator I = Map.find(D);
128 return ((I->second.VisitedBasicBlocks.count() * 100) /
129 I->second.TotalBasicBlocks);
llvm::DenseSet< const Decl * > SetOfConstDecls
Decl - This represents one declaration (or definition), e.g.
Optional< bool > mayInline(const Decl *D)
void markShouldNotInline(const Decl *D)
void markReachedMaxBlockCount(const Decl *D)
std::deque< Decl * > SetOfDecls
unsigned getNumTimesInlined(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
MapTy::iterator findOrInsertSummary(const Decl *D)
unsigned getNumVisitedBasicBlocks(const Decl *D)
void bumpNumTimesInlined(const Decl *D)
unsigned getTotalNumBasicBlocks()
Dataflow Directional Tag Classes.
void markMayInline(const Decl *D)
unsigned getPercentBlocksReachable(const Decl *D)
Get the percentage of the reachable blocks.
unsigned getTotalNumVisitedBasicBlocks()
void markVisitedBasicBlock(unsigned ID, const Decl *D, unsigned TotalIDs)