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.