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

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 7 15:04:36 PST 2021


On Thu, Jan 7, 2021 at 12:29 AM Artem Dergachev via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

>
> Author: Artem Dergachev
> Date: 2021-01-07T00:28:22-08:00
> New Revision: d2ddc694ff94743d9735aaf07edcaf6db8aaca04
>
> URL:
> https://github.com/llvm/llvm-project/commit/d2ddc694ff94743d9735aaf07edcaf6db8aaca04
> DIFF:
> https://github.com/llvm/llvm-project/commit/d2ddc694ff94743d9735aaf07edcaf6db8aaca04.diff
>
> LOG: Revert "Revert "[analyzer] NFC: Move path diagnostic consumer
> implementations to libAnalysis.""
>
> This reverts commit 5663bf201f5c444d6fb56fb1bd471bc53c17d837.
>
> The cyclic dependency problem is addressed now.
>

Looks like this still has a circular dependency, unfortunately:

$ grep -r include.*Analysis clang/include/clang/CrossTU

clang/include/clang/CrossTU/CrossTranslationUnit.h:#*include
"clang/Analysis/CrossTUAnalysis*Helper.h"

$ grep -r include.*CrossTU clang/lib/Analysis

clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp:#*include
"clang/CrossTU*/CrossTranslationUnit.h"

clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp:#*include
"clang/Analysis/CrossTU*AnalysisHelper.h"

Could you revert this if it's not fairly simple to fix forward?

This is the ~fifth attempt to land this change.
>
> Added:
>     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
>
> 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/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
>
>
>
> ################################################################################
> diff  --git a/clang/include/clang/Analysis/CrossTUAnalysisHelper.h
> b/clang/include/clang/Analysis/CrossTUAnalysisHelper.h
> new file mode 100644
> index 000000000000..500e78ddedcf
> --- /dev/null
> +++ b/clang/include/clang/Analysis/CrossTUAnalysisHelper.h
> @@ -0,0 +1,41 @@
> +//===- 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
> new file mode 100644
> index 000000000000..33d2072fcf31
> --- /dev/null
> +++ b/clang/include/clang/Analysis/PathDiagnosticConsumers.def
> @@ -0,0 +1,50 @@
> +//===-- 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/StaticAnalyzer/Core/PathDiagnosticConsumers.h
> b/clang/include/clang/Analysis/PathDiagnosticConsumers.h
> similarity index 78%
> rename from
> clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h
> rename to clang/include/clang/Analysis/PathDiagnosticConsumers.h
> index f40f88eb32ff..fde2e3498216 100644
> --- a/clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h
> +++ b/clang/include/clang/Analysis/PathDiagnosticConsumers.h
> @@ -18,25 +18,24 @@
>  #include <string>
>  #include <vector>
>
> +#include "clang/Analysis/PathDiagnostic.h"
> +
>  namespace clang {
>
>  class AnalyzerOptions;
>  class Preprocessor;
> -namespace cross_tu {
> -class CrossTranslationUnitContext;
> -}
> +class CrossTUAnalysisHelper;
>
>  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 cross_tu::CrossTranslationUnitContext &CTU);
> -#include "clang/StaticAnalyzer/Core/Analyses.def"
> +                const Preprocessor &PP, const CrossTUAnalysisHelper &CTU);
> +#include "clang/Analysis/PathDiagnosticConsumers.def"
>
>  } // end 'ento' namespace
>  } // end 'clang' namespace
>
> diff  --git a/clang/include/clang/CrossTU/CrossTranslationUnit.h
> b/clang/include/clang/CrossTU/CrossTranslationUnit.h
> index 027c6f16430b..21201f637833 100644
> --- a/clang/include/clang/CrossTU/CrossTranslationUnit.h
> +++ b/clang/include/clang/CrossTU/CrossTranslationUnit.h
> @@ -14,6 +14,7 @@
>  #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"
> @@ -120,10 +121,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 {
> +class CrossTranslationUnitContext : public CrossTUAnalysisHelper {
>  public:
>    CrossTranslationUnitContext(CompilerInstance &CI);
> -  ~CrossTranslationUnitContext();
> +  ~CrossTranslationUnitContext() override;
>
>    /// This function loads a function or variable definition from an
>    ///        external AST file and merges it into the original AST.
> @@ -186,12 +187,24 @@ class CrossTranslationUnitContext {
>    /// 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
> +  /// ASTUnit object (the AST was loaded from a file using an internal
> ASTUni
>    /// 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(const clang::SourceLocation &ToLoc) const;
> +  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;
>
>  private:
>    using ImportedFileIDMap =
>
> diff  --git a/clang/include/clang/StaticAnalyzer/Core/Analyses.def
> b/clang/include/clang/StaticAnalyzer/Core/Analyses.def
> index c4e5f5be6fd7..2e98cbba4c9e 100644
> --- a/clang/include/clang/StaticAnalyzer/Core/Analyses.def
> +++ b/clang/include/clang/StaticAnalyzer/Core/Analyses.def
> @@ -28,42 +28,6 @@ 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
> @@ -91,7 +55,6 @@ 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 ccf35e0a81ec..0dd2c86c5ca9 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/StaticAnalyzer/Core/Analyses.def"
> +#include "clang/Analysis/PathDiagnosticConsumers.def"
>  PD_NONE,
>  NUM_ANALYSIS_DIAG_CLIENTS
>  };
>
> diff  --git
> a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
> b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
> index c76e9c0326af..7e8b9de3a942 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 332e533f0347..ec396e1532e0 100644
> --- a/clang/include/clang/module.modulemap
> +++ b/clang/include/clang/module.modulemap
> @@ -3,6 +3,7 @@ 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 ed626a6e130c..94c6e322e02b 100644
> --- a/clang/lib/Analysis/CMakeLists.txt
> +++ b/clang/lib/Analysis/CMakeLists.txt
> @@ -18,14 +18,19 @@ 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
> @@ -37,6 +42,8 @@ add_clang_library(clangAnalysis
>    clangASTMatchers
>    clangBasic
>    clangLex
> +  clangRewrite
> +  clangToolingCore
>
>    DEPENDS
>    omp_gen
>
> diff  --git a/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
> b/clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp
> similarity index 91%
> rename from clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
> rename to clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp
> index 149459cf986a..fb60819b1c15 100644
> --- a/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
> +++ b/clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp
> @@ -1,4 +1,4 @@
> -//===- HTMLDiagnostics.cpp - HTML Diagnostics for Paths
> -------------------===//
> +//===- HTMLPathDiagnosticConsumer.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,12 +6,13 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>  //
> -//  This file defines the HTMLDiagnostics object.
> +//  This file defines the HTMLPathDiagnosticConsumer 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"
> @@ -24,7 +25,6 @@
>  #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,13 +50,17 @@
>  using namespace clang;
>  using namespace ento;
>
> +namespace clang {
> +class CrossTUAnalysisHelper;
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // Boilerplate.
>
>  //===----------------------------------------------------------------------===//
>
>  namespace {
>
> -class HTMLDiagnostics : public PathDiagnosticConsumer {
> +class HTMLPathDiagnosticConsumer : public PathDiagnosticConsumer {
>    PathDiagnosticConsumerOptions DiagOpts;
>    std::string Directory;
>    bool createdDir = false;
> @@ -65,20 +69,18 @@ class HTMLDiagnostics : public PathDiagnosticConsumer {
>    const bool SupportsCrossFileDiagnostics;
>
>  public:
> -  HTMLDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
> -                  const std::string &OutputDir, const Preprocessor &pp,
> -                  bool supportsMultipleFiles)
> -      : DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(pp),
> -        SupportsCrossFileDiagnostics(supportsMultipleFiles) {}
> +  HTMLPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
> +                             const std::string &OutputDir,
> +                             const Preprocessor &PP, bool
> SupportsMultipleFiles)
> +      : DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(PP),
> +        SupportsCrossFileDiagnostics(SupportsMultipleFiles) {}
>
> -  ~HTMLDiagnostics() override { FlushDiagnostics(nullptr); }
> +  ~HTMLPathDiagnosticConsumer() override { FlushDiagnostics(nullptr); }
>
>    void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
>                              FilesMade *filesMade) override;
>
> -  StringRef getName() const override {
> -    return "HTMLDiagnostics";
> -  }
> +  StringRef getName() const override { return
> "HTMLPathDiagnosticConsumer"; }
>
>    bool supportsCrossFileDiagnostics() const override {
>      return SupportsCrossFileDiagnostics;
> @@ -135,7 +137,7 @@ class HTMLDiagnostics : public PathDiagnosticConsumer {
>  void ento::createHTMLDiagnosticConsumer(
>      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
>      const std::string &OutputDir, const Preprocessor &PP,
> -    const cross_tu::CrossTranslationUnitContext &CTU) {
> +    const CrossTUAnalysisHelper &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
> @@ -148,47 +150,36 @@ void ento::createHTMLDiagnosticConsumer(
>    if (OutputDir.empty())
>      return;
>
> -  C.push_back(new HTMLDiagnostics(std::move(DiagOpts), OutputDir, PP,
> true));
> +  C.push_back(
> +      new HTMLPathDiagnosticConsumer(std::move(DiagOpts), OutputDir, PP,
> true));
>  }
>
>  void ento::createHTMLSingleFileDiagnosticConsumer(
>      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
>      const std::string &OutputDir, const Preprocessor &PP,
> -    const cross_tu::CrossTranslationUnitContext &CTU) {
> +    const CrossTUAnalysisHelper &CTU) {
>    createTextMinimalPathDiagnosticConsumer(DiagOpts, C, OutputDir, PP,
> CTU);
>
>    // TODO: Emit an error here.
>    if (OutputDir.empty())
>      return;
>
> -  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);
> +  C.push_back(new HTMLPathDiagnosticConsumer(std::move(DiagOpts),
> OutputDir, PP,
> +                                             false));
>  }
>
>
>  //===----------------------------------------------------------------------===//
>  // Report processing.
>
>  //===----------------------------------------------------------------------===//
>
> -void HTMLDiagnostics::FlushDiagnosticsImpl(
> -  std::vector<const PathDiagnostic *> &Diags,
> -  FilesMade *filesMade) {
> +void HTMLPathDiagnosticConsumer::FlushDiagnosticsImpl(
> +    std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) {
>    for (const auto Diag : Diags)
>      ReportDiag(*Diag, filesMade);
>  }
>
> -void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D,
> -                                 FilesMade *filesMade) {
> +void HTMLPathDiagnosticConsumer::ReportDiag(const PathDiagnostic &D,
> +                                            FilesMade *filesMade) {
>    // Create the HTML directory if it is missing.
>    if (!createdDir) {
>      createdDir = true;
> @@ -296,8 +287,11 @@ void HTMLDiagnostics::ReportDiag(const
> PathDiagnostic& D,
>    os << report;
>  }
>
> -std::string HTMLDiagnostics::GenerateHTML(const PathDiagnostic& D,
> Rewriter &R,
> -    const SourceManager& SMgr, const PathPieces& path, const char
> *declName) {
> +std::string HTMLPathDiagnosticConsumer::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) {
> @@ -369,9 +363,8 @@ std::string HTMLDiagnostics::GenerateHTML(const
> PathDiagnostic& D, Rewriter &R,
>    return os.str();
>  }
>
> -void HTMLDiagnostics::dumpCoverageData(
> -    const PathDiagnostic &D,
> -    const PathPieces &path,
> +void HTMLPathDiagnosticConsumer::dumpCoverageData(
> +    const PathDiagnostic &D, const PathPieces &path,
>      llvm::raw_string_ostream &os) {
>
>    const FilesToLineNumsMap &ExecutedLines = D.getExecutedLines();
> @@ -395,8 +388,8 @@ void HTMLDiagnostics::dumpCoverageData(
>    os << "};";
>  }
>
> -std::string HTMLDiagnostics::showRelevantLinesJavascript(
> -      const PathDiagnostic &D, const PathPieces &path) {
> +std::string HTMLPathDiagnosticConsumer::showRelevantLinesJavascript(
> +    const PathDiagnostic &D, const PathPieces &path) {
>    std::string s;
>    llvm::raw_string_ostream os(s);
>    os << "<script type='text/javascript'>\n";
> @@ -460,9 +453,10 @@ document.addEventListener("DOMContentLoaded",
> function() {
>    return os.str();
>  }
>
> -void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic& D, Rewriter &R,
> -    const SourceManager& SMgr, const PathPieces& path, FileID FID,
> -    const FileEntry *Entry, const char *declName) {
> +void HTMLPathDiagnosticConsumer::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.
> @@ -607,7 +601,7 @@ void HTMLDiagnostics::FinalizeHTML(const
> PathDiagnostic& D, Rewriter &R,
>    html::AddHeaderFooterInternalBuiltinCSS(R, FID, Entry->getName());
>  }
>
> -StringRef HTMLDiagnostics::showHelpJavascript() {
> +StringRef HTMLPathDiagnosticConsumer::showHelpJavascript() {
>    return R"<<<(
>  <script type='text/javascript'>
>
> @@ -690,8 +684,9 @@ static void HandlePopUpPieceEndTag(Rewriter &R,
>    }
>  }
>
> -void HTMLDiagnostics::RewriteFile(Rewriter &R,
> -                                  const PathPieces& path, FileID FID) {
> +void HTMLPathDiagnosticConsumer::RewriteFile(Rewriter &R,
> +                                             const PathPieces &path,
> +                                             FileID FID) {
>    // Process the path.
>    // Maintain the counts of extra note pieces separately.
>    unsigned TotalPieces = path.size();
> @@ -769,10 +764,9 @@ void HTMLDiagnostics::RewriteFile(Rewriter &R,
>    html::HighlightMacros(R, FID, PP);
>  }
>
> -void HTMLDiagnostics::HandlePiece(Rewriter &R, FileID BugFileID,
> -                                  const PathDiagnosticPiece &P,
> -                                  const std::vector<SourceRange>
> &PopUpRanges,
> -                                  unsigned num, unsigned max) {
> +void HTMLPathDiagnosticConsumer::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();
> @@ -1004,9 +998,8 @@ static void EmitAlphaCounter(raw_ostream &os,
> unsigned n) {
>    os << char('a' + x);
>  }
>
> -unsigned HTMLDiagnostics::ProcessMacroPiece(raw_ostream &os,
> -                                            const
> PathDiagnosticMacroPiece& P,
> -                                            unsigned num) {
> +unsigned HTMLPathDiagnosticConsumer::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);
> @@ -1028,10 +1021,10 @@ unsigned
> HTMLDiagnostics::ProcessMacroPiece(raw_ostream &os,
>    return num;
>  }
>
> -void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID,
> -                                     SourceRange Range,
> -                                     const char *HighlightStart,
> -                                     const char *HighlightEnd) {
> +void HTMLPathDiagnosticConsumer::HighlightRange(Rewriter &R, FileID
> BugFileID,
> +                                                SourceRange Range,
> +                                                const char
> *HighlightStart,
> +                                                const char *HighlightEnd)
> {
>    SourceManager &SM = R.getSourceMgr();
>    const LangOptions &LangOpts = R.getLangOpts();
>
> @@ -1066,7 +1059,7 @@ void HTMLDiagnostics::HighlightRange(Rewriter& R,
> FileID BugFileID,
>    html::HighlightRange(R, InstantiationStart, E, HighlightStart,
> HighlightEnd);
>  }
>
> -StringRef HTMLDiagnostics::generateKeyboardNavigationJavascript() {
> +StringRef
> HTMLPathDiagnosticConsumer::generateKeyboardNavigationJavascript() {
>    return R"<<<(
>  <script type='text/javascript'>
>  var digitMatcher = new RegExp("[0-9]+");
>
> diff  --git a/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp
> b/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp
> new file mode 100644
> index 000000000000..4a9d2fe84e38
> --- /dev/null
> +++ b/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp
> @@ -0,0 +1,35 @@
> +//===--- 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/CrossTU/CrossTranslationUnit.h"
> +#include "clang/Lex/Preprocessor.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/StaticAnalyzer/Core/PlistDiagnostics.cpp
> b/clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp
> similarity index 96%
> rename from clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
> rename to clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp
> index 35e320c7755f..52a488162dba 100644
> --- a/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
> +++ b/clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp
> @@ -1,4 +1,4 @@
> -//===--- PlistDiagnostics.cpp - Plist Diagnostics for Paths -----*- C++
> -*-===//
> +//===--- PlistPathDiagnosticConsumer.cpp - Plist Diagnostics ----*- 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,22 +6,21 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>  //
> -//  This file defines the PlistDiagnostics object.
> +//  This file defines the PlistPathDiagnosticConsumer 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"
> @@ -38,29 +37,29 @@ using namespace markup;
>
>  //===----------------------------------------------------------------------===//
>
>  namespace {
> -  class PlistDiagnostics : public PathDiagnosticConsumer {
> +  class PlistPathDiagnosticConsumer : public PathDiagnosticConsumer {
>      PathDiagnosticConsumerOptions DiagOpts;
>      const std::string OutputFile;
>      const Preprocessor &PP;
> -    const cross_tu::CrossTranslationUnitContext &CTU;
> +    const CrossTUAnalysisHelper &CTU;
>      const bool SupportsCrossFileDiagnostics;
>
>      void printBugPath(llvm::raw_ostream &o, const FIDMap &FM,
>                        const PathPieces &Path);
>
>    public:
> -    PlistDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
> +    PlistPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
>                       const std::string &OutputFile, const Preprocessor
> &PP,
> -                     const cross_tu::CrossTranslationUnitContext &CTU,
> +                     const CrossTUAnalysisHelper &CTU,
>                       bool supportsMultipleFiles);
>
> -    ~PlistDiagnostics() override {}
> +    ~PlistPathDiagnosticConsumer() override {}
>
>      void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
>                                FilesMade *filesMade) override;
>
>      StringRef getName() const override {
> -      return "PlistDiagnostics";
> +      return "PlistPathDiagnosticConsumer";
>      }
>
>      PathGenerationScheme getGenerationScheme() const override {
> @@ -79,13 +78,13 @@ namespace {
>  class PlistPrinter {
>    const FIDMap& FM;
>    const Preprocessor &PP;
> -  const cross_tu::CrossTranslationUnitContext &CTU;
> +  const CrossTUAnalysisHelper &CTU;
>    llvm::SmallVector<const PathDiagnosticMacroPiece *, 0> MacroPieces;
>
>  public:
>    PlistPrinter(const FIDMap& FM,
>                 const Preprocessor &PP,
> -               const cross_tu::CrossTranslationUnitContext &CTU)
> +               const CrossTUAnalysisHelper &CTU)
>      : FM(FM), PP(PP), CTU(CTU) {
>    }
>
> @@ -175,7 +174,7 @@ static void printCoverage(const PathDiagnostic *D,
>
>  static ExpansionInfo
>  getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP,
> -                 const cross_tu::CrossTranslationUnitContext &CTU);
> +                 const CrossTUAnalysisHelper &CTU);
>
>
>  //===----------------------------------------------------------------------===//
>  // Methods of PlistPrinter.
> @@ -516,12 +515,12 @@ static void printCoverage(const PathDiagnostic *D,
>  }
>
>
>  //===----------------------------------------------------------------------===//
> -// Methods of PlistDiagnostics.
> +// Methods of PlistPathDiagnosticConsumer.
>
>  //===----------------------------------------------------------------------===//
>
> -PlistDiagnostics::PlistDiagnostics(
> +PlistPathDiagnosticConsumer::PlistPathDiagnosticConsumer(
>      PathDiagnosticConsumerOptions DiagOpts, const std::string &output,
> -    const Preprocessor &PP, const cross_tu::CrossTranslationUnitContext
> &CTU,
> +    const Preprocessor &PP, const CrossTUAnalysisHelper &CTU,
>      bool supportsMultipleFiles)
>      : DiagOpts(std::move(DiagOpts)), OutputFile(output), PP(PP), CTU(CTU),
>        SupportsCrossFileDiagnostics(supportsMultipleFiles) {
> @@ -532,14 +531,14 @@ PlistDiagnostics::PlistDiagnostics(
>  void ento::createPlistDiagnosticConsumer(
>      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
>      const std::string &OutputFile, const Preprocessor &PP,
> -    const cross_tu::CrossTranslationUnitContext &CTU) {
> +    const CrossTUAnalysisHelper &CTU) {
>
>    // TODO: Emit an error here.
>    if (OutputFile.empty())
>      return;
>
> -  C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU,
> -                                   /*supportsMultipleFiles=*/false));
> +  C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP,
> CTU,
> +
> /*supportsMultipleFiles=*/false));
>    createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C,
> OutputFile,
>                                            PP, CTU);
>  }
> @@ -547,20 +546,21 @@ void ento::createPlistDiagnosticConsumer(
>  void ento::createPlistMultiFileDiagnosticConsumer(
>      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
>      const std::string &OutputFile, const Preprocessor &PP,
> -    const cross_tu::CrossTranslationUnitContext &CTU) {
> +    const CrossTUAnalysisHelper &CTU) {
>
>    // TODO: Emit an error here.
>    if (OutputFile.empty())
>      return;
>
> -  C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU,
> -                                   /*supportsMultipleFiles=*/true));
> +  C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP,
> CTU,
> +
> /*supportsMultipleFiles=*/true));
>    createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C,
> OutputFile,
>                                            PP, CTU);
>  }
>
> -void PlistDiagnostics::printBugPath(llvm::raw_ostream &o, const FIDMap
> &FM,
> -                                    const PathPieces &Path) {
> +void PlistPathDiagnosticConsumer::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,9 +603,8 @@ void PlistDiagnostics::printBugPath(llvm::raw_ostream
> &o, const FIDMap &FM,
>    o << "   </array>\n";
>  }
>
> -void PlistDiagnostics::FlushDiagnosticsImpl(
> -                                    std::vector<const PathDiagnostic *>
> &Diags,
> -                                    FilesMade *filesMade) {
> +void PlistPathDiagnosticConsumer::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;
> @@ -985,12 +984,13 @@ static const MacroInfo
> *getMacroInfoForLocation(const Preprocessor &PP,
>
>  static ExpansionInfo
>  getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP,
> -                 const cross_tu::CrossTranslationUnitContext &CTU) {
> +                 const CrossTUAnalysisHelper &CTU) {
>
>    const Preprocessor *PPToUse = &PP;
> -  if (auto LocAndUnit = CTU.getImportedFromSourceLocation(MacroLoc)) {
> +  if (auto LocAndUnit =
> +      CTU.getImportedFromSourceLocationWithPreprocessor(MacroLoc)) {
>      MacroLoc = LocAndUnit->first;
> -    PPToUse = &LocAndUnit->second->getPreprocessor();
> +    PPToUse = LocAndUnit->second;
>    }
>
>    llvm::SmallString<200> ExpansionBuf;
>
> diff  --git a/clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp
> b/clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp
> similarity index 93%
> rename from clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp
> rename to clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp
> index f93d04ccd61a..e2fcad5b8e15 100644
> --- a/clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp
> +++ b/clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp
> @@ -1,4 +1,4 @@
> -//===--- SarifDiagnostics.cpp - Sarif Diagnostics for Paths -----*- C++
> -*-===//
> +//===--- SarifPathDiagnosticConsumer.cpp - Sarif Diagnostics  ---*- 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 SarifDiagnostics object.
> +//  This file defines the SarifPathDiagnosticConsumer 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,20 +25,24 @@ using namespace llvm;
>  using namespace clang;
>  using namespace ento;
>
> +namespace clang {
> +class CrossTUAnalysisHelper;
> +}
> +
>  namespace {
> -class SarifDiagnostics : public PathDiagnosticConsumer {
> +class SarifPathDiagnosticConsumer : public PathDiagnosticConsumer {
>    std::string OutputFile;
>    const LangOptions &LO;
>
>  public:
> -  SarifDiagnostics(const std::string &Output, const LangOptions &LO)
> +  SarifPathDiagnosticConsumer(const std::string &Output, const
> LangOptions &LO)
>        : OutputFile(Output), LO(LO) {}
> -  ~SarifDiagnostics() override = default;
> +  ~SarifPathDiagnosticConsumer() override = default;
>
>    void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
>                              FilesMade *FM) override;
>
> -  StringRef getName() const override { return "SarifDiagnostics"; }
> +  StringRef getName() const override { return
> "SarifPathDiagnosticConsumer"; }
>    PathGenerationScheme getGenerationScheme() const override { return
> Minimal; }
>    bool supportsLogicalOpControlFlow() const override { return true; }
>    bool supportsCrossFileDiagnostics() const override { return true; }
> @@ -48,13 +52,13 @@ class SarifDiagnostics : public PathDiagnosticConsumer
> {
>  void ento::createSarifDiagnosticConsumer(
>      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
>      const std::string &Output, const Preprocessor &PP,
> -    const cross_tu::CrossTranslationUnitContext &CTU) {
> +    const CrossTUAnalysisHelper &CTU) {
>
>    // TODO: Emit an error here.
>    if (Output.empty())
>      return;
>
> -  C.push_back(new SarifDiagnostics(Output, PP.getLangOpts()));
> +  C.push_back(new SarifPathDiagnosticConsumer(Output, PP.getLangOpts()));
>    createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, Output,
> PP,
>                                            CTU);
>  }
> @@ -299,6 +303,9 @@ 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)
>      \
> @@ -310,6 +317,9 @@ 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)
>      \
> @@ -377,7 +387,7 @@ static json::Object createRun(const LangOptions &LO,
>                        {"columnKind", "unicodeCodePoints"}};
>  }
>
> -void SarifDiagnostics::FlushDiagnosticsImpl(
> +void SarifPathDiagnosticConsumer::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/StaticAnalyzer/Core/TextDiagnostics.cpp
> b/clang/lib/Analysis/TextPathDiagnosticConsumer.cpp
> similarity index 79%
> rename from clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp
> rename to clang/lib/Analysis/TextPathDiagnosticConsumer.cpp
> index ae2bad7ee77c..e9010d5c08aa 100644
> --- a/clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp
> +++ b/clang/lib/Analysis/TextPathDiagnosticConsumer.cpp
> @@ -1,4 +1,4 @@
> -//===--- TextDiagnostics.cpp - Text Diagnostics for Paths -------*- C++
> -*-===//
> +//===--- TextPathDiagnosticConsumer.cpp - Text Diagnostics ------*- 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,19 +6,17 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>  //
> -//  This file defines the TextDiagnostics object.
> +//  This file defines the TextPathDiagnosticConsumer 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"
> @@ -29,25 +27,29 @@ using namespace clang;
>  using namespace ento;
>  using namespace tooling;
>
> +namespace clang {
> +class CrossTUAnalysisHelper;
> +}
> +
>  namespace {
> -/// Emitsd minimal diagnostics (report message + notes) for the 'none'
> output
> +/// Emits 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 TextDiagnostics : public PathDiagnosticConsumer {
> +class TextPathDiagnosticConsumer : public PathDiagnosticConsumer {
>    PathDiagnosticConsumerOptions DiagOpts;
>    DiagnosticsEngine &DiagEng;
>    const LangOptions &LO;
>    bool ShouldDisplayPathNotes;
>
>  public:
> -  TextDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
> -                  DiagnosticsEngine &DiagEng, const LangOptions &LO,
> -                  bool ShouldDisplayPathNotes)
> +  TextPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
> +                             DiagnosticsEngine &DiagEng, const
> LangOptions &LO,
> +                             bool ShouldDisplayPathNotes)
>        : DiagOpts(std::move(DiagOpts)), DiagEng(DiagEng), LO(LO),
>          ShouldDisplayPathNotes(ShouldDisplayPathNotes) {}
> -  ~TextDiagnostics() override {}
> +  ~TextPathDiagnosticConsumer() override {}
>
> -  StringRef getName() const override { return "TextDiagnostics"; }
> +  StringRef getName() const override { return
> "TextPathDiagnosticConsumer"; }
>
>    bool supportsLogicalOpControlFlow() const override { return true; }
>    bool supportsCrossFileDiagnostics() const override { return true; }
> @@ -139,17 +141,17 @@ class TextDiagnostics : public
> PathDiagnosticConsumer {
>  void ento::createTextPathDiagnosticConsumer(
>      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
>      const std::string &Prefix, const clang::Preprocessor &PP,
> -    const cross_tu::CrossTranslationUnitContext &CTU) {
> -  C.emplace_back(new TextDiagnostics(std::move(DiagOpts),
> PP.getDiagnostics(),
> -                                     PP.getLangOpts(),
> -                                     /*ShouldDisplayPathNotes=*/true));
> +    const CrossTUAnalysisHelper &CTU) {
> +  C.emplace_back(new TextPathDiagnosticConsumer(
> +      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 cross_tu::CrossTranslationUnitContext &CTU) {
> -  C.emplace_back(new TextDiagnostics(std::move(DiagOpts),
> PP.getDiagnostics(),
> -                                     PP.getLangOpts(),
> -                                     /*ShouldDisplayPathNotes=*/false));
> +    const CrossTUAnalysisHelper &CTU) {
> +  C.emplace_back(new TextPathDiagnosticConsumer(
> +      std::move(DiagOpts), PP.getDiagnostics(), PP.getLangOpts(),
> +      /*ShouldDisplayPathNotes=*/false));
>  }
>
> diff  --git a/clang/lib/CrossTU/CrossTranslationUnit.cpp
> b/clang/lib/CrossTU/CrossTranslationUnit.cpp
> index e27779f91abc..5ab5d6def2a2 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(
> -    const clang::SourceLocation &ToLoc) const {
> +    SourceLocation ToLoc) const {
>    const SourceManager &SM = Context.getSourceManager();
>    auto DecToLoc = SM.getDecomposedLoc(ToLoc);
>
> @@ -781,5 +781,16 @@
> 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 f9bce6a3f7a2..57027cea5659 100644
> --- a/clang/lib/Frontend/CompilerInvocation.cpp
> +++ b/clang/lib/Frontend/CompilerInvocation.cpp
> @@ -547,7 +547,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/StaticAnalyzer/Core/Analyses.def"
> +#include "clang/Analysis/PathDiagnosticConsumers.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 d947d415ad6e..b1f527ed75d5 100644
> --- a/clang/lib/StaticAnalyzer/Core/CMakeLists.txt
> +++ b/clang/lib/StaticAnalyzer/Core/CMakeLists.txt
> @@ -30,16 +30,13 @@ 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
> @@ -47,7 +44,6 @@ add_clang_library(clangStaticAnalyzerCore
>    SValBuilder.cpp
>    SVals.cpp
>    SymbolManager.cpp
> -  TextDiagnostics.cpp
>    WorkList.cpp
>
>    LINK_LIBS
>
> diff  --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> index f2a19b2ccc90..1e94950ca097 100644
> --- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> +++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> @@ -21,6 +21,7 @@
>  #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"
> @@ -30,7 +31,6 @@
>  #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/StaticAnalyzer/Core/Analyses.def"
> +#include "clang/Analysis/PathDiagnosticConsumers.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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210107/b34aa283/attachment-0001.html>


More information about the cfe-commits mailing list