1212795Sdim//=- AnalysisBasedWarnings.h - Sema warnings based on libAnalysis -*- C++ -*-=//
2212795Sdim//
3212795Sdim//                     The LLVM Compiler Infrastructure
4212795Sdim//
5212795Sdim// This file is distributed under the University of Illinois Open Source
6212795Sdim// License. See LICENSE.TXT for details.
7212795Sdim//
8212795Sdim//===----------------------------------------------------------------------===//
9212795Sdim//
10212795Sdim// This file defines AnalysisBasedWarnings, a worker object used by Sema
11212795Sdim// that issues warnings based on dataflow-analysis.
12212795Sdim//===----------------------------------------------------------------------===//
13212795Sdim
14212795Sdim#ifndef LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
15212795Sdim#define LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
16212795Sdim
17212795Sdim#include "llvm/ADT/DenseMap.h"
18212795Sdim
19212795Sdimnamespace clang {
20212795Sdim
21212795Sdimclass BlockExpr;
22212795Sdimclass Decl;
23212795Sdimclass FunctionDecl;
24212795Sdimclass ObjCMethodDecl;
25212795Sdimclass QualType;
26212795Sdimclass Sema;
27219077Sdimnamespace sema {
28219077Sdim  class FunctionScopeInfo;
29219077Sdim}
30212795Sdim
31212795Sdimnamespace sema {
32212795Sdim
33212795Sdimclass AnalysisBasedWarnings {
34212795Sdimpublic:
35212795Sdim  class Policy {
36212795Sdim    friend class AnalysisBasedWarnings;
37212795Sdim    // The warnings to run.
38212795Sdim    unsigned enableCheckFallThrough : 1;
39212795Sdim    unsigned enableCheckUnreachable : 1;
40226633Sdim    unsigned enableThreadSafetyAnalysis : 1;
41263508Sdim    unsigned enableConsumedAnalysis : 1;
42212795Sdim  public:
43212795Sdim    Policy();
44212795Sdim    void disableCheckFallThrough() { enableCheckFallThrough = 0; }
45212795Sdim  };
46212795Sdim
47212795Sdimprivate:
48212795Sdim  Sema &S;
49212795Sdim  Policy DefaultPolicy;
50212795Sdim
51212795Sdim  enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
52212795Sdim  llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
53212795Sdim
54224145Sdim  /// \name Statistics
55224145Sdim  /// @{
56212795Sdim
57224145Sdim  /// \brief Number of function CFGs built and analyzed.
58224145Sdim  unsigned NumFunctionsAnalyzed;
59224145Sdim
60224145Sdim  /// \brief Number of functions for which the CFG could not be successfully
61224145Sdim  /// built.
62224145Sdim  unsigned NumFunctionsWithBadCFGs;
63224145Sdim
64224145Sdim  /// \brief Total number of blocks across all CFGs.
65224145Sdim  unsigned NumCFGBlocks;
66224145Sdim
67224145Sdim  /// \brief Largest number of CFG blocks for a single function analyzed.
68224145Sdim  unsigned MaxCFGBlocksPerFunction;
69224145Sdim
70224145Sdim  /// \brief Total number of CFGs with variables analyzed for uninitialized
71224145Sdim  /// uses.
72224145Sdim  unsigned NumUninitAnalysisFunctions;
73224145Sdim
74224145Sdim  /// \brief Total number of variables analyzed for uninitialized uses.
75224145Sdim  unsigned NumUninitAnalysisVariables;
76224145Sdim
77224145Sdim  /// \brief Max number of variables analyzed for uninitialized uses in a single
78224145Sdim  /// function.
79224145Sdim  unsigned MaxUninitAnalysisVariablesPerFunction;
80224145Sdim
81224145Sdim  /// \brief Total number of block visits during uninitialized use analysis.
82224145Sdim  unsigned NumUninitAnalysisBlockVisits;
83224145Sdim
84224145Sdim  /// \brief Max number of block visits during uninitialized use analysis of
85224145Sdim  /// a single function.
86224145Sdim  unsigned MaxUninitAnalysisBlockVisitsPerFunction;
87224145Sdim
88224145Sdim  /// @}
89224145Sdim
90212795Sdimpublic:
91212795Sdim  AnalysisBasedWarnings(Sema &s);
92212795Sdim
93219077Sdim  void IssueWarnings(Policy P, FunctionScopeInfo *fscope,
94219077Sdim                     const Decl *D, const BlockExpr *blkExpr);
95219077Sdim
96212795Sdim  Policy getDefaultPolicy() { return DefaultPolicy; }
97224145Sdim
98224145Sdim  void PrintStats() const;
99212795Sdim};
100212795Sdim
101212795Sdim}} // end namespace clang::sema
102212795Sdim
103212795Sdim#endif
104