[PATCH] D54437: [analyzer][NFC] Merge ClangCheckerRegistry to CheckerRegistry
This revision was automatically updated to reflect the committed changes. Closed by commit rL349280: [analyzer][NFC] Merge ClangCheckerRegistry to CheckerRegistry (authored by Szelethus, committed by ). Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D54437?vs=173724&id=178370#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D54437/new/ https://reviews.llvm.org/D54437 Files: cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp Index: cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h === --- cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h +++ cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h @@ -52,7 +52,8 @@ llvm::StringMap &Bodies; }; -void printCheckerHelp(raw_ostream &OS, ArrayRef plugins); +void printCheckerHelp(raw_ostream &OS, ArrayRef plugins, + DiagnosticsEngine &diags); void printEnabledCheckerList(raw_ostream &OS, ArrayRef plugins, const AnalyzerOptions &opts, DiagnosticsEngine &diags); Index: cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h === --- cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h +++ cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h @@ -81,6 +81,8 @@ /// "core.builtin", or the full name "core.builtin.NoReturnFunctionChecker". class CheckerRegistry { public: + CheckerRegistry(ArrayRef plugins, DiagnosticsEngine &diags); + /// Initialization functions perform any necessary setup for a checker. /// They should include a call to CheckerManager::registerChecker. using InitializationFunction = void (*)(CheckerManager &); @@ -122,25 +124,23 @@ /// all checkers specified by the given CheckerOptInfo list. The order of this /// list is significant; later options can be used to reverse earlier ones. /// This can be used to exclude certain checkers in an included package. - void initializeManager(CheckerManager &mgr, const AnalyzerOptions &Opts, - DiagnosticsEngine &diags) const; + void initializeManager(CheckerManager &mgr, + const AnalyzerOptions &Opts) const; /// Check if every option corresponds to a specific checker or package. - void validateCheckerOptions(const AnalyzerOptions &opts, - DiagnosticsEngine &diags) const; + void validateCheckerOptions(const AnalyzerOptions &opts) const; /// Prints the name and description of all checkers in this registry. /// This output is not intended to be machine-parseable. void printHelp(raw_ostream &out, size_t maxNameChars = 30) const; - void printList(raw_ostream &out, const AnalyzerOptions &opts, - DiagnosticsEngine &diags) const; + void printList(raw_ostream &out, const AnalyzerOptions &opts) const; private: - CheckerInfoSet getEnabledCheckers(const AnalyzerOptions &Opts, -DiagnosticsEngine &diags) const; + CheckerInfoSet getEnabledCheckers(const AnalyzerOptions &Opts) const; mutable CheckerInfoList Checkers; mutable llvm::StringMap Packages; + DiagnosticsEngine &Diags; }; } // namespace ento Index: cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp === --- cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp +++ cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp @@ -16,95 +16,15 @@ #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" #include "clang/StaticAnalyzer/Core/CheckerManager.h" -#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" #include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h" #include "clang/StaticAnalyzer/Frontend/FrontendActions.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/FormattedStream.h" -#include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" #include using namespace clang; using namespace ento; -using llvm::sys::DynamicLibrary; - -namespace { -class ClangCheckerRegistry : public CheckerRegistry { - typedef void (*RegisterCheckersFn)(CheckerRegistry &); - - static bool isCompatibleAPIVersion(const char *versionString); - static void warnIncompatible(DiagnosticsEngine *diags, StringRef pluginPath, - const char *pluginAPIVersion); - -public: - ClangCheckerRegistry(ArrayRef plugins, -
[PATCH] D54437: [analyzer][NFC] Merge ClangCheckerRegistry to CheckerRegistry
NoQ accepted this revision. NoQ added a comment. This revision is now accepted and ready to land. Yay! Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D54437/new/ https://reviews.llvm.org/D54437 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D54437: [analyzer][NFC] Merge ClangCheckerRegistry to CheckerRegistry
Szelethus added a comment. Polite ping :) Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D54437/new/ https://reviews.llvm.org/D54437 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D54437: [analyzer][NFC] Merge ClangCheckerRegistry to CheckerRegistry
Szelethus added a comment. Herald added subscribers: gamesh411, baloghadamsoftware. Unfortunately, I found //yet another// corner case I didn't cover: if the macro arguments themselves are macros. I already fixed it, but it raises the question that what other things I may have missed? I genuinely dislike this project, and I fear that I can't test this enough to be be 100% it does it's job perfectly. Heck, I'm a little unsure whether it wouldn't ever cause a crash. This is unnerving to put it lightly, but doing changes within `Preprocessor` is //most definitely// out of my reach. Maybe it'd be worth to caution the users of this feature that it's experimental, but then again, it will always be, as long as there's no out-of-the-box solution from `Preprocessor`. Repository: rC Clang https://reviews.llvm.org/D54437 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D54437: [analyzer][NFC] Merge ClangCheckerRegistry to CheckerRegistry
Szelethus created this revision. Szelethus added reviewers: george.karpenkov, NoQ, xazax.hun. Herald added subscribers: cfe-commits, dkrupp, donat.nagy, mikhail.ramalho, a.sidorin, rnkovacs, szepet, whisperity. Now that `CheckerRegistry` lies in `Frontend`, we can finally eliminate `ClangCheckerRegistry`. Fortunately, this also provides us with a `DiagnosticsEngine`, so I went ahead and removed some parameters from it's methods. Repository: rC Clang https://reviews.llvm.org/D54437 Files: include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h include/clang/StaticAnalyzer/Frontend/FrontendActions.h lib/FrontendTool/ExecuteCompilerInvocation.cpp lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp Index: lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp === --- lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp +++ lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp @@ -10,17 +10,73 @@ #include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h" #include "clang/Basic/Diagnostic.h" #include "clang/Frontend/FrontendDiagnostic.h" +#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" #include "clang/StaticAnalyzer/Core/CheckerManager.h" #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/DynamicLibrary.h" +#include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" #include using namespace clang; using namespace ento; +using llvm::sys::DynamicLibrary; + +using RegisterCheckersFn = void (*)(CheckerRegistry &); + +static bool isCompatibleAPIVersion(const char *versionString) { + // If the version string is null, it's not an analyzer plugin. + if (!versionString) +return false; + + // For now, none of the static analyzer API is considered stable. + // Versions must match exactly. + return strcmp(versionString, CLANG_ANALYZER_API_VERSION_STRING) == 0; +} + +CheckerRegistry::CheckerRegistry(ArrayRef plugins, + DiagnosticsEngine &diags) : Diags(diags) { +#define GET_CHECKERS +#define CHECKER(FULLNAME, CLASS, HELPTEXT) \ + addChecker(register##CLASS, FULLNAME, HELPTEXT); +#include "clang/StaticAnalyzer/Checkers/Checkers.inc" +#undef CHECKER +#undef GET_CHECKERS + + for (ArrayRef::iterator i = plugins.begin(), e = plugins.end(); + i != e; ++i) { +// Get access to the plugin. +std::string err; +DynamicLibrary lib = DynamicLibrary::getPermanentLibrary(i->c_str(), &err); +if (!lib.isValid()) { + diags.Report(diag::err_fe_unable_to_load_plugin) << *i << err; + continue; +} + +// See if it's compatible with this build of clang. +const char *pluginAPIVersion = + (const char *) lib.getAddressOfSymbol("clang_analyzerAPIVersionString"); +if (!isCompatibleAPIVersion(pluginAPIVersion)) { + Diags.Report(diag::warn_incompatible_analyzer_plugin_api) + << llvm::sys::path::filename(*i); + Diags.Report(diag::note_incompatible_analyzer_plugin_api) + << CLANG_ANALYZER_API_VERSION_STRING + << pluginAPIVersion; + continue; +} + +// Register its checkers. +RegisterCheckersFn registerPluginCheckers = + (RegisterCheckersFn) (intptr_t) lib.getAddressOfSymbol( + "clang_registerCheckers"); +if (registerPluginCheckers) + registerPluginCheckers(*this); + } +} static constexpr char PackageSeparator = '.'; @@ -47,8 +103,7 @@ } CheckerRegistry::CheckerInfoSet CheckerRegistry::getEnabledCheckers( - const AnalyzerOptions &Opts, - DiagnosticsEngine &diags) const { +const AnalyzerOptions &Opts) const { assert(std::is_sorted(Checkers.begin(), Checkers.end(), checkerNameLT) && "In order to efficiently gather checkers, this function expects them " @@ -65,7 +120,7 @@ if (firstRelatedChecker == end || !isInPackage(*firstRelatedChecker, opt.first)) { - diags.Report(diag::err_unknown_analyzer_checker) << opt.first; + Diags.Report(diag::err_unknown_analyzer_checker) << opt.first; return {}; } @@ -104,23 +159,22 @@ } void CheckerRegistry::initializeManager(CheckerManager &checkerMgr, -const AnalyzerOptions &Opts, -DiagnosticsEngine &diags) const { +const AnalyzerOptions &Opts) const { // Sort checkers for efficient collection. llvm::sort(Checkers, checkerNameLT); // Collect checkers enabled by the options. - CheckerInfoSet enabledCheckers = getEnabledCheckers(Opts, diags); +