From d080f935ce18612f028f65f6bd7c6632ded46729 Mon Sep 17 00:00:00 2001 From: Kristof Umann Date: Sat, 26 Jan 2019 15:59:21 +0000 Subject: [PATCH] [analyzer][NFC] Supply CheckerRegistry with AnalyzerOptions Since pretty much all methods of CheckerRegistry has AnalyzerOptions as an argument, it makes sense to just simply require it in it's constructor. Differential Revision: https://reviews.llvm.org/D56988 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@352279 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../StaticAnalyzer/Frontend/CheckerRegistry.h | 12 +++++----- .../StaticAnalyzer/Frontend/FrontendActions.h | 9 +++++--- .../ExecuteCompilerInvocation.cpp | 7 ++++-- .../Frontend/CheckerRegistration.cpp | 13 ++++++----- .../Frontend/CheckerRegistry.cpp | 23 ++++++++----------- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h b/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h index a30e3a7a18..f394ed911b 100644 --- a/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h +++ b/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h @@ -82,7 +82,7 @@ namespace ento { class CheckerRegistry { public: CheckerRegistry(ArrayRef plugins, DiagnosticsEngine &diags, - const LangOptions &LangOpts); + AnalyzerOptions &AnOpts, const LangOptions &LangOpts); /// Initialization functions perform any necessary setup for a checker. /// They should include a call to CheckerManager::registerChecker. @@ -137,24 +137,24 @@ public: /// 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) const; + void initializeManager(CheckerManager &mgr) const; /// Check if every option corresponds to a specific checker or package. - void validateCheckerOptions(const AnalyzerOptions &opts) const; + void validateCheckerOptions() 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) const; + void printList(raw_ostream &out) const; private: - CheckerInfoSet getEnabledCheckers(const AnalyzerOptions &Opts) const; + CheckerInfoSet getEnabledCheckers() const; mutable CheckerInfoList Checkers; mutable llvm::StringMap Packages; DiagnosticsEngine &Diags; + AnalyzerOptions &AnOpts; const LangOptions &LangOpts; }; diff --git a/include/clang/StaticAnalyzer/Frontend/FrontendActions.h b/include/clang/StaticAnalyzer/Frontend/FrontendActions.h index f8bd24df2b..5f26a4893c 100644 --- a/include/clang/StaticAnalyzer/Frontend/FrontendActions.h +++ b/include/clang/StaticAnalyzer/Frontend/FrontendActions.h @@ -51,10 +51,13 @@ private: llvm::StringMap &Bodies; }; -void printCheckerHelp(raw_ostream &OS, ArrayRef plugins, - DiagnosticsEngine &diags, const LangOptions &LangOpts); +void printCheckerHelp(raw_ostream &OS, + ArrayRef plugins, + AnalyzerOptions &opts, + DiagnosticsEngine &diags, + const LangOptions &LangOpts); void printEnabledCheckerList(raw_ostream &OS, ArrayRef plugins, - const AnalyzerOptions &opts, + AnalyzerOptions &opts, DiagnosticsEngine &diags, const LangOptions &LangOpts); void printAnalyzerConfigList(raw_ostream &OS); diff --git a/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/lib/FrontendTool/ExecuteCompilerInvocation.cpp index 2d3fb9035e..c226838786 100644 --- a/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -237,8 +237,11 @@ bool ExecuteCompilerInvocation(CompilerInstance *Clang) { // Honor -analyzer-checker-help. // This should happen AFTER plugins have been loaded! if (Clang->getAnalyzerOpts()->ShowCheckerHelp) { - ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins, - Clang->getDiagnostics(), Clang->getLangOpts()); + ento::printCheckerHelp(llvm::outs(), + Clang->getFrontendOpts().Plugins, + *Clang->getAnalyzerOpts(), + Clang->getDiagnostics(), + Clang->getLangOpts()); return true; } diff --git a/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp b/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp index b753ec3650..fbf9e5b00d 100644 --- a/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp +++ b/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp @@ -33,35 +33,36 @@ std::unique_ptr ento::createCheckerManager( DiagnosticsEngine &diags) { auto checkerMgr = llvm::make_unique(context, opts); - CheckerRegistry allCheckers(plugins, diags, context.getLangOpts()); + CheckerRegistry allCheckers(plugins, diags, opts, context.getLangOpts()); for (const auto &Fn : checkerRegistrationFns) Fn(allCheckers); - allCheckers.initializeManager(*checkerMgr, opts); - allCheckers.validateCheckerOptions(opts); + allCheckers.initializeManager(*checkerMgr); + allCheckers.validateCheckerOptions(); checkerMgr->finishedCheckerRegistration(); return checkerMgr; } void ento::printCheckerHelp(raw_ostream &out, ArrayRef plugins, + AnalyzerOptions &anopts, DiagnosticsEngine &diags, const LangOptions &langOpts) { out << "OVERVIEW: Clang Static Analyzer Checkers List\n\n"; out << "USAGE: -analyzer-checker \n\n"; - CheckerRegistry(plugins, diags, langOpts).printHelp(out); + CheckerRegistry(plugins, diags, anopts, langOpts).printHelp(out); } void ento::printEnabledCheckerList(raw_ostream &out, ArrayRef plugins, - const AnalyzerOptions &opts, + AnalyzerOptions &anopts, DiagnosticsEngine &diags, const LangOptions &langOpts) { out << "OVERVIEW: Clang Static Analyzer Enabled Checkers List\n\n"; - CheckerRegistry(plugins, diags, langOpts).printList(out, opts); + CheckerRegistry(plugins, diags, anopts, langOpts).printList(out); } void ento::printAnalyzerConfigList(raw_ostream &out) { diff --git a/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp b/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp index 3ad5d81702..d7cd4072a8 100644 --- a/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp +++ b/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp @@ -40,8 +40,9 @@ static bool isCompatibleAPIVersion(const char *versionString) { CheckerRegistry::CheckerRegistry(ArrayRef plugins, DiagnosticsEngine &diags, + AnalyzerOptions &AnOpts, const LangOptions &LangOpts) - : Diags(diags), LangOpts(LangOpts) { + : Diags(diags), AnOpts(AnOpts), LangOpts(LangOpts) { #define GET_CHECKERS #define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI) \ @@ -106,8 +107,7 @@ static bool isInPackage(const CheckerRegistry::CheckerInfo &checker, return false; } -CheckerRegistry::CheckerInfoSet CheckerRegistry::getEnabledCheckers( - const AnalyzerOptions &Opts) const { +CheckerRegistry::CheckerInfoSet CheckerRegistry::getEnabledCheckers() const { assert(std::is_sorted(Checkers.begin(), Checkers.end(), checkerNameLT) && "In order to efficiently gather checkers, this function expects them " @@ -116,7 +116,7 @@ CheckerRegistry::CheckerInfoSet CheckerRegistry::getEnabledCheckers( CheckerInfoSet enabledCheckers; const auto end = Checkers.cend(); - for (const std::pair &opt : Opts.CheckersControlList) { + for (const std::pair &opt : AnOpts.CheckersControlList) { // Use a binary search to find the possible start of the package. CheckerRegistry::CheckerInfo packageInfo(nullptr, nullptr, opt.first, "", ""); @@ -167,13 +167,12 @@ void CheckerRegistry::addChecker(InitializationFunction Rfn, } } -void CheckerRegistry::initializeManager(CheckerManager &checkerMgr, - const AnalyzerOptions &Opts) const { +void CheckerRegistry::initializeManager(CheckerManager &checkerMgr) const { // Sort checkers for efficient collection. llvm::sort(Checkers, checkerNameLT); // Collect checkers enabled by the options. - CheckerInfoSet enabledCheckers = getEnabledCheckers(Opts); + CheckerInfoSet enabledCheckers = getEnabledCheckers(); // Initialize the CheckerManager with all enabled checkers. for (const auto *i : enabledCheckers) { @@ -182,9 +181,8 @@ void CheckerRegistry::initializeManager(CheckerManager &checkerMgr, } } -void CheckerRegistry::validateCheckerOptions( - const AnalyzerOptions &opts) const { - for (const auto &config : opts.Config) { +void CheckerRegistry::validateCheckerOptions() const { + for (const auto &config : AnOpts.Config) { size_t pos = config.getKey().find(':'); if (pos == StringRef::npos) continue; @@ -241,13 +239,12 @@ void CheckerRegistry::printHelp(raw_ostream &out, } } -void CheckerRegistry::printList(raw_ostream &out, - const AnalyzerOptions &opts) const { +void CheckerRegistry::printList(raw_ostream &out) const { // Sort checkers for efficient collection. llvm::sort(Checkers, checkerNameLT); // Collect checkers enabled by the options. - CheckerInfoSet enabledCheckers = getEnabledCheckers(opts); + CheckerInfoSet enabledCheckers = getEnabledCheckers(); for (const auto *i : enabledCheckers) out << i->FullName << '\n'; -- 2.40.0