Author: Alexander Belyaev Date: 2021-01-08T14:17:18+01:00 New Revision: 9c4b2225b24de07a728715ce20238803370413ea
URL: https://github.com/llvm/llvm-project/commit/9c4b2225b24de07a728715ce20238803370413ea DIFF: https://github.com/llvm/llvm-project/commit/9c4b2225b24de07a728715ce20238803370413ea.diff LOG: Revert "Revert "Revert "Revert "Revert "[analyzer] NFC: Move path diagnostic consumer implementations to libAnalysis.""""" This reverts commit 6b0ee02747ed22d41e175d15f27025183341e6f8. Circular dependency again. Added: clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp Modified: clang/include/clang/CrossTU/CrossTranslationUnit.h clang/include/clang/StaticAnalyzer/Core/Analyses.def clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h clang/include/clang/module.modulemap clang/lib/Analysis/CMakeLists.txt clang/lib/CrossTU/CrossTranslationUnit.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/lib/StaticAnalyzer/Core/CMakeLists.txt clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp Removed: clang/include/clang/Analysis/CrossTUAnalysisHelper.h clang/include/clang/Analysis/PathDiagnosticConsumers.def clang/include/clang/Analysis/PathDiagnosticConsumers.h clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp clang/lib/Analysis/TextPathDiagnosticConsumer.cpp ################################################################################ diff --git a/clang/include/clang/Analysis/CrossTUAnalysisHelper.h b/clang/include/clang/Analysis/CrossTUAnalysisHelper.h deleted file mode 100644 index 500e78ddedcf..000000000000 --- a/clang/include/clang/Analysis/CrossTUAnalysisHelper.h +++ /dev/null @@ -1,41 +0,0 @@ -//===- CrossTUAnalysisHelper.h - Abstraction layer for CTU ------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H -#define LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H - -#include "llvm/ADT/Optional.h" -#include "clang/Basic/SourceManager.h" - -namespace clang { - -class ASTUnit; - -/// This class is an abstract interface acting as a bridge between -/// an analysis that requires lookups across translation units (a user -/// of that interface) and the facility that implements such lookups -/// (an implementation of that interface). This is useful to break direct -/// link-time dependencies between the (possibly shared) libraries in which -/// the user and the implementation live. -class CrossTUAnalysisHelper { -public: - /// Determine the original source location in the original TU for an - /// imported source location. - /// \p ToLoc Source location in the imported-to AST. - /// \return Source location in the imported-from AST and the corresponding - /// ASTUnit object (the AST was loaded from a file using an internal ASTUnit - /// object that is returned here). - /// If any error happens (ToLoc is a non-imported source location) empty is - /// returned. - virtual llvm::Optional<std::pair<SourceLocation /*FromLoc*/, Preprocessor *>> - getImportedFromSourceLocationWithPreprocessor(SourceLocation ToLoc) const = 0; - - virtual ~CrossTUAnalysisHelper() {} -}; -} // namespace clang - -#endif // LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H diff --git a/clang/include/clang/Analysis/PathDiagnosticConsumers.def b/clang/include/clang/Analysis/PathDiagnosticConsumers.def deleted file mode 100644 index 33d2072fcf31..000000000000 --- a/clang/include/clang/Analysis/PathDiagnosticConsumers.def +++ /dev/null @@ -1,50 +0,0 @@ -//===-- PathDiagnosticConsumers.def - Visualizing warnings ------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file defines the set of path diagnostic consumers - objects that -// implement diff erent representations of static analysis results. -// -//===----------------------------------------------------------------------===// - -#ifndef ANALYSIS_DIAGNOSTICS -#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN) -#endif - -ANALYSIS_DIAGNOSTICS(HTML, "html", "Output analysis results using HTML", - createHTMLDiagnosticConsumer) - -ANALYSIS_DIAGNOSTICS( - HTML_SINGLE_FILE, "html-single-file", - "Output analysis results using HTML (not allowing for multi-file bugs)", - createHTMLSingleFileDiagnosticConsumer) - -ANALYSIS_DIAGNOSTICS(PLIST, "plist", "Output analysis results using Plists", - createPlistDiagnosticConsumer) - -ANALYSIS_DIAGNOSTICS( - PLIST_MULTI_FILE, "plist-multi-file", - "Output analysis results using Plists (allowing for multi-file bugs)", - createPlistMultiFileDiagnosticConsumer) - -ANALYSIS_DIAGNOSTICS(PLIST_HTML, "plist-html", - "Output analysis results using HTML wrapped with Plists", - createPlistHTMLDiagnosticConsumer) - -ANALYSIS_DIAGNOSTICS(SARIF, "sarif", "Output analysis results in a SARIF file", - createSarifDiagnosticConsumer) - -ANALYSIS_DIAGNOSTICS(TEXT, "text", "Text output of analysis results to stderr", - createTextPathDiagnosticConsumer) - -ANALYSIS_DIAGNOSTICS(TEXT_MINIMAL, "text-minimal", - "Emits minimal diagnostics to stderr, stating only the " - "warning message and the associated notes. Usually " - "used in addition to other analysis types", - createTextMinimalPathDiagnosticConsumer) - -#undef ANALYSIS_DIAGNOSTICS diff --git a/clang/include/clang/CrossTU/CrossTranslationUnit.h b/clang/include/clang/CrossTU/CrossTranslationUnit.h index 21201f637833..027c6f16430b 100644 --- a/clang/include/clang/CrossTU/CrossTranslationUnit.h +++ b/clang/include/clang/CrossTU/CrossTranslationUnit.h @@ -14,7 +14,6 @@ #ifndef LLVM_CLANG_CROSSTU_CROSSTRANSLATIONUNIT_H #define LLVM_CLANG_CROSSTU_CROSSTRANSLATIONUNIT_H -#include "clang/Analysis/CrossTUAnalysisHelper.h" #include "clang/AST/ASTImporterSharedState.h" #include "clang/Basic/LLVM.h" #include "llvm/ADT/DenseMap.h" @@ -121,10 +120,10 @@ bool containsConst(const VarDecl *VD, const ASTContext &ACtx); /// the locations of the AST files for each definition. /// /// Note that this class also implements caching. -class CrossTranslationUnitContext : public CrossTUAnalysisHelper { +class CrossTranslationUnitContext { public: CrossTranslationUnitContext(CompilerInstance &CI); - ~CrossTranslationUnitContext() override; + ~CrossTranslationUnitContext(); /// This function loads a function or variable definition from an /// external AST file and merges it into the original AST. @@ -187,24 +186,12 @@ class CrossTranslationUnitContext : public CrossTUAnalysisHelper { /// imported source location. /// \p ToLoc Source location in the imported-to AST. /// \return Source location in the imported-from AST and the corresponding - /// ASTUnit object (the AST was loaded from a file using an internal ASTUni + /// ASTUnit object (the AST was loaded from a file using an internal ASTUnit /// object that is returned here). /// If any error happens (ToLoc is a non-imported source location) empty is /// returned. llvm::Optional<std::pair<SourceLocation /*FromLoc*/, ASTUnit *>> - getImportedFromSourceLocation(SourceLocation ToLoc) const; - - /// Determine the original source location in the original TU for an - /// imported source location. - /// \p ToLoc Source location in the imported-to AST. - /// \return Source location in the imported-from AST and the Preprocessor - /// corresponding to the AST unit that originally contained the imported-from - /// source location. - /// If any error happens (ToLoc is a non-imported source location) empty is - /// returned. - llvm::Optional<std::pair<SourceLocation /*FromLoc*/, Preprocessor *>> - getImportedFromSourceLocationWithPreprocessor( - SourceLocation ToLoc) const override; + getImportedFromSourceLocation(const clang::SourceLocation &ToLoc) const; private: using ImportedFileIDMap = diff --git a/clang/include/clang/StaticAnalyzer/Core/Analyses.def b/clang/include/clang/StaticAnalyzer/Core/Analyses.def index 2e98cbba4c9e..c4e5f5be6fd7 100644 --- a/clang/include/clang/StaticAnalyzer/Core/Analyses.def +++ b/clang/include/clang/StaticAnalyzer/Core/Analyses.def @@ -28,6 +28,42 @@ ANALYSIS_CONSTRAINTS(RangeConstraints, "range", ANALYSIS_CONSTRAINTS(Z3Constraints, "z3", "Use Z3 contraint solver", CreateZ3ConstraintManager) +#ifndef ANALYSIS_DIAGNOSTICS +#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN) +#endif + +ANALYSIS_DIAGNOSTICS(HTML, "html", "Output analysis results using HTML", + createHTMLDiagnosticConsumer) + +ANALYSIS_DIAGNOSTICS( + HTML_SINGLE_FILE, "html-single-file", + "Output analysis results using HTML (not allowing for multi-file bugs)", + createHTMLSingleFileDiagnosticConsumer) + +ANALYSIS_DIAGNOSTICS(PLIST, "plist", "Output analysis results using Plists", + createPlistDiagnosticConsumer) + +ANALYSIS_DIAGNOSTICS( + PLIST_MULTI_FILE, "plist-multi-file", + "Output analysis results using Plists (allowing for multi-file bugs)", + createPlistMultiFileDiagnosticConsumer) + +ANALYSIS_DIAGNOSTICS(PLIST_HTML, "plist-html", + "Output analysis results using HTML wrapped with Plists", + createPlistHTMLDiagnosticConsumer) + +ANALYSIS_DIAGNOSTICS(SARIF, "sarif", "Output analysis results in a SARIF file", + createSarifDiagnosticConsumer) + +ANALYSIS_DIAGNOSTICS(TEXT, "text", "Text output of analysis results to stderr", + createTextPathDiagnosticConsumer) + +ANALYSIS_DIAGNOSTICS(TEXT_MINIMAL, "text-minimal", + "Emits minimal diagnostics to stderr, stating only the " + "warning message and the associated notes. Usually " + "used in addition to other analysis types", + createTextMinimalPathDiagnosticConsumer) + #ifndef ANALYSIS_PURGE #define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) #endif @@ -55,6 +91,7 @@ ANALYSIS_INLINING_MODE( #undef ANALYSIS_STORE #undef ANALYSIS_CONSTRAINTS +#undef ANALYSIS_DIAGNOSTICS #undef ANALYSIS_PURGE #undef ANALYSIS_INLINING_MODE #undef ANALYSIS_IPA diff --git a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h index 0dd2c86c5ca9..ccf35e0a81ec 100644 --- a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h @@ -58,7 +58,7 @@ NumConstraints /// analysis results. enum AnalysisDiagClients { #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) PD_##NAME, -#include "clang/Analysis/PathDiagnosticConsumers.def" +#include "clang/StaticAnalyzer/Core/Analyses.def" PD_NONE, NUM_ANALYSIS_DIAG_CLIENTS }; diff --git a/clang/include/clang/Analysis/PathDiagnosticConsumers.h b/clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h similarity index 78% rename from clang/include/clang/Analysis/PathDiagnosticConsumers.h rename to clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h index fde2e3498216..f40f88eb32ff 100644 --- a/clang/include/clang/Analysis/PathDiagnosticConsumers.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h @@ -18,24 +18,25 @@ #include <string> #include <vector> -#include "clang/Analysis/PathDiagnostic.h" - namespace clang { class AnalyzerOptions; class Preprocessor; -class CrossTUAnalysisHelper; +namespace cross_tu { +class CrossTranslationUnitContext; +} namespace ento { class PathDiagnosticConsumer; -typedef std::vector<PathDiagnosticConsumer *> PathDiagnosticConsumers; +typedef std::vector<PathDiagnosticConsumer*> PathDiagnosticConsumers; #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN) \ void CREATEFN(PathDiagnosticConsumerOptions Diagopts, \ PathDiagnosticConsumers &C, const std::string &Prefix, \ - const Preprocessor &PP, const CrossTUAnalysisHelper &CTU); -#include "clang/Analysis/PathDiagnosticConsumers.def" + const Preprocessor &PP, \ + const cross_tu::CrossTranslationUnitContext &CTU); +#include "clang/StaticAnalyzer/Core/Analyses.def" } // end 'ento' namespace } // end 'clang' namespace diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h index 7e8b9de3a942..c76e9c0326af 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h @@ -16,10 +16,10 @@ #include "clang/Analysis/AnalysisDeclContext.h" #include "clang/Analysis/PathDiagnostic.h" -#include "clang/Analysis/PathDiagnosticConsumers.h" #include "clang/Lex/Preprocessor.h" #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" +#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" namespace clang { diff --git a/clang/include/clang/module.modulemap b/clang/include/clang/module.modulemap index ec396e1532e0..332e533f0347 100644 --- a/clang/include/clang/module.modulemap +++ b/clang/include/clang/module.modulemap @@ -3,7 +3,6 @@ module Clang_Analysis { umbrella "Analysis" textual header "Analysis/Analyses/ThreadSafetyOps.def" - textual header "Analysis/PathDiagnosticConsumers.def" module * { export * } diff --git a/clang/lib/Analysis/CMakeLists.txt b/clang/lib/Analysis/CMakeLists.txt index 94c6e322e02b..ed626a6e130c 100644 --- a/clang/lib/Analysis/CMakeLists.txt +++ b/clang/lib/Analysis/CMakeLists.txt @@ -18,19 +18,14 @@ add_clang_library(clangAnalysis CodeInjector.cpp Dominators.cpp ExprMutationAnalyzer.cpp - HTMLPathDiagnosticConsumer.cpp IssueHash.cpp LiveVariables.cpp ObjCNoReturn.cpp PathDiagnostic.cpp - PlistPathDiagnosticConsumer.cpp - PlistHTMLPathDiagnosticConsumer.cpp PostOrderCFGView.cpp ProgramPoint.cpp ReachableCode.cpp RetainSummaryManager.cpp - SarifPathDiagnosticConsumer.cpp - TextPathDiagnosticConsumer.cpp ThreadSafety.cpp ThreadSafetyCommon.cpp ThreadSafetyLogical.cpp @@ -42,8 +37,6 @@ add_clang_library(clangAnalysis clangASTMatchers clangBasic clangLex - clangRewrite - clangToolingCore DEPENDS omp_gen diff --git a/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp b/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp deleted file mode 100644 index ca453ff700bd..000000000000 --- a/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//===--- PlistHTMLDiagnostics.cpp - The Plist-HTML Diagnostic Consumer. ---===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This diagnostic consumer produces both the HTML output and the Plist output. -// -//===----------------------------------------------------------------------===// - -#include "clang/Analysis/PathDiagnostic.h" -#include "clang/Analysis/PathDiagnosticConsumers.h" -#include "clang/Basic/SourceManager.h" -#include "clang/Lex/Preprocessor.h" -#include "llvm/Support/Path.h" - -using namespace clang; -using namespace ento; - -namespace clang { -class CrossTUAnalysisHelper; -} - -void ento::createPlistHTMLDiagnosticConsumer( - PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, - const std::string &Prefix, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { - createHTMLDiagnosticConsumer( - DiagOpts, C, std::string(llvm::sys::path::parent_path(Prefix)), PP, CTU); - createPlistMultiFileDiagnosticConsumer(DiagOpts, C, Prefix, PP, CTU); - createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, Prefix, PP, - CTU); -} diff --git a/clang/lib/CrossTU/CrossTranslationUnit.cpp b/clang/lib/CrossTU/CrossTranslationUnit.cpp index 5ab5d6def2a2..e27779f91abc 100644 --- a/clang/lib/CrossTU/CrossTranslationUnit.cpp +++ b/clang/lib/CrossTU/CrossTranslationUnit.cpp @@ -765,7 +765,7 @@ CrossTranslationUnitContext::getOrCreateASTImporter(ASTUnit *Unit) { llvm::Optional<std::pair<SourceLocation, ASTUnit *>> CrossTranslationUnitContext::getImportedFromSourceLocation( - SourceLocation ToLoc) const { + const clang::SourceLocation &ToLoc) const { const SourceManager &SM = Context.getSourceManager(); auto DecToLoc = SM.getDecomposedLoc(ToLoc); @@ -781,16 +781,5 @@ CrossTranslationUnitContext::getImportedFromSourceLocation( return std::make_pair(FromLoc, Unit); } -llvm::Optional<std::pair<SourceLocation, Preprocessor *>> -CrossTranslationUnitContext::getImportedFromSourceLocationWithPreprocessor( - SourceLocation ToLoc) const { - if (llvm::Optional<std::pair<SourceLocation, ASTUnit *>> LocAndUnit = - getImportedFromSourceLocation(ToLoc)) { - return std::make_pair(LocAndUnit->first, - &LocAndUnit->second->getPreprocessor()); - } - return None; -} - } // namespace cross_tu } // namespace clang diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 348f5582bde2..6795151d08d5 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -571,7 +571,7 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name) #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ .Case(CMDFLAG, PD_##NAME) -#include "clang/Analysis/PathDiagnosticConsumers.def" +#include "clang/StaticAnalyzer/Core/Analyses.def" .Default(NUM_ANALYSIS_DIAG_CLIENTS); if (Value == NUM_ANALYSIS_DIAG_CLIENTS) { Diags.Report(diag::err_drv_invalid_value) diff --git a/clang/lib/StaticAnalyzer/Core/CMakeLists.txt b/clang/lib/StaticAnalyzer/Core/CMakeLists.txt index b1f527ed75d5..d947d415ad6e 100644 --- a/clang/lib/StaticAnalyzer/Core/CMakeLists.txt +++ b/clang/lib/StaticAnalyzer/Core/CMakeLists.txt @@ -30,13 +30,16 @@ add_clang_library(clangStaticAnalyzerCore ExprEngineCallAndReturn.cpp ExprEngineObjC.cpp FunctionSummary.cpp + HTMLDiagnostics.cpp LoopUnrolling.cpp LoopWidening.cpp MemRegion.cpp + PlistDiagnostics.cpp ProgramState.cpp RangeConstraintManager.cpp RangedConstraintManager.cpp RegionStore.cpp + SarifDiagnostics.cpp SimpleConstraintManager.cpp SimpleSValBuilder.cpp SMTConstraintManager.cpp @@ -44,6 +47,7 @@ add_clang_library(clangStaticAnalyzerCore SValBuilder.cpp SVals.cpp SymbolManager.cpp + TextDiagnostics.cpp WorkList.cpp LINK_LIBS diff --git a/clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp similarity index 91% rename from clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp rename to clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp index fb60819b1c15..149459cf986a 100644 --- a/clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp +++ b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp @@ -1,4 +1,4 @@ -//===- HTMLPathDiagnosticConsumer.cpp - HTML Diagnostics for Paths --------===// +//===- HTMLDiagnostics.cpp - HTML Diagnostics for Paths -------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,13 +6,12 @@ // //===----------------------------------------------------------------------===// // -// This file defines the HTMLPathDiagnosticConsumer object. +// This file defines the HTMLDiagnostics object. // //===----------------------------------------------------------------------===// #include "clang/Analysis/IssueHash.h" #include "clang/Analysis/PathDiagnostic.h" -#include "clang/Analysis/PathDiagnosticConsumers.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" #include "clang/AST/Stmt.h" @@ -25,6 +24,7 @@ #include "clang/Lex/Token.h" #include "clang/Rewrite/Core/HTMLRewrite.h" #include "clang/Rewrite/Core/Rewriter.h" +#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" @@ -50,17 +50,13 @@ using namespace clang; using namespace ento; -namespace clang { -class CrossTUAnalysisHelper; -} - //===----------------------------------------------------------------------===// // Boilerplate. //===----------------------------------------------------------------------===// namespace { -class HTMLPathDiagnosticConsumer : public PathDiagnosticConsumer { +class HTMLDiagnostics : public PathDiagnosticConsumer { PathDiagnosticConsumerOptions DiagOpts; std::string Directory; bool createdDir = false; @@ -69,18 +65,20 @@ class HTMLPathDiagnosticConsumer : public PathDiagnosticConsumer { const bool SupportsCrossFileDiagnostics; public: - HTMLPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts, - const std::string &OutputDir, - const Preprocessor &PP, bool SupportsMultipleFiles) - : DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(PP), - SupportsCrossFileDiagnostics(SupportsMultipleFiles) {} + HTMLDiagnostics(PathDiagnosticConsumerOptions DiagOpts, + const std::string &OutputDir, const Preprocessor &pp, + bool supportsMultipleFiles) + : DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(pp), + SupportsCrossFileDiagnostics(supportsMultipleFiles) {} - ~HTMLPathDiagnosticConsumer() override { FlushDiagnostics(nullptr); } + ~HTMLDiagnostics() override { FlushDiagnostics(nullptr); } void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) override; - StringRef getName() const override { return "HTMLPathDiagnosticConsumer"; } + StringRef getName() const override { + return "HTMLDiagnostics"; + } bool supportsCrossFileDiagnostics() const override { return SupportsCrossFileDiagnostics; @@ -137,7 +135,7 @@ class HTMLPathDiagnosticConsumer : public PathDiagnosticConsumer { void ento::createHTMLDiagnosticConsumer( PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, const std::string &OutputDir, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { + const cross_tu::CrossTranslationUnitContext &CTU) { // FIXME: HTML is currently our default output type, but if the output // directory isn't specified, it acts like if it was in the minimal text @@ -150,36 +148,47 @@ void ento::createHTMLDiagnosticConsumer( if (OutputDir.empty()) return; - C.push_back( - new HTMLPathDiagnosticConsumer(std::move(DiagOpts), OutputDir, PP, true)); + C.push_back(new HTMLDiagnostics(std::move(DiagOpts), OutputDir, PP, true)); } void ento::createHTMLSingleFileDiagnosticConsumer( PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, const std::string &OutputDir, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { + const cross_tu::CrossTranslationUnitContext &CTU) { createTextMinimalPathDiagnosticConsumer(DiagOpts, C, OutputDir, PP, CTU); // TODO: Emit an error here. if (OutputDir.empty()) return; - C.push_back(new HTMLPathDiagnosticConsumer(std::move(DiagOpts), OutputDir, PP, - false)); + C.push_back(new HTMLDiagnostics(std::move(DiagOpts), OutputDir, PP, false)); +} + +void ento::createPlistHTMLDiagnosticConsumer( + PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, + const std::string &prefix, const Preprocessor &PP, + const cross_tu::CrossTranslationUnitContext &CTU) { + createHTMLDiagnosticConsumer( + DiagOpts, C, std::string(llvm::sys::path::parent_path(prefix)), PP, + CTU); + createPlistMultiFileDiagnosticConsumer(DiagOpts, C, prefix, PP, CTU); + createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, prefix, PP, + CTU); } //===----------------------------------------------------------------------===// // Report processing. //===----------------------------------------------------------------------===// -void HTMLPathDiagnosticConsumer::FlushDiagnosticsImpl( - std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) { +void HTMLDiagnostics::FlushDiagnosticsImpl( + std::vector<const PathDiagnostic *> &Diags, + FilesMade *filesMade) { for (const auto Diag : Diags) ReportDiag(*Diag, filesMade); } -void HTMLPathDiagnosticConsumer::ReportDiag(const PathDiagnostic &D, - FilesMade *filesMade) { +void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D, + FilesMade *filesMade) { // Create the HTML directory if it is missing. if (!createdDir) { createdDir = true; @@ -287,11 +296,8 @@ void HTMLPathDiagnosticConsumer::ReportDiag(const PathDiagnostic &D, os << report; } -std::string HTMLPathDiagnosticConsumer::GenerateHTML(const PathDiagnostic &D, - Rewriter &R, - const SourceManager &SMgr, - const PathPieces &path, - const char *declName) { +std::string HTMLDiagnostics::GenerateHTML(const PathDiagnostic& D, Rewriter &R, + const SourceManager& SMgr, const PathPieces& path, const char *declName) { // Rewrite source files as HTML for every new file the path crosses std::vector<FileID> FileIDs; for (auto I : path) { @@ -363,8 +369,9 @@ std::string HTMLPathDiagnosticConsumer::GenerateHTML(const PathDiagnostic &D, return os.str(); } -void HTMLPathDiagnosticConsumer::dumpCoverageData( - const PathDiagnostic &D, const PathPieces &path, +void HTMLDiagnostics::dumpCoverageData( + const PathDiagnostic &D, + const PathPieces &path, llvm::raw_string_ostream &os) { const FilesToLineNumsMap &ExecutedLines = D.getExecutedLines(); @@ -388,8 +395,8 @@ void HTMLPathDiagnosticConsumer::dumpCoverageData( os << "};"; } -std::string HTMLPathDiagnosticConsumer::showRelevantLinesJavascript( - const PathDiagnostic &D, const PathPieces &path) { +std::string HTMLDiagnostics::showRelevantLinesJavascript( + const PathDiagnostic &D, const PathPieces &path) { std::string s; llvm::raw_string_ostream os(s); os << "<script type='text/javascript'>\n"; @@ -453,10 +460,9 @@ document.addEventListener("DOMContentLoaded", function() { return os.str(); } -void HTMLPathDiagnosticConsumer::FinalizeHTML( - const PathDiagnostic &D, Rewriter &R, const SourceManager &SMgr, - const PathPieces &path, FileID FID, const FileEntry *Entry, - const char *declName) { +void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic& D, Rewriter &R, + const SourceManager& SMgr, const PathPieces& path, FileID FID, + const FileEntry *Entry, const char *declName) { // This is a cludge; basically we want to append either the full // working directory if we have no directory information. This is // a work in progress. @@ -601,7 +607,7 @@ void HTMLPathDiagnosticConsumer::FinalizeHTML( html::AddHeaderFooterInternalBuiltinCSS(R, FID, Entry->getName()); } -StringRef HTMLPathDiagnosticConsumer::showHelpJavascript() { +StringRef HTMLDiagnostics::showHelpJavascript() { return R"<<<( <script type='text/javascript'> @@ -684,9 +690,8 @@ static void HandlePopUpPieceEndTag(Rewriter &R, } } -void HTMLPathDiagnosticConsumer::RewriteFile(Rewriter &R, - const PathPieces &path, - FileID FID) { +void HTMLDiagnostics::RewriteFile(Rewriter &R, + const PathPieces& path, FileID FID) { // Process the path. // Maintain the counts of extra note pieces separately. unsigned TotalPieces = path.size(); @@ -764,9 +769,10 @@ void HTMLPathDiagnosticConsumer::RewriteFile(Rewriter &R, html::HighlightMacros(R, FID, PP); } -void HTMLPathDiagnosticConsumer::HandlePiece( - Rewriter &R, FileID BugFileID, const PathDiagnosticPiece &P, - const std::vector<SourceRange> &PopUpRanges, unsigned num, unsigned max) { +void HTMLDiagnostics::HandlePiece(Rewriter &R, FileID BugFileID, + const PathDiagnosticPiece &P, + const std::vector<SourceRange> &PopUpRanges, + unsigned num, unsigned max) { // For now, just draw a box above the line in question, and emit the // warning. FullSourceLoc Pos = P.getLocation().asLocation(); @@ -998,8 +1004,9 @@ static void EmitAlphaCounter(raw_ostream &os, unsigned n) { os << char('a' + x); } -unsigned HTMLPathDiagnosticConsumer::ProcessMacroPiece( - raw_ostream &os, const PathDiagnosticMacroPiece &P, unsigned num) { +unsigned HTMLDiagnostics::ProcessMacroPiece(raw_ostream &os, + const PathDiagnosticMacroPiece& P, + unsigned num) { for (const auto &subPiece : P.subPieces) { if (const auto *MP = dyn_cast<PathDiagnosticMacroPiece>(subPiece.get())) { num = ProcessMacroPiece(os, *MP, num); @@ -1021,10 +1028,10 @@ unsigned HTMLPathDiagnosticConsumer::ProcessMacroPiece( return num; } -void HTMLPathDiagnosticConsumer::HighlightRange(Rewriter &R, FileID BugFileID, - SourceRange Range, - const char *HighlightStart, - const char *HighlightEnd) { +void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID, + SourceRange Range, + const char *HighlightStart, + const char *HighlightEnd) { SourceManager &SM = R.getSourceMgr(); const LangOptions &LangOpts = R.getLangOpts(); @@ -1059,7 +1066,7 @@ void HTMLPathDiagnosticConsumer::HighlightRange(Rewriter &R, FileID BugFileID, html::HighlightRange(R, InstantiationStart, E, HighlightStart, HighlightEnd); } -StringRef HTMLPathDiagnosticConsumer::generateKeyboardNavigationJavascript() { +StringRef HTMLDiagnostics::generateKeyboardNavigationJavascript() { return R"<<<( <script type='text/javascript'> var digitMatcher = new RegExp("[0-9]+"); diff --git a/clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp b/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp similarity index 96% rename from clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp rename to clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp index 52a488162dba..35e320c7755f 100644 --- a/clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp +++ b/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp @@ -1,4 +1,4 @@ -//===--- PlistPathDiagnosticConsumer.cpp - Plist Diagnostics ----*- C++ -*-===// +//===--- PlistDiagnostics.cpp - Plist Diagnostics for Paths -----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,21 +6,22 @@ // //===----------------------------------------------------------------------===// // -// This file defines the PlistPathDiagnosticConsumer object. +// This file defines the PlistDiagnostics object. // //===----------------------------------------------------------------------===// -#include "clang/Analysis/CrossTUAnalysisHelper.h" #include "clang/Analysis/IssueHash.h" #include "clang/Analysis/PathDiagnostic.h" -#include "clang/Analysis/PathDiagnosticConsumers.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/PlistSupport.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/Version.h" +#include "clang/CrossTU/CrossTranslationUnit.h" +#include "clang/Frontend/ASTUnit.h" #include "clang/Lex/Preprocessor.h" #include "clang/Lex/TokenConcatenation.h" #include "clang/Rewrite/Core/HTMLRewrite.h" +#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" @@ -37,29 +38,29 @@ using namespace markup; //===----------------------------------------------------------------------===// namespace { - class PlistPathDiagnosticConsumer : public PathDiagnosticConsumer { + class PlistDiagnostics : public PathDiagnosticConsumer { PathDiagnosticConsumerOptions DiagOpts; const std::string OutputFile; const Preprocessor &PP; - const CrossTUAnalysisHelper &CTU; + const cross_tu::CrossTranslationUnitContext &CTU; const bool SupportsCrossFileDiagnostics; void printBugPath(llvm::raw_ostream &o, const FIDMap &FM, const PathPieces &Path); public: - PlistPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts, + PlistDiagnostics(PathDiagnosticConsumerOptions DiagOpts, const std::string &OutputFile, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU, + const cross_tu::CrossTranslationUnitContext &CTU, bool supportsMultipleFiles); - ~PlistPathDiagnosticConsumer() override {} + ~PlistDiagnostics() override {} void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) override; StringRef getName() const override { - return "PlistPathDiagnosticConsumer"; + return "PlistDiagnostics"; } PathGenerationScheme getGenerationScheme() const override { @@ -78,13 +79,13 @@ namespace { class PlistPrinter { const FIDMap& FM; const Preprocessor &PP; - const CrossTUAnalysisHelper &CTU; + const cross_tu::CrossTranslationUnitContext &CTU; llvm::SmallVector<const PathDiagnosticMacroPiece *, 0> MacroPieces; public: PlistPrinter(const FIDMap& FM, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) + const cross_tu::CrossTranslationUnitContext &CTU) : FM(FM), PP(PP), CTU(CTU) { } @@ -174,7 +175,7 @@ static void printCoverage(const PathDiagnostic *D, static ExpansionInfo getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU); + const cross_tu::CrossTranslationUnitContext &CTU); //===----------------------------------------------------------------------===// // Methods of PlistPrinter. @@ -515,12 +516,12 @@ static void printCoverage(const PathDiagnostic *D, } //===----------------------------------------------------------------------===// -// Methods of PlistPathDiagnosticConsumer. +// Methods of PlistDiagnostics. //===----------------------------------------------------------------------===// -PlistPathDiagnosticConsumer::PlistPathDiagnosticConsumer( +PlistDiagnostics::PlistDiagnostics( PathDiagnosticConsumerOptions DiagOpts, const std::string &output, - const Preprocessor &PP, const CrossTUAnalysisHelper &CTU, + const Preprocessor &PP, const cross_tu::CrossTranslationUnitContext &CTU, bool supportsMultipleFiles) : DiagOpts(std::move(DiagOpts)), OutputFile(output), PP(PP), CTU(CTU), SupportsCrossFileDiagnostics(supportsMultipleFiles) { @@ -531,14 +532,14 @@ PlistPathDiagnosticConsumer::PlistPathDiagnosticConsumer( void ento::createPlistDiagnosticConsumer( PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, const std::string &OutputFile, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { + const cross_tu::CrossTranslationUnitContext &CTU) { // TODO: Emit an error here. if (OutputFile.empty()) return; - C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP, CTU, - /*supportsMultipleFiles=*/false)); + C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU, + /*supportsMultipleFiles=*/false)); createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, OutputFile, PP, CTU); } @@ -546,21 +547,20 @@ void ento::createPlistDiagnosticConsumer( void ento::createPlistMultiFileDiagnosticConsumer( PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, const std::string &OutputFile, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { + const cross_tu::CrossTranslationUnitContext &CTU) { // TODO: Emit an error here. if (OutputFile.empty()) return; - C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP, CTU, - /*supportsMultipleFiles=*/true)); + C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU, + /*supportsMultipleFiles=*/true)); createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, OutputFile, PP, CTU); } -void PlistPathDiagnosticConsumer::printBugPath(llvm::raw_ostream &o, - const FIDMap &FM, - const PathPieces &Path) { +void PlistDiagnostics::printBugPath(llvm::raw_ostream &o, const FIDMap &FM, + const PathPieces &Path) { PlistPrinter Printer(FM, PP, CTU); assert(std::is_partitioned(Path.begin(), Path.end(), [](const PathDiagnosticPieceRef &E) { @@ -603,8 +603,9 @@ void PlistPathDiagnosticConsumer::printBugPath(llvm::raw_ostream &o, o << " </array>\n"; } -void PlistPathDiagnosticConsumer::FlushDiagnosticsImpl( - std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) { +void PlistDiagnostics::FlushDiagnosticsImpl( + std::vector<const PathDiagnostic *> &Diags, + FilesMade *filesMade) { // Build up a set of FIDs that we use by scanning the locations and // ranges of the diagnostics. FIDMap FM; @@ -984,13 +985,12 @@ static const MacroInfo *getMacroInfoForLocation(const Preprocessor &PP, static ExpansionInfo getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { + const cross_tu::CrossTranslationUnitContext &CTU) { const Preprocessor *PPToUse = &PP; - if (auto LocAndUnit = - CTU.getImportedFromSourceLocationWithPreprocessor(MacroLoc)) { + if (auto LocAndUnit = CTU.getImportedFromSourceLocation(MacroLoc)) { MacroLoc = LocAndUnit->first; - PPToUse = LocAndUnit->second; + PPToUse = &LocAndUnit->second->getPreprocessor(); } llvm::SmallString<200> ExpansionBuf; diff --git a/clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp b/clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp similarity index 93% rename from clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp rename to clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp index e2fcad5b8e15..f93d04ccd61a 100644 --- a/clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp +++ b/clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp @@ -1,4 +1,4 @@ -//===--- SarifPathDiagnosticConsumer.cpp - Sarif Diagnostics ---*- C++ -*-===// +//===--- SarifDiagnostics.cpp - Sarif Diagnostics for Paths -----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,15 +6,15 @@ // //===----------------------------------------------------------------------===// // -// This file defines the SarifPathDiagnosticConsumer object. +// This file defines the SarifDiagnostics object. // //===----------------------------------------------------------------------===// #include "clang/Analysis/PathDiagnostic.h" -#include "clang/Analysis/PathDiagnosticConsumers.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/Version.h" #include "clang/Lex/Preprocessor.h" +#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/Support/ConvertUTF.h" @@ -25,24 +25,20 @@ using namespace llvm; using namespace clang; using namespace ento; -namespace clang { -class CrossTUAnalysisHelper; -} - namespace { -class SarifPathDiagnosticConsumer : public PathDiagnosticConsumer { +class SarifDiagnostics : public PathDiagnosticConsumer { std::string OutputFile; const LangOptions &LO; public: - SarifPathDiagnosticConsumer(const std::string &Output, const LangOptions &LO) + SarifDiagnostics(const std::string &Output, const LangOptions &LO) : OutputFile(Output), LO(LO) {} - ~SarifPathDiagnosticConsumer() override = default; + ~SarifDiagnostics() override = default; void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags, FilesMade *FM) override; - StringRef getName() const override { return "SarifPathDiagnosticConsumer"; } + StringRef getName() const override { return "SarifDiagnostics"; } PathGenerationScheme getGenerationScheme() const override { return Minimal; } bool supportsLogicalOpControlFlow() const override { return true; } bool supportsCrossFileDiagnostics() const override { return true; } @@ -52,13 +48,13 @@ class SarifPathDiagnosticConsumer : public PathDiagnosticConsumer { void ento::createSarifDiagnosticConsumer( PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, const std::string &Output, const Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { + const cross_tu::CrossTranslationUnitContext &CTU) { // TODO: Emit an error here. if (Output.empty()) return; - C.push_back(new SarifPathDiagnosticConsumer(Output, PP.getLangOpts())); + C.push_back(new SarifDiagnostics(Output, PP.getLangOpts())); createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, Output, PP, CTU); } @@ -303,9 +299,6 @@ static json::Object createResult(const LangOptions &LO, } static StringRef getRuleDescription(StringRef CheckName) { - // FIXME: This is a layering violation; it only works for the particular - // use-case of clang static analyzer. This info should be provided - // as part of PathDiagnostic itself. return llvm::StringSwitch<StringRef>(CheckName) #define GET_CHECKERS #define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN) \ @@ -317,9 +310,6 @@ static StringRef getRuleDescription(StringRef CheckName) { } static StringRef getRuleHelpURIStr(StringRef CheckName) { - // FIXME: This is a layering violation; it only works for the particular - // use-case of clang static analyzer. This info should be provided - // as part of PathDiagnostic itself. return llvm::StringSwitch<StringRef>(CheckName) #define GET_CHECKERS #define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN) \ @@ -387,7 +377,7 @@ static json::Object createRun(const LangOptions &LO, {"columnKind", "unicodeCodePoints"}}; } -void SarifPathDiagnosticConsumer::FlushDiagnosticsImpl( +void SarifDiagnostics::FlushDiagnosticsImpl( std::vector<const PathDiagnostic *> &Diags, FilesMade *) { // We currently overwrite the file if it already exists. However, it may be // useful to add a feature someday that allows the user to append a run to an diff --git a/clang/lib/Analysis/TextPathDiagnosticConsumer.cpp b/clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp similarity index 79% rename from clang/lib/Analysis/TextPathDiagnosticConsumer.cpp rename to clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp index e9010d5c08aa..ae2bad7ee77c 100644 --- a/clang/lib/Analysis/TextPathDiagnosticConsumer.cpp +++ b/clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp @@ -1,4 +1,4 @@ -//===--- TextPathDiagnosticConsumer.cpp - Text Diagnostics ------*- C++ -*-===// +//===--- TextDiagnostics.cpp - Text Diagnostics for Paths -------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,17 +6,19 @@ // //===----------------------------------------------------------------------===// // -// This file defines the TextPathDiagnosticConsumer object. +// This file defines the TextDiagnostics object. // //===----------------------------------------------------------------------===// #include "clang/Analysis/PathDiagnostic.h" -#include "clang/Analysis/PathDiagnosticConsumers.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/Version.h" +#include "clang/CrossTU/CrossTranslationUnit.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Lex/Preprocessor.h" #include "clang/Rewrite/Core/Rewriter.h" +#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" +#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" #include "clang/Tooling/Core/Replacement.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/SmallPtrSet.h" @@ -27,29 +29,25 @@ using namespace clang; using namespace ento; using namespace tooling; -namespace clang { -class CrossTUAnalysisHelper; -} - namespace { -/// Emits minimal diagnostics (report message + notes) for the 'none' output +/// Emitsd minimal diagnostics (report message + notes) for the 'none' output /// type to the standard error, or to to compliment many others. Emits detailed /// diagnostics in textual format for the 'text' output type. -class TextPathDiagnosticConsumer : public PathDiagnosticConsumer { +class TextDiagnostics : public PathDiagnosticConsumer { PathDiagnosticConsumerOptions DiagOpts; DiagnosticsEngine &DiagEng; const LangOptions &LO; bool ShouldDisplayPathNotes; public: - TextPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts, - DiagnosticsEngine &DiagEng, const LangOptions &LO, - bool ShouldDisplayPathNotes) + TextDiagnostics(PathDiagnosticConsumerOptions DiagOpts, + DiagnosticsEngine &DiagEng, const LangOptions &LO, + bool ShouldDisplayPathNotes) : DiagOpts(std::move(DiagOpts)), DiagEng(DiagEng), LO(LO), ShouldDisplayPathNotes(ShouldDisplayPathNotes) {} - ~TextPathDiagnosticConsumer() override {} + ~TextDiagnostics() override {} - StringRef getName() const override { return "TextPathDiagnosticConsumer"; } + StringRef getName() const override { return "TextDiagnostics"; } bool supportsLogicalOpControlFlow() const override { return true; } bool supportsCrossFileDiagnostics() const override { return true; } @@ -141,17 +139,17 @@ class TextPathDiagnosticConsumer : public PathDiagnosticConsumer { void ento::createTextPathDiagnosticConsumer( PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, const std::string &Prefix, const clang::Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { - C.emplace_back(new TextPathDiagnosticConsumer( - std::move(DiagOpts), PP.getDiagnostics(), PP.getLangOpts(), - /*ShouldDisplayPathNotes=*/true)); + const cross_tu::CrossTranslationUnitContext &CTU) { + C.emplace_back(new TextDiagnostics(std::move(DiagOpts), PP.getDiagnostics(), + PP.getLangOpts(), + /*ShouldDisplayPathNotes=*/true)); } void ento::createTextMinimalPathDiagnosticConsumer( PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C, const std::string &Prefix, const clang::Preprocessor &PP, - const CrossTUAnalysisHelper &CTU) { - C.emplace_back(new TextPathDiagnosticConsumer( - std::move(DiagOpts), PP.getDiagnostics(), PP.getLangOpts(), - /*ShouldDisplayPathNotes=*/false)); + const cross_tu::CrossTranslationUnitContext &CTU) { + C.emplace_back(new TextDiagnostics(std::move(DiagOpts), PP.getDiagnostics(), + PP.getLangOpts(), + /*ShouldDisplayPathNotes=*/false)); } diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp index 1e94950ca097..f2a19b2ccc90 100644 --- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -21,7 +21,6 @@ #include "clang/Analysis/CallGraph.h" #include "clang/Analysis/CodeInjector.h" #include "clang/Analysis/PathDiagnostic.h" -#include "clang/Analysis/PathDiagnosticConsumers.h" #include "clang/Basic/SourceManager.h" #include "clang/CrossTU/CrossTranslationUnit.h" #include "clang/Frontend/CompilerInstance.h" @@ -31,6 +30,7 @@ #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" #include "clang/StaticAnalyzer/Core/CheckerManager.h" +#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h" #include "llvm/ADT/PostOrderIterator.h" @@ -152,7 +152,7 @@ class AnalysisConsumer : public AnalysisASTConsumer, case PD_##NAME: \ CREATEFN(Opts->getDiagOpts(), PathConsumers, OutDir, PP, CTU); \ break; -#include "clang/Analysis/PathDiagnosticConsumers.def" +#include "clang/StaticAnalyzer/Core/Analyses.def" default: llvm_unreachable("Unknown analyzer output type!"); } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits