Clang-tidy: don't create ASTConsumers not needed for the set of checks we perform.

Summary:
This doesn't have any significant effect on the performance, but it
looks like a good thing to do.

Reviewers: djasper, klimek

Reviewed By: klimek

CC: cfe-commits

Differential Revision: http://llvm-reviews.chandlerc.com/D2763

llvm-svn: 201340
This commit is contained in:
Alexander Kornienko 2014-02-13 16:10:47 +00:00
parent efe2f7e2c8
commit 298b3823b5
2 changed files with 17 additions and 10 deletions

View File

@ -152,18 +152,24 @@ clang::ASTConsumer *ClangTidyASTConsumerFactory::CreateASTConsumer(
I != E; ++I)
(*I)->registerPPCallbacks(Compiler);
SmallVector<ASTConsumer *, 2> Consumers;
if (CheckFactories->empty())
Consumers.push_back(Finder.newASTConsumer());
AnalyzerOptionsRef Options = Compiler.getAnalyzerOpts();
Options->CheckersControlList = getCheckersControlList();
Options->AnalysisStoreOpt = RegionStoreModel;
Options->AnalysisDiagOpt = PD_NONE;
Options->AnalyzeNestedBlocks = true;
Options->eagerlyAssumeBinOpBifurcation = true;
ento::AnalysisASTConsumer *AnalysisConsumer = ento::CreateAnalysisConsumer(
Compiler.getPreprocessor(), Compiler.getFrontendOpts().OutputFile,
Options, Compiler.getFrontendOpts().Plugins);
AnalysisConsumer->AddDiagnosticConsumer(
new AnalyzerDiagnosticConsumer(Context));
ASTConsumer *Consumers[] = { Finder.newASTConsumer(), AnalysisConsumer };
if (!Options->CheckersControlList.empty()) {
Options->AnalysisStoreOpt = RegionStoreModel;
Options->AnalysisDiagOpt = PD_NONE;
Options->AnalyzeNestedBlocks = true;
Options->eagerlyAssumeBinOpBifurcation = true;
ento::AnalysisASTConsumer *AnalysisConsumer = ento::CreateAnalysisConsumer(
Compiler.getPreprocessor(), Compiler.getFrontendOpts().OutputFile,
Options, Compiler.getFrontendOpts().Plugins);
AnalysisConsumer->AddDiagnosticConsumer(
new AnalyzerDiagnosticConsumer(Context));
Consumers.push_back(AnalysisConsumer);
}
return new MultiplexConsumer(Consumers);
}

View File

@ -90,6 +90,7 @@ public:
typedef std::map<std::string, CheckFactoryBase *> FactoryMap;
FactoryMap::const_iterator begin() const { return Factories.begin(); }
FactoryMap::const_iterator end() const { return Factories.end(); }
bool empty() const { return Factories.empty(); }
private:
FactoryMap Factories;