CheckerRegistration.cpp revision 221345
1249423Sdim//===--- CheckerRegistration.cpp - Registration for the Analyzer Checkers -===//
2218885Sdim//
3218885Sdim//                     The LLVM Compiler Infrastructure
4218885Sdim//
5218885Sdim// This file is distributed under the University of Illinois Open Source
6218885Sdim// License. See LICENSE.TXT for details.
7218885Sdim//
8218885Sdim//===----------------------------------------------------------------------===//
9218885Sdim//
10218885Sdim// Defines the registration function for the analyzer checkers.
11218885Sdim//
12218885Sdim//===----------------------------------------------------------------------===//
13218885Sdim
14218885Sdim#include "clang/StaticAnalyzer/Frontend/CheckerRegistration.h"
15218885Sdim#include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
16218885Sdim#include "../Checkers/ClangSACheckerProvider.h"
17218885Sdim#include "clang/StaticAnalyzer/Core/CheckerManager.h"
18218885Sdim#include "clang/StaticAnalyzer/Core/CheckerProvider.h"
19218885Sdim#include "clang/Frontend/AnalyzerOptions.h"
20224145Sdim#include "clang/Frontend/FrontendDiagnostic.h"
21224145Sdim#include "clang/Basic/Diagnostic.h"
22218885Sdim#include "llvm/Support/raw_ostream.h"
23218885Sdim#include "llvm/ADT/OwningPtr.h"
24218885Sdim#include "llvm/ADT/SmallVector.h"
25218885Sdim
26218885Sdimusing namespace clang;
27218885Sdimusing namespace ento;
28218885Sdim
29218885SdimCheckerManager *ento::registerCheckers(const AnalyzerOptions &opts,
30218885Sdim                                       const LangOptions &langOpts,
31218885Sdim                                       Diagnostic &diags) {
32218885Sdim  llvm::OwningPtr<CheckerManager> checkerMgr(new CheckerManager(langOpts));
33218885Sdim
34218885Sdim  llvm::SmallVector<CheckerOptInfo, 8> checkerOpts;
35218885Sdim  for (unsigned i = 0, e = opts.CheckersControlList.size(); i != e; ++i) {
36218885Sdim    const std::pair<std::string, bool> &opt = opts.CheckersControlList[i];
37218885Sdim    checkerOpts.push_back(CheckerOptInfo(opt.first.c_str(), opt.second));
38218885Sdim  }
39218885Sdim
40218885Sdim  llvm::OwningPtr<CheckerProvider> provider(createClangSACheckerProvider());
41218885Sdim  provider->registerCheckers(*checkerMgr,
42218885Sdim                             checkerOpts.data(), checkerOpts.size());
43239462Sdim
44239462Sdim  // FIXME: Load CheckerProviders from plugins.
45239462Sdim
46218885Sdim  checkerMgr->finishedCheckerRegistration();
47218885Sdim
48239462Sdim  for (unsigned i = 0, e = checkerOpts.size(); i != e; ++i) {
49218885Sdim    if (checkerOpts[i].isUnclaimed())
50218885Sdim      diags.Report(diag::warn_unkwown_analyzer_checker)
51218885Sdim          << checkerOpts[i].getName();
52243830Sdim  }
53249423Sdim
54218885Sdim  return checkerMgr.take();
55218885Sdim}
56218885Sdim
57218885Sdimvoid ento::printCheckerHelp(llvm::raw_ostream &OS) {
58218885Sdim  OS << "OVERVIEW: Clang Static Analyzer Checkers List\n";
59218885Sdim  OS << '\n';
60218885Sdim
61243830Sdim  llvm::OwningPtr<CheckerProvider> provider(createClangSACheckerProvider());
62218885Sdim  provider->printHelp(OS);
63243830Sdim
64243830Sdim  // FIXME: Load CheckerProviders from plugins.
65218885Sdim}
66218885Sdim