13 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H 14 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/DenseSet.h" 20 #include "llvm/ADT/None.h" 21 #include "llvm/ADT/Optional.h" 22 #include "llvm/ADT/SmallBitVector.h" 34 class FunctionSummary {
37 llvm::SmallBitVector VisitedBasicBlocks;
40 unsigned TotalBasicBlocks : 30;
44 unsigned InlineChecked : 1;
47 unsigned MayInline : 1;
50 unsigned TimesInlined : 32;
53 : TotalBasicBlocks(0), InlineChecked(0), MayInline(0),
57 using MapTy = llvm::DenseMap<const Decl *, FunctionSummary>;
62 MapTy::iterator I = Map.find(D);
66 using KVPair = std::pair<const Decl *, FunctionSummary>;
68 I = Map.insert(KVPair(D, FunctionSummary())).first;
69 assert(I != Map.end());
75 I->second.InlineChecked = 1;
76 I->second.MayInline = 1;
81 I->second.InlineChecked = 1;
82 I->second.MayInline = 0;
90 MapTy::const_iterator I = Map.find(D);
91 if (I != Map.end() && I->second.InlineChecked)
92 return I->second.MayInline;
98 llvm::SmallBitVector &Blocks = I->second.VisitedBasicBlocks;
99 assert(ID < TotalIDs);
100 if (TotalIDs > Blocks.size()) {
101 Blocks.resize(TotalIDs);
102 I->second.TotalBasicBlocks = TotalIDs;
108 MapTy::const_iterator I = Map.find(D);
110 return I->second.VisitedBasicBlocks.count();
115 MapTy::const_iterator I = Map.find(D);
117 return I->second.TimesInlined;
123 I->second.TimesInlined++;
128 MapTy::const_iterator I = Map.find(D);
130 return ((I->second.VisitedBasicBlocks.count() * 100) /
131 I->second.TotalBasicBlocks);
142 #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)