[clang] 9c4b222 - Revert "Revert "Revert "Revert "Revert "[analyzer] NFC: Move path diagnostic consumer implementations to libAnalysis."""""

Artem Dergachev via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 9 20:08:27 PST 2021


Hi,

Could you please point out the specific problem? I don't see any errors 
myself in a number of configurations that i tested locally (shared 
library builds and builds with modules) and all buildbots are silent. 
How do you even discover these issues? Is there a tool for that that i'm 
missing?

On 1/8/21 5:17 AM, Alexander Belyaev via cfe-commits wrote:
> 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!");
>       }
>
>
>          
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list