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/None.h" 22 #include "llvm/ADT/Optional.h" 23 #include "llvm/ADT/SmallBitVector.h" 35 class FunctionSummary {
38 llvm::SmallBitVector VisitedBasicBlocks;
41 unsigned TotalBasicBlocks : 30;
45 unsigned InlineChecked : 1;
48 unsigned MayInline : 1;
51 unsigned TimesInlined : 32;
54 : TotalBasicBlocks(0), InlineChecked(0), MayInline(0),
58 using MapTy = llvm::DenseMap<const Decl *, FunctionSummary>;
63 MapTy::iterator I = Map.find(D);
67 using KVPair = std::pair<const Decl *, FunctionSummary>;
69 I = Map.insert(KVPair(D, FunctionSummary())).first;
70 assert(I != Map.end());
76 I->second.InlineChecked = 1;
77 I->second.MayInline = 1;
82 I->second.InlineChecked = 1;
83 I->second.MayInline = 0;
91 MapTy::const_iterator I = Map.find(D);
92 if (I != Map.end() && I->second.InlineChecked)
93 return I->second.MayInline;
99 llvm::SmallBitVector &Blocks = I->second.VisitedBasicBlocks;
100 assert(ID < TotalIDs);
101 if (TotalIDs > Blocks.size()) {
102 Blocks.resize(TotalIDs);
103 I->second.TotalBasicBlocks = TotalIDs;
109 MapTy::const_iterator I = Map.find(D);
111 return I->second.VisitedBasicBlocks.count();
116 MapTy::const_iterator I = Map.find(D);
118 return I->second.TimesInlined;
124 I->second.TimesInlined++;
129 MapTy::const_iterator I = Map.find(D);
131 return ((I->second.VisitedBasicBlocks.count() * 100) /
132 I->second.TotalBasicBlocks);
143 #endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H
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)
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.
std::deque< Decl * > SetOfDecls
unsigned getTotalNumVisitedBasicBlocks()
void markVisitedBasicBlock(unsigned ID, const Decl *D, unsigned TotalIDs)