[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 19:21:28 PST 2021


On Thu, Jan 7, 2021 at 7:19 PM Artem Dergachev <artem at dxdy.ru> wrote:

>
>
> On 1/7/21 3:04 PM, David Blaikie wrote:
>
>
>
> 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"
>
> Uh-oh, dead include. Thanks!
>

Ah :/ sorry I reverted if the fix is that easy. Hopefully the churn of
recommitting with that minor fix won't be too much hassle! Thanks for
getting to this!


> clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp:#*include
> "clang/Analysis/CrossTU*AnalysisHelper.h"
>
> This one doesn't count because it's libAnalysis including libAnalysis.
>

Oh, for sure.


>
> 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/91fd0000/attachment-0001.html>


More information about the cfe-commits mailing list