Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/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
15.0k
          TimesInlined(0) {}
55
  };
56
57
  using MapTy = llvm::DenseMap<const Decl *, FunctionSummary>;
58
  MapTy Map;
59
60
public:
61
232k
  MapTy::iterator findOrInsertSummary(const Decl *D) {
62
232k
    MapTy::iterator I = Map.find(D);
63
232k
    if (I != Map.end())
64
217k
      return I;
65
15.0k
66
15.0k
    using KVPair = std::pair<const Decl *, FunctionSummary>;
67
15.0k
68
15.0k
    I = Map.insert(KVPair(D, FunctionSummary())).first;
69
15.0k
    assert(I != Map.end());
70
15.0k
    return I;
71
15.0k
  }
72
73
4.14k
  void markMayInline(const Decl *D) {
74
4.14k
    MapTy::iterator I = findOrInsertSummary(D);
75
4.14k
    I->second.InlineChecked = 1;
76
4.14k
    I->second.MayInline = 1;
77
4.14k
  }
78
79
337
  void markShouldNotInline(const Decl *D) {
80
337
    MapTy::iterator I = findOrInsertSummary(D);
81
337
    I->second.InlineChecked = 1;
82
337
    I->second.MayInline = 0;
83
337
  }
84
85
40
  void markReachedMaxBlockCount(const Decl *D) {
86
40
    markShouldNotInline(D);
87
40
  }
88
89
31.7k
  Optional<bool> mayInline(const Decl *D) {
90
31.7k
    MapTy::const_iterator I = Map.find(D);
91
31.7k
    if (I != Map.end() && 
I->second.InlineChecked27.3k
)
92
27.3k
      return I->second.MayInline;
93
4.43k
    return None;
94
4.43k
  }
95
96
197k
  void markVisitedBasicBlock(unsigned ID, const Decl* D, unsigned TotalIDs) {
97
197k
    MapTy::iterator I = findOrInsertSummary(D);
98
197k
    llvm::SmallBitVector &Blocks = I->second.VisitedBasicBlocks;
99
197k
    assert(ID < TotalIDs);
100
197k
    if (TotalIDs > Blocks.size()) {
101
14.7k
      Blocks.resize(TotalIDs);
102
14.7k
      I->second.TotalBasicBlocks = TotalIDs;
103
14.7k
    }
104
197k
    Blocks.set(ID);
105
197k
  }
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
30.1k
  unsigned getNumTimesInlined(const Decl* D) {
115
30.1k
    MapTy::const_iterator I = Map.find(D);
116
30.1k
    if (I != Map.end())
117
30.1k
      return I->second.TimesInlined;
118
0
    return 0;
119
0
  }
120
121
30.4k
  void bumpNumTimesInlined(const Decl* D) {
122
30.4k
    MapTy::iterator I = findOrInsertSummary(D);
123
30.4k
    I->second.TimesInlined++;
124
30.4k
  }
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