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 @@ -82,7 +82,7 @@ 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 @@ /// 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; }; 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 @@ -51,10 +51,13 @@ 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); Index: cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp =================================================================== --- cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -237,8 +237,11 @@ // 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; } Index: cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp +++ cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp @@ -33,35 +33,36 @@ 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) { Index: cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp +++ cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp @@ -40,8 +40,9 @@ 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 @@ 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 @@ 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::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::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::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';