1 //===--- CheckerManager.h - Static Analyzer Checker Manager -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Defines the Static Analyzer Checker Manager.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_SA_CORE_CHECKERMANAGER_H
15 #define LLVM_CLANG_SA_CORE_CHECKERMANAGER_H
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/ADT/DenseMap.h"
26 class AnalysisManager
;
29 class CheckerManager
{
33 typedef void *CheckerRef
;
35 //===----------------------------------------------------------------------===//
37 //===----------------------------------------------------------------------===//
39 /// \brief Used to register checkers.
40 template <typename CHECKER
>
41 void registerChecker() {
42 CHECKER
*checker
= new CHECKER();
43 Checkers
.push_back(std::make_pair(checker
, destruct
<CHECKER
>));
44 CHECKER::_register(checker
, *this);
47 typedef void (*RegisterToEngFunc
)(ExprEngine
&Eng
);
48 void addCheckerRegisterFunction(RegisterToEngFunc fn
) {
52 //===----------------------------------------------------------------------===//
53 // Functions for running checkers.
54 //===----------------------------------------------------------------------===//
56 /// \brief Run checkers handling Decls.
57 void runCheckersOnASTDecl(const Decl
*D
, AnalysisManager
& mgr
,
60 /// \brief Run checkers handling Decls containing a Stmt body.
61 void runCheckersOnASTBody(const Decl
*D
, AnalysisManager
& mgr
,
64 //===----------------------------------------------------------------------===//
65 // Internal registration functions.
66 //===----------------------------------------------------------------------===//
68 // Functions used by the registration mechanism, checkers should not touch
71 typedef void (*CheckDeclFunc
)(CheckerRef checker
, const Decl
*D
,
72 AnalysisManager
& mgr
, BugReporter
&BR
);
73 typedef bool (*HandlesDeclFunc
)(const Decl
*D
);
74 void _registerForDecl(CheckerRef checker
, CheckDeclFunc checkfn
,
75 HandlesDeclFunc isForDeclFn
);
77 void _registerForBody(CheckerRef checker
, CheckDeclFunc checkfn
);
79 void registerCheckersToEngine(ExprEngine
&eng
);
82 template <typename CHECKER
>
83 static void destruct(void *obj
) { delete static_cast<CHECKER
*>(obj
); }
85 std::vector
<RegisterToEngFunc
> Funcs
;
87 struct DeclCheckerInfo
{
89 CheckDeclFunc CheckFn
;
90 HandlesDeclFunc IsForDeclFn
;
92 std::vector
<DeclCheckerInfo
> DeclCheckers
;
94 std::vector
<std::pair
<CheckerRef
, CheckDeclFunc
> > BodyCheckers
;
96 typedef void (*Dtor
)(void *);
97 std::vector
<std::pair
<CheckerRef
, Dtor
> > Checkers
;
99 typedef llvm::SmallVector
<std::pair
<CheckerRef
, CheckDeclFunc
>, 4>
101 typedef llvm::DenseMap
<unsigned, CachedDeclCheckers
> CachedDeclCheckersMapTy
;
102 CachedDeclCheckersMapTy CachedDeclCheckersMap
;
105 } // end ento namespace
107 } // end clang namespace