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