CheckerRegistry.h revision 08b86531ade68727c56918f162816075b87c864a
1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//===--- CheckerRegistry.h - Maintains all available checkers ---*- C++ -*-===//
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//                     The LLVM Compiler Infrastructure
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// This file is distributed under the University of Illinois Open Source
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// License. See LICENSE.TXT for details.
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//===----------------------------------------------------------------------===//
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef LLVM_CLANG_STATICANALYZER_CORE_CHECKERREGISTRY_H
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LLVM_CLANG_STATICANALYZER_CORE_CHECKERREGISTRY_H
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "clang/StaticAnalyzer/Core/CheckerManager.h"
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "clang/Basic/LLVM.h"
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <vector>
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace clang {
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace ento {
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass CheckerOptInfo;
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass CheckerRegistry {
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic:
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  typedef void (*InitializationFunction)(CheckerManager &);
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  struct CheckerInfo {
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    InitializationFunction Initialize;
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    StringRef FullName;
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    StringRef Desc;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CheckerInfo(InitializationFunction fn, StringRef name, StringRef desc)
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    : Initialize(fn), FullName(name), Desc(desc) {}
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  };
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  typedef std::vector<CheckerInfo> CheckerInfoList;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate:
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  template <typename T>
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  static void initializeManager(CheckerManager &mgr) {
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    mgr.registerChecker<T>();
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic:
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void addChecker(InitializationFunction fn, StringRef fullName,
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  StringRef desc);
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  template <class T>
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void addChecker(StringRef fullName, StringRef desc) {
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    addChecker(&initializeManager<T>, fullName, desc);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  }
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void initializeManager(CheckerManager &mgr,
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                         SmallVectorImpl<CheckerOptInfo> &opts) const;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  void printHelp(raw_ostream &out, size_t maxNameChars = 30) const ;
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate:
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  mutable CheckerInfoList Checkers;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  mutable llvm::StringMap<size_t> Packages;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} // end namespace ento
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} // end namespace clang
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver