Coverage Report

Created: 2020-09-22 08:39

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/StaticAnalyzer/Core/PathSensitive/FunctionSummary.h
Line
Count
Source (jump to first uncovered line)
1
//===- FunctionSummary.h - Stores summaries of functions. -------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file defines a summary of a function gathered/used by static analysis.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H
14
#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H
15
16
#include "clang/AST/Decl.h"
17
#include "clang/Basic/LLVM.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"
23
#include <cassert>
24
#include <deque>
25
#include <utility>
26
27
namespace clang {
28
namespace ento {
29
30
using SetOfDecls = std::deque<Decl *>;
31
using SetOfConstDecls = llvm::DenseSet<const Decl *>;
32
33
class FunctionSummariesTy {
34
  class FunctionSummary {
35
  public:
36
    /// Marks the IDs of the basic blocks visited during the analyzes.
37
    llvm::SmallBitVector VisitedBasicBlocks;
38
39
    /// Total number of blocks in the function.
40
    unsigned TotalBasicBlocks : 30;
41
42
    /// True if this function has been checked against the rules for which
43
    /// functions may be inlined.
44
    unsigned InlineChecked : 1;
45
46
    /// True if this function may be inlined.
47
    unsigned MayInline : 1;
48
49
    /// The number of times the function has been inlined.
50
    unsigned TimesInlined : 32;
51
52
    FunctionSummary()
53
        : TotalBasicBlocks(0), InlineChecked(0), MayInline(0),
54
18.8k
          TimesInlined(0) {}
55
  };
56
57
  using MapTy = llvm::DenseMap<const Decl *, FunctionSummary>;
58
  MapTy Map;
59
60
public:
61
253k
  MapTy::iterator findOrInsertSummary(const Decl *D) {
62
253k
    MapTy::iterator I = Map.find(D);
63
253k
    if (I != Map.end())
64
234k
      return I;
65
66
18.8k
    using KVPair = std::pair<const Decl *, FunctionSummary>;
67
68
18.8k
    I = Map.insert(KVPair(D, FunctionSummary())).first;
69
18.8k
    assert(I != Map.end());
70
18.8k
    return I;
71
18.8k
  }
72
73
4.66k
  void markMayInline(const Decl *D) {
74
4.66k
    MapTy::iterator I = findOrInsertSummary(D);
75
4.66k
    I->second.InlineChecked = 1;
76
4.66k
    I->second.MayInline = 1;
77
4.66k
  }
78
79
849
  void markShouldNotInline(const Decl *D) {
80
849
    MapTy::iterator I = findOrInsertSummary(D);
81
849
    I->second.InlineChecked = 1;
82
849
    I->second.MayInline = 0;
83
849
  }
84
85
45
  void markReachedMaxBlockCount(const Decl *D) {
86
45
    markShouldNotInline(D);
87
45
  }
88
89
38.3k
  Optional<bool> mayInline(const Decl *D) {
90
38.3k
    MapTy::const_iterator I = Map.find(D);
91
38.3k
    if (I != Map.end() && 
I->second.InlineChecked33.0k
)
92
32.9k
      return I->second.MayInline;
93
5.44k
    return None;
94
5.44k
  }
95
96
213k
  void markVisitedBasicBlock(unsigned ID, const Decl* D, unsigned TotalIDs) {
97
213k
    MapTy::iterator I = findOrInsertSummary(D);
98
213k
    llvm::SmallBitVector &Blocks = I->second.VisitedBasicBlocks;
99
213k
    assert(ID < TotalIDs);
100
213k
    if (TotalIDs > Blocks.size()) {
101
18.0k
      Blocks.resize(TotalIDs);
102
18.0k
      I->second.TotalBasicBlocks = TotalIDs;
103
18.0k
    }
104
213k
    Blocks.set(ID);
105
213k
  }
106
107
0
  unsigned getNumVisitedBasicBlocks(const Decl* D) {
108
0
    MapTy::const_iterator I = Map.find(D);
109
0
    if (I != Map.end())
110
0
      return I->second.VisitedBasicBlocks.count();
111
0
    return 0;
112
0
  }
113
114
33.3k
  unsigned getNumTimesInlined(const Decl* D) {
115
33.3k
    MapTy::const_iterator I = Map.find(D);
116
33.3k
    if (I != Map.end())
117
33.3k
      return I->second.TimesInlined;
118
0
    return 0;
119
0
  }
120
121
33.7k
  void bumpNumTimesInlined(const Decl* D) {
122
33.7k
    MapTy::iterator I = findOrInsertSummary(D);
123
33.7k
    I->second.TimesInlined++;
124
33.7k
  }
125
126
  /// Get the percentage of the reachable blocks.
127
0
  unsigned getPercentBlocksReachable(const Decl *D) {
128
0
    MapTy::const_iterator I = Map.find(D);
129
0
      if (I != Map.end())
130
0
        return ((I->second.VisitedBasicBlocks.count() * 100) /
131
0
                 I->second.TotalBasicBlocks);
132
0
    return 0;
133
0
  }
134
135
  unsigned getTotalNumBasicBlocks();
136
  unsigned getTotalNumVisitedBasicBlocks();
137
};
138
139
} // namespace ento
140
} // namespace clang
141
142
#endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_FUNCTIONSUMMARY_H