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