]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/include/clang/Sema/AnalysisBasedWarnings.h
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / include / clang / Sema / AnalysisBasedWarnings.h
1 //=- AnalysisBasedWarnings.h - Sema warnings based on libAnalysis -*- C++ -*-=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines AnalysisBasedWarnings, a worker object used by Sema
11 // that issues warnings based on dataflow-analysis.
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
15 #define LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
16
17 #include "llvm/ADT/DenseMap.h"
18
19 namespace clang {
20
21 class BlockExpr;
22 class Decl;
23 class FunctionDecl;
24 class ObjCMethodDecl;
25 class QualType;
26 class Sema;
27 namespace sema {
28   class FunctionScopeInfo;
29 }
30
31 namespace sema {
32
33 class AnalysisBasedWarnings {
34 public:
35   class Policy {
36     friend class AnalysisBasedWarnings;
37     // The warnings to run.
38     unsigned enableCheckFallThrough : 1;
39     unsigned enableCheckUnreachable : 1;
40   public:
41     Policy();
42     void disableCheckFallThrough() { enableCheckFallThrough = 0; }
43   };
44
45 private:
46   Sema &S;
47   Policy DefaultPolicy;
48
49   enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
50   llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
51
52   /// \name Statistics
53   /// @{
54
55   /// \brief Number of function CFGs built and analyzed.
56   unsigned NumFunctionsAnalyzed;
57
58   /// \brief Number of functions for which the CFG could not be successfully
59   /// built.
60   unsigned NumFunctionsWithBadCFGs;
61
62   /// \brief Total number of blocks across all CFGs.
63   unsigned NumCFGBlocks;
64
65   /// \brief Largest number of CFG blocks for a single function analyzed.
66   unsigned MaxCFGBlocksPerFunction;
67
68   /// \brief Total number of CFGs with variables analyzed for uninitialized
69   /// uses.
70   unsigned NumUninitAnalysisFunctions;
71
72   /// \brief Total number of variables analyzed for uninitialized uses.
73   unsigned NumUninitAnalysisVariables;
74
75   /// \brief Max number of variables analyzed for uninitialized uses in a single
76   /// function.
77   unsigned MaxUninitAnalysisVariablesPerFunction;
78
79   /// \brief Total number of block visits during uninitialized use analysis.
80   unsigned NumUninitAnalysisBlockVisits;
81
82   /// \brief Max number of block visits during uninitialized use analysis of
83   /// a single function.
84   unsigned MaxUninitAnalysisBlockVisitsPerFunction;
85
86   /// @}
87
88 public:
89   AnalysisBasedWarnings(Sema &s);
90
91   void IssueWarnings(Policy P, FunctionScopeInfo *fscope,
92                      const Decl *D, const BlockExpr *blkExpr);
93
94   Policy getDefaultPolicy() { return DefaultPolicy; }
95
96   void PrintStats() const;
97 };
98
99 }} // end namespace clang::sema
100
101 #endif