clang: include/clang/StaticAnalyzer/Core/PathSensitive/FunctionSummary.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H
14#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H
15
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/DenseSet.h"
20#include "llvm/ADT/SmallBitVector.h"
21#include
22#include
23#include
24#include
25
27namespace ento {
28
31
33 class FunctionSummary {
34 public:
35
36 llvm::SmallBitVector VisitedBasicBlocks;
37
38
39 unsigned TotalBasicBlocks : 30;
40
41
42
43 unsigned InlineChecked : 1;
44
45
46 unsigned MayInline : 1;
47
48
49 unsigned TimesInlined : 32;
50
51 FunctionSummary()
52 : TotalBasicBlocks(0), InlineChecked(0), MayInline(0),
53 TimesInlined(0) {}
54 };
55
56 using MapTy = llvm::DenseMap<const Decl *, FunctionSummary>;
57 MapTy Map;
58
59public:
61 MapTy::iterator I = Map.find(D);
62 if (I != Map.end())
63 return I;
64
65 using KVPair = std::pair<const Decl *, FunctionSummary>;
66
67 I = Map.insert(KVPair(D, FunctionSummary())).first;
68 assert(I != Map.end());
69 return I;
70 }
71
74 I->second.InlineChecked = 1;
75 I->second.MayInline = 1;
76 }
77
80 I->second.InlineChecked = 1;
81 I->second.MayInline = 0;
82 }
83
86 }
87
89 MapTy::const_iterator I = Map.find(D);
90 if (I != Map.end() && I->second.InlineChecked)
91 return I->second.MayInline;
92 return std::nullopt;
93 }
94
97 llvm::SmallBitVector &Blocks = I->second.VisitedBasicBlocks;
98 assert(ID < TotalIDs);
99 if (TotalIDs > Blocks.size()) {
100 Blocks.resize(TotalIDs);
101 I->second.TotalBasicBlocks = TotalIDs;
102 }
103 Blocks.set(ID);
104 }
105
107 MapTy::const_iterator I = Map.find(D);
108 if (I != Map.end())
109 return I->second.VisitedBasicBlocks.count();
110 return 0;
111 }
112
114 MapTy::const_iterator I = Map.find(D);
115 if (I != Map.end())
116 return I->second.TimesInlined;
117 return 0;
118 }
119
122 I->second.TimesInlined++;
123 }
124
125
127 MapTy::const_iterator I = Map.find(D);
128 if (I != Map.end())
129 return ((I->second.VisitedBasicBlocks.count() * 100) /
130 I->second.TotalBasicBlocks);
131 return 0;
132 }
133
136};
137
138}
139}
140
141#endif
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Decl - This represents one declaration (or definition), e.g.
unsigned getTotalNumBasicBlocks()
std::optional< bool > mayInline(const Decl *D)
unsigned getTotalNumVisitedBasicBlocks()
void markVisitedBasicBlock(unsigned ID, const Decl *D, unsigned TotalIDs)
void markMayInline(const Decl *D)
unsigned getPercentBlocksReachable(const Decl *D)
Get the percentage of the reachable blocks.
unsigned getNumTimesInlined(const Decl *D)
void markShouldNotInline(const Decl *D)
void markReachedMaxBlockCount(const Decl *D)
unsigned getNumVisitedBasicBlocks(const Decl *D)
MapTy::iterator findOrInsertSummary(const Decl *D)
void bumpNumTimesInlined(const Decl *D)
llvm::DenseSet< const Decl * > SetOfConstDecls
std::deque< Decl * > SetOfDecls
The JSON file list parser is used to communicate input to InstallAPI.