Coverage Report

Created: 2020-02-15 09:57

/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
17.1k
          TimesInlined(0) {}
55
  };
56
57
  using MapTy = llvm::DenseMap<const Decl *, FunctionSummary>;
58
  MapTy Map;
59
60
public:
61
348k
  MapTy::iterator findOrInsertSummary(const Decl *D) {
62
348k
    MapTy::iterator I = Map.find(D);
63
348k
    if (I != Map.end())
64
330k
      return I;
65
17.1k
66
17.1k
    using KVPair = std::pair<const Decl *, FunctionSummary>;
67
17.1k
68
17.1k
    I = Map.insert(KVPair(D, FunctionSummary())).first;
69
17.1k
    assert(I != Map.end());
70
17.1k
    return I;
71
17.1k
  }
72
73
4.44k
  void markMayInline(const Decl *D) {
74
4.44k
    MapTy::iterator I = findOrInsertSummary(D);
75
4.44k
    I->second.InlineChecked = 1;
76
4.44k
    I->second.MayInline = 1;
77
4.44k
  }
78
79
415
  void markShouldNotInline(const Decl *D) {
80
415
    MapTy::iterator I = findOrInsertSummary(D);
81
415
    I->second.InlineChecked = 1;
82
415
    I->second.MayInline = 0;
83
415
  }
84
85
42
  void markReachedMaxBlockCount(const Decl *D) {
86
42
    markShouldNotInline(D);
87
42
  }
88
89
65.9k
  Optional<bool> mayInline(const Decl *D) {
90
65.9k
    MapTy::const_iterator I = Map.find(D);
91
65.9k
    if (I != Map.end() && 
I->second.InlineChecked61.2k
)
92
61.1k
      return I->second.MayInline;
93
4.79k
    return None;
94
4.79k
  }
95
96
279k
  void markVisitedBasicBlock(unsigned ID, const Decl* D, unsigned TotalIDs) {
97
279k
    MapTy::iterator I = findOrInsertSummary(D);
98
279k
    llvm::SmallBitVector &Blocks = I->second.VisitedBasicBlocks;
99
279k
    assert(ID < TotalIDs);
100
279k
    if (TotalIDs > Blocks.size()) {
101
16.8k
      Blocks.resize(TotalIDs);
102
16.8k
      I->second.TotalBasicBlocks = TotalIDs;
103
16.8k
    }
104
279k
    Blocks.set(ID);
105
279k
  }
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
63.3k
  unsigned getNumTimesInlined(const Decl* D) {
115
63.3k
    MapTy::const_iterator I = Map.find(D);
116
63.3k
    if (I != Map.end())
117
63.3k
      return I->second.TimesInlined;
118
0
    return 0;
119
0
  }
120
121
63.7k
  void bumpNumTimesInlined(const Decl* D) {
122
63.7k
    MapTy::iterator I = findOrInsertSummary(D);
123
63.7k
    I->second.TimesInlined++;
124
63.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