CheckerRegistry.h revision 77a33a71701b59affb5337d9e2b57d69bc095c7d
108b86531ade68727c56918f162816075b87c864aJordy Rose//===--- CheckerRegistry.h - Maintains all available checkers ---*- C++ -*-===// 208b86531ade68727c56918f162816075b87c864aJordy Rose// 308b86531ade68727c56918f162816075b87c864aJordy Rose// The LLVM Compiler Infrastructure 408b86531ade68727c56918f162816075b87c864aJordy Rose// 508b86531ade68727c56918f162816075b87c864aJordy Rose// This file is distributed under the University of Illinois Open Source 608b86531ade68727c56918f162816075b87c864aJordy Rose// License. See LICENSE.TXT for details. 708b86531ade68727c56918f162816075b87c864aJordy Rose// 808b86531ade68727c56918f162816075b87c864aJordy Rose//===----------------------------------------------------------------------===// 908b86531ade68727c56918f162816075b87c864aJordy Rose 1008b86531ade68727c56918f162816075b87c864aJordy Rose#ifndef LLVM_CLANG_STATICANALYZER_CORE_CHECKERREGISTRY_H 1108b86531ade68727c56918f162816075b87c864aJordy Rose#define LLVM_CLANG_STATICANALYZER_CORE_CHECKERREGISTRY_H 1208b86531ade68727c56918f162816075b87c864aJordy Rose 1308b86531ade68727c56918f162816075b87c864aJordy Rose#include "clang/StaticAnalyzer/Core/CheckerManager.h" 1408b86531ade68727c56918f162816075b87c864aJordy Rose#include "clang/Basic/LLVM.h" 1508b86531ade68727c56918f162816075b87c864aJordy Rose#include <vector> 1608b86531ade68727c56918f162816075b87c864aJordy Rose 1708b86531ade68727c56918f162816075b87c864aJordy Rosenamespace clang { 1808b86531ade68727c56918f162816075b87c864aJordy Rosenamespace ento { 1908b86531ade68727c56918f162816075b87c864aJordy Rose 2077a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose#ifndef CLANG_ANALYZER_API_VERSION_STRING 2177a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose// FIXME: The Clang version string is not particularly granular; 2277a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose// the analyzer infrastructure can change a lot between releases. 2377a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose// Unfortunately, this string has to be statically embedded in each plugin, 2477a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose// so we can't just use the functions defined in Version.h. 2577a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose#include "clang/Basic/Version.h" 2677a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose#define CLANG_ANALYZER_API_VERSION_STRING CLANG_VERSION_STRING 2777a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose#endif 2877a33a71701b59affb5337d9e2b57d69bc095c7dJordy Rose 2908b86531ade68727c56918f162816075b87c864aJordy Roseclass CheckerOptInfo; 3008b86531ade68727c56918f162816075b87c864aJordy Rose 3108b86531ade68727c56918f162816075b87c864aJordy Roseclass CheckerRegistry { 3208b86531ade68727c56918f162816075b87c864aJordy Rosepublic: 3308b86531ade68727c56918f162816075b87c864aJordy Rose typedef void (*InitializationFunction)(CheckerManager &); 3408b86531ade68727c56918f162816075b87c864aJordy Rose struct CheckerInfo { 3508b86531ade68727c56918f162816075b87c864aJordy Rose InitializationFunction Initialize; 3608b86531ade68727c56918f162816075b87c864aJordy Rose StringRef FullName; 3708b86531ade68727c56918f162816075b87c864aJordy Rose StringRef Desc; 3808b86531ade68727c56918f162816075b87c864aJordy Rose 3908b86531ade68727c56918f162816075b87c864aJordy Rose CheckerInfo(InitializationFunction fn, StringRef name, StringRef desc) 4008b86531ade68727c56918f162816075b87c864aJordy Rose : Initialize(fn), FullName(name), Desc(desc) {} 4108b86531ade68727c56918f162816075b87c864aJordy Rose }; 4208b86531ade68727c56918f162816075b87c864aJordy Rose 4308b86531ade68727c56918f162816075b87c864aJordy Rose typedef std::vector<CheckerInfo> CheckerInfoList; 4408b86531ade68727c56918f162816075b87c864aJordy Rose 4508b86531ade68727c56918f162816075b87c864aJordy Roseprivate: 4608b86531ade68727c56918f162816075b87c864aJordy Rose template <typename T> 4708b86531ade68727c56918f162816075b87c864aJordy Rose static void initializeManager(CheckerManager &mgr) { 4808b86531ade68727c56918f162816075b87c864aJordy Rose mgr.registerChecker<T>(); 4908b86531ade68727c56918f162816075b87c864aJordy Rose } 5008b86531ade68727c56918f162816075b87c864aJordy Rose 5108b86531ade68727c56918f162816075b87c864aJordy Rosepublic: 5208b86531ade68727c56918f162816075b87c864aJordy Rose void addChecker(InitializationFunction fn, StringRef fullName, 5308b86531ade68727c56918f162816075b87c864aJordy Rose StringRef desc); 5408b86531ade68727c56918f162816075b87c864aJordy Rose 5508b86531ade68727c56918f162816075b87c864aJordy Rose template <class T> 5608b86531ade68727c56918f162816075b87c864aJordy Rose void addChecker(StringRef fullName, StringRef desc) { 5708b86531ade68727c56918f162816075b87c864aJordy Rose addChecker(&initializeManager<T>, fullName, desc); 5808b86531ade68727c56918f162816075b87c864aJordy Rose } 5908b86531ade68727c56918f162816075b87c864aJordy Rose 6008b86531ade68727c56918f162816075b87c864aJordy Rose void initializeManager(CheckerManager &mgr, 6108b86531ade68727c56918f162816075b87c864aJordy Rose SmallVectorImpl<CheckerOptInfo> &opts) const; 6208b86531ade68727c56918f162816075b87c864aJordy Rose void printHelp(raw_ostream &out, size_t maxNameChars = 30) const ; 6308b86531ade68727c56918f162816075b87c864aJordy Rose 6408b86531ade68727c56918f162816075b87c864aJordy Roseprivate: 6508b86531ade68727c56918f162816075b87c864aJordy Rose mutable CheckerInfoList Checkers; 6608b86531ade68727c56918f162816075b87c864aJordy Rose mutable llvm::StringMap<size_t> Packages; 6708b86531ade68727c56918f162816075b87c864aJordy Rose}; 6808b86531ade68727c56918f162816075b87c864aJordy Rose 6908b86531ade68727c56918f162816075b87c864aJordy Rose} // end namespace ento 7008b86531ade68727c56918f162816075b87c864aJordy Rose} // end namespace clang 7108b86531ade68727c56918f162816075b87c864aJordy Rose 7208b86531ade68727c56918f162816075b87c864aJordy Rose#endif 73