Hi,

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

On 1/8/21 5:17 AM, Alexander Belyaev via cfe-commits wrote:
Author: Alexander Belyaev
Date: 2021-01-08T14:17:18+01:00
New Revision: 9c4b2225b24de07a728715ce20238803370413ea

URL: 
https://github.com/llvm/llvm-project/commit/9c4b2225b24de07a728715ce20238803370413ea
DIFF: 
https://github.com/llvm/llvm-project/commit/9c4b2225b24de07a728715ce20238803370413ea.diff

LOG: Revert "Revert "Revert "Revert "Revert "[analyzer] NFC: Move path diagnostic consumer 
implementations to libAnalysis."""""

This reverts commit 6b0ee02747ed22d41e175d15f27025183341e6f8.

Circular dependency again.

Added:
     clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h
     clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
     clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
     clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp
     clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp

Modified:
     clang/include/clang/CrossTU/CrossTranslationUnit.h
     clang/include/clang/StaticAnalyzer/Core/Analyses.def
     clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
     clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
     clang/include/clang/module.modulemap
     clang/lib/Analysis/CMakeLists.txt
     clang/lib/CrossTU/CrossTranslationUnit.cpp
     clang/lib/Frontend/CompilerInvocation.cpp
     clang/lib/StaticAnalyzer/Core/CMakeLists.txt
     clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp

Removed:
     clang/include/clang/Analysis/CrossTUAnalysisHelper.h
     clang/include/clang/Analysis/PathDiagnosticConsumers.def
     clang/include/clang/Analysis/PathDiagnosticConsumers.h
     clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp
     clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp
     clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp
     clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp
     clang/lib/Analysis/TextPathDiagnosticConsumer.cpp


################################################################################
diff  --git a/clang/include/clang/Analysis/CrossTUAnalysisHelper.h 
b/clang/include/clang/Analysis/CrossTUAnalysisHelper.h
deleted file mode 100644
index 500e78ddedcf..000000000000
--- a/clang/include/clang/Analysis/CrossTUAnalysisHelper.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//===- CrossTUAnalysisHelper.h - Abstraction layer for CTU ------*- C++ 
-*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-#ifndef LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H
-#define LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H
-
-#include "llvm/ADT/Optional.h"
-#include "clang/Basic/SourceManager.h"
-
-namespace clang {
-
-class ASTUnit;
-
-/// This class is an abstract interface acting as a bridge between
-/// an analysis that requires lookups across translation units (a user
-/// of that interface) and the facility that implements such lookups
-/// (an implementation of that interface). This is useful to break direct
-/// link-time dependencies between the (possibly shared) libraries in which
-/// the user and the implementation live.
-class CrossTUAnalysisHelper {
-public:
-  /// Determine the original source location in the original TU for an
-  /// imported source location.
-  /// \p ToLoc Source location in the imported-to AST.
-  /// \return Source location in the imported-from AST and the corresponding
-  /// ASTUnit object (the AST was loaded from a file using an internal ASTUnit
-  /// object that is returned here).
-  /// If any error happens (ToLoc is a non-imported source location) empty is
-  /// returned.
-  virtual llvm::Optional<std::pair<SourceLocation /*FromLoc*/, Preprocessor *>>
-  getImportedFromSourceLocationWithPreprocessor(SourceLocation ToLoc) const = 
0;
-
-  virtual ~CrossTUAnalysisHelper() {}
-};
-} // namespace clang
-
-#endif // LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H

diff  --git a/clang/include/clang/Analysis/PathDiagnosticConsumers.def 
b/clang/include/clang/Analysis/PathDiagnosticConsumers.def
deleted file mode 100644
index 33d2072fcf31..000000000000
--- a/clang/include/clang/Analysis/PathDiagnosticConsumers.def
+++ /dev/null
@@ -1,50 +0,0 @@
-//===-- PathDiagnosticConsumers.def - Visualizing warnings ------*- C++ 
-*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the set of path diagnostic consumers - objects that
-// implement
diff erent representations of static analysis results.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef ANALYSIS_DIAGNOSTICS
-#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN)
-#endif
-
-ANALYSIS_DIAGNOSTICS(HTML, "html", "Output analysis results using HTML",
-                     createHTMLDiagnosticConsumer)
-
-ANALYSIS_DIAGNOSTICS(
-    HTML_SINGLE_FILE, "html-single-file",
-    "Output analysis results using HTML (not allowing for multi-file bugs)",
-    createHTMLSingleFileDiagnosticConsumer)
-
-ANALYSIS_DIAGNOSTICS(PLIST, "plist", "Output analysis results using Plists",
-                     createPlistDiagnosticConsumer)
-
-ANALYSIS_DIAGNOSTICS(
-    PLIST_MULTI_FILE, "plist-multi-file",
-    "Output analysis results using Plists (allowing for multi-file bugs)",
-    createPlistMultiFileDiagnosticConsumer)
-
-ANALYSIS_DIAGNOSTICS(PLIST_HTML, "plist-html",
-                     "Output analysis results using HTML wrapped with Plists",
-                     createPlistHTMLDiagnosticConsumer)
-
-ANALYSIS_DIAGNOSTICS(SARIF, "sarif", "Output analysis results in a SARIF file",
-                     createSarifDiagnosticConsumer)
-
-ANALYSIS_DIAGNOSTICS(TEXT, "text", "Text output of analysis results to stderr",
-                     createTextPathDiagnosticConsumer)
-
-ANALYSIS_DIAGNOSTICS(TEXT_MINIMAL, "text-minimal",
-                     "Emits minimal diagnostics to stderr, stating only the "
-                     "warning message and the associated notes. Usually "
-                     "used in addition to other analysis types",
-                     createTextMinimalPathDiagnosticConsumer)
-
-#undef ANALYSIS_DIAGNOSTICS

diff  --git a/clang/include/clang/CrossTU/CrossTranslationUnit.h 
b/clang/include/clang/CrossTU/CrossTranslationUnit.h
index 21201f637833..027c6f16430b 100644
--- a/clang/include/clang/CrossTU/CrossTranslationUnit.h
+++ b/clang/include/clang/CrossTU/CrossTranslationUnit.h
@@ -14,7 +14,6 @@
  #ifndef LLVM_CLANG_CROSSTU_CROSSTRANSLATIONUNIT_H
  #define LLVM_CLANG_CROSSTU_CROSSTRANSLATIONUNIT_H
-#include "clang/Analysis/CrossTUAnalysisHelper.h"
  #include "clang/AST/ASTImporterSharedState.h"
  #include "clang/Basic/LLVM.h"
  #include "llvm/ADT/DenseMap.h"
@@ -121,10 +120,10 @@ bool containsConst(const VarDecl *VD, const ASTContext 
&ACtx);
  /// the locations of the AST files for each definition.
  ///
  /// Note that this class also implements caching.
-class CrossTranslationUnitContext : public CrossTUAnalysisHelper {
+class CrossTranslationUnitContext {
  public:
    CrossTranslationUnitContext(CompilerInstance &CI);
-  ~CrossTranslationUnitContext() override;
+  ~CrossTranslationUnitContext();
/// This function loads a function or variable definition from an
    ///        external AST file and merges it into the original AST.
@@ -187,24 +186,12 @@ class CrossTranslationUnitContext : public 
CrossTUAnalysisHelper {
    /// imported source location.
    /// \p ToLoc Source location in the imported-to AST.
    /// \return Source location in the imported-from AST and the corresponding
-  /// ASTUnit object (the AST was loaded from a file using an internal ASTUni
+  /// ASTUnit object (the AST was loaded from a file using an internal ASTUnit
    /// object that is returned here).
    /// If any error happens (ToLoc is a non-imported source location) empty is
    /// returned.
    llvm::Optional<std::pair<SourceLocation /*FromLoc*/, ASTUnit *>>
-  getImportedFromSourceLocation(SourceLocation ToLoc) const;
-
-  /// Determine the original source location in the original TU for an
-  /// imported source location.
-  /// \p ToLoc Source location in the imported-to AST.
-  /// \return Source location in the imported-from AST and the Preprocessor
-  /// corresponding to the AST unit that originally contained the imported-from
-  /// source location.
-  /// If any error happens (ToLoc is a non-imported source location) empty is
-  /// returned.
-  llvm::Optional<std::pair<SourceLocation /*FromLoc*/, Preprocessor *>>
-  getImportedFromSourceLocationWithPreprocessor(
-      SourceLocation ToLoc) const override;
+  getImportedFromSourceLocation(const clang::SourceLocation &ToLoc) const;
private:
    using ImportedFileIDMap =

diff  --git a/clang/include/clang/StaticAnalyzer/Core/Analyses.def 
b/clang/include/clang/StaticAnalyzer/Core/Analyses.def
index 2e98cbba4c9e..c4e5f5be6fd7 100644
--- a/clang/include/clang/StaticAnalyzer/Core/Analyses.def
+++ b/clang/include/clang/StaticAnalyzer/Core/Analyses.def
@@ -28,6 +28,42 @@ ANALYSIS_CONSTRAINTS(RangeConstraints, "range",
  ANALYSIS_CONSTRAINTS(Z3Constraints, "z3", "Use Z3 contraint solver",
                       CreateZ3ConstraintManager)
+#ifndef ANALYSIS_DIAGNOSTICS
+#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN)
+#endif
+
+ANALYSIS_DIAGNOSTICS(HTML, "html", "Output analysis results using HTML",
+                     createHTMLDiagnosticConsumer)
+
+ANALYSIS_DIAGNOSTICS(
+    HTML_SINGLE_FILE, "html-single-file",
+    "Output analysis results using HTML (not allowing for multi-file bugs)",
+    createHTMLSingleFileDiagnosticConsumer)
+
+ANALYSIS_DIAGNOSTICS(PLIST, "plist", "Output analysis results using Plists",
+                     createPlistDiagnosticConsumer)
+
+ANALYSIS_DIAGNOSTICS(
+    PLIST_MULTI_FILE, "plist-multi-file",
+    "Output analysis results using Plists (allowing for multi-file bugs)",
+    createPlistMultiFileDiagnosticConsumer)
+
+ANALYSIS_DIAGNOSTICS(PLIST_HTML, "plist-html",
+                     "Output analysis results using HTML wrapped with Plists",
+                     createPlistHTMLDiagnosticConsumer)
+
+ANALYSIS_DIAGNOSTICS(SARIF, "sarif", "Output analysis results in a SARIF file",
+                     createSarifDiagnosticConsumer)
+
+ANALYSIS_DIAGNOSTICS(TEXT, "text", "Text output of analysis results to stderr",
+                     createTextPathDiagnosticConsumer)
+
+ANALYSIS_DIAGNOSTICS(TEXT_MINIMAL, "text-minimal",
+                     "Emits minimal diagnostics to stderr, stating only the "
+                     "warning message and the associated notes. Usually "
+                     "used in addition to other analysis types",
+                     createTextMinimalPathDiagnosticConsumer)
+
  #ifndef ANALYSIS_PURGE
  #define ANALYSIS_PURGE(NAME, CMDFLAG, DESC)
  #endif
@@ -55,6 +91,7 @@ ANALYSIS_INLINING_MODE(
#undef ANALYSIS_STORE
  #undef ANALYSIS_CONSTRAINTS
+#undef ANALYSIS_DIAGNOSTICS
  #undef ANALYSIS_PURGE
  #undef ANALYSIS_INLINING_MODE
  #undef ANALYSIS_IPA

diff  --git a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h 
b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
index 0dd2c86c5ca9..ccf35e0a81ec 100644
--- a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
+++ b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
@@ -58,7 +58,7 @@ NumConstraints
  ///  analysis results.
  enum AnalysisDiagClients {
  #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) PD_##NAME,
-#include "clang/Analysis/PathDiagnosticConsumers.def"
+#include "clang/StaticAnalyzer/Core/Analyses.def"
  PD_NONE,
  NUM_ANALYSIS_DIAG_CLIENTS
  };

diff  --git a/clang/include/clang/Analysis/PathDiagnosticConsumers.h 
b/clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h
similarity index 78%
rename from clang/include/clang/Analysis/PathDiagnosticConsumers.h
rename to clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h
index fde2e3498216..f40f88eb32ff 100644
--- a/clang/include/clang/Analysis/PathDiagnosticConsumers.h
+++ b/clang/include/clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h
@@ -18,24 +18,25 @@
  #include <string>
  #include <vector>
-#include "clang/Analysis/PathDiagnostic.h"
-
  namespace clang {
class AnalyzerOptions;
  class Preprocessor;
-class CrossTUAnalysisHelper;
+namespace cross_tu {
+class CrossTranslationUnitContext;
+}
namespace ento { class PathDiagnosticConsumer;
-typedef std::vector<PathDiagnosticConsumer *> PathDiagnosticConsumers;
+typedef std::vector<PathDiagnosticConsumer*> PathDiagnosticConsumers;
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN) \
    void CREATEFN(PathDiagnosticConsumerOptions Diagopts,                       
 \
                  PathDiagnosticConsumers &C, const std::string &Prefix,        
 \
-                const Preprocessor &PP, const CrossTUAnalysisHelper &CTU);
-#include "clang/Analysis/PathDiagnosticConsumers.def"
+                const Preprocessor &PP,                                        
\
+                const cross_tu::CrossTranslationUnitContext &CTU);
+#include "clang/StaticAnalyzer/Core/Analyses.def"
} // end 'ento' namespace
  } // end 'clang' namespace

diff  --git 
a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h 
b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
index 7e8b9de3a942..c76e9c0326af 100644
--- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
+++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
@@ -16,10 +16,10 @@
#include "clang/Analysis/AnalysisDeclContext.h"
  #include "clang/Analysis/PathDiagnostic.h"
-#include "clang/Analysis/PathDiagnosticConsumers.h"
  #include "clang/Lex/Preprocessor.h"
  #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
  #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
+#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
namespace clang {
diff  --git a/clang/include/clang/module.modulemap 
b/clang/include/clang/module.modulemap
index ec396e1532e0..332e533f0347 100644
--- a/clang/include/clang/module.modulemap
+++ b/clang/include/clang/module.modulemap
@@ -3,7 +3,6 @@ module Clang_Analysis {
    umbrella "Analysis"
textual header "Analysis/Analyses/ThreadSafetyOps.def"
-  textual header "Analysis/PathDiagnosticConsumers.def"
module * { export * }
diff  --git a/clang/lib/Analysis/CMakeLists.txt 
b/clang/lib/Analysis/CMakeLists.txt
index 94c6e322e02b..ed626a6e130c 100644
--- a/clang/lib/Analysis/CMakeLists.txt
+++ b/clang/lib/Analysis/CMakeLists.txt
@@ -18,19 +18,14 @@ add_clang_library(clangAnalysis
    CodeInjector.cpp
    Dominators.cpp
    ExprMutationAnalyzer.cpp
-  HTMLPathDiagnosticConsumer.cpp
    IssueHash.cpp
    LiveVariables.cpp
    ObjCNoReturn.cpp
    PathDiagnostic.cpp
-  PlistPathDiagnosticConsumer.cpp
-  PlistHTMLPathDiagnosticConsumer.cpp
    PostOrderCFGView.cpp
    ProgramPoint.cpp
    ReachableCode.cpp
    RetainSummaryManager.cpp
-  SarifPathDiagnosticConsumer.cpp
-  TextPathDiagnosticConsumer.cpp
    ThreadSafety.cpp
    ThreadSafetyCommon.cpp
    ThreadSafetyLogical.cpp
@@ -42,8 +37,6 @@ add_clang_library(clangAnalysis
    clangASTMatchers
    clangBasic
    clangLex
-  clangRewrite
-  clangToolingCore
DEPENDS
    omp_gen

diff  --git a/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp 
b/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp
deleted file mode 100644
index ca453ff700bd..000000000000
--- a/clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//===--- PlistHTMLDiagnostics.cpp - The Plist-HTML Diagnostic Consumer. 
---===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This diagnostic consumer produces both the HTML output and the Plist output.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/Analysis/PathDiagnostic.h"
-#include "clang/Analysis/PathDiagnosticConsumers.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Lex/Preprocessor.h"
-#include "llvm/Support/Path.h"
-
-using namespace clang;
-using namespace ento;
-
-namespace clang {
-class CrossTUAnalysisHelper;
-}
-
-void ento::createPlistHTMLDiagnosticConsumer(
-    PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
-    const std::string &Prefix, const Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
-  createHTMLDiagnosticConsumer(
-      DiagOpts, C, std::string(llvm::sys::path::parent_path(Prefix)), PP, CTU);
-  createPlistMultiFileDiagnosticConsumer(DiagOpts, C, Prefix, PP, CTU);
-  createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, Prefix, PP,
-                                          CTU);
-}

diff  --git a/clang/lib/CrossTU/CrossTranslationUnit.cpp 
b/clang/lib/CrossTU/CrossTranslationUnit.cpp
index 5ab5d6def2a2..e27779f91abc 100644
--- a/clang/lib/CrossTU/CrossTranslationUnit.cpp
+++ b/clang/lib/CrossTU/CrossTranslationUnit.cpp
@@ -765,7 +765,7 @@ CrossTranslationUnitContext::getOrCreateASTImporter(ASTUnit 
*Unit) {
llvm::Optional<std::pair<SourceLocation, ASTUnit *>>
  CrossTranslationUnitContext::getImportedFromSourceLocation(
-    SourceLocation ToLoc) const {
+    const clang::SourceLocation &ToLoc) const {
    const SourceManager &SM = Context.getSourceManager();
    auto DecToLoc = SM.getDecomposedLoc(ToLoc);
@@ -781,16 +781,5 @@ CrossTranslationUnitContext::getImportedFromSourceLocation(
    return std::make_pair(FromLoc, Unit);
  }
-llvm::Optional<std::pair<SourceLocation, Preprocessor *>>
-CrossTranslationUnitContext::getImportedFromSourceLocationWithPreprocessor(
-    SourceLocation ToLoc) const {
-  if (llvm::Optional<std::pair<SourceLocation, ASTUnit *>> LocAndUnit =
-      getImportedFromSourceLocation(ToLoc)) {
-    return std::make_pair(LocAndUnit->first,
-                          &LocAndUnit->second->getPreprocessor());
-  }
-  return None;
-}
-
  } // namespace cross_tu
  } // namespace clang

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 348f5582bde2..6795151d08d5 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -571,7 +571,7 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList 
&Args,
      AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name)
  #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
        .Case(CMDFLAG, PD_##NAME)
-#include "clang/Analysis/PathDiagnosticConsumers.def"
+#include "clang/StaticAnalyzer/Core/Analyses.def"
        .Default(NUM_ANALYSIS_DIAG_CLIENTS);
      if (Value == NUM_ANALYSIS_DIAG_CLIENTS) {
        Diags.Report(diag::err_drv_invalid_value)

diff  --git a/clang/lib/StaticAnalyzer/Core/CMakeLists.txt 
b/clang/lib/StaticAnalyzer/Core/CMakeLists.txt
index b1f527ed75d5..d947d415ad6e 100644
--- a/clang/lib/StaticAnalyzer/Core/CMakeLists.txt
+++ b/clang/lib/StaticAnalyzer/Core/CMakeLists.txt
@@ -30,13 +30,16 @@ add_clang_library(clangStaticAnalyzerCore
    ExprEngineCallAndReturn.cpp
    ExprEngineObjC.cpp
    FunctionSummary.cpp
+  HTMLDiagnostics.cpp
    LoopUnrolling.cpp
    LoopWidening.cpp
    MemRegion.cpp
+  PlistDiagnostics.cpp
    ProgramState.cpp
    RangeConstraintManager.cpp
    RangedConstraintManager.cpp
    RegionStore.cpp
+  SarifDiagnostics.cpp
    SimpleConstraintManager.cpp
    SimpleSValBuilder.cpp
    SMTConstraintManager.cpp
@@ -44,6 +47,7 @@ add_clang_library(clangStaticAnalyzerCore
    SValBuilder.cpp
    SVals.cpp
    SymbolManager.cpp
+  TextDiagnostics.cpp
    WorkList.cpp
LINK_LIBS

diff  --git a/clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp 
b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
similarity index 91%
rename from clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp
rename to clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
index fb60819b1c15..149459cf986a 100644
--- a/clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
@@ -1,4 +1,4 @@
-//===- HTMLPathDiagnosticConsumer.cpp - HTML Diagnostics for Paths 
--------===//
+//===- HTMLDiagnostics.cpp - HTML Diagnostics for Paths 
-------------------===//
  //
  // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
  // See https://llvm.org/LICENSE.txt for license information.
@@ -6,13 +6,12 @@
  //
  
//===----------------------------------------------------------------------===//
  //
-//  This file defines the HTMLPathDiagnosticConsumer object.
+//  This file defines the HTMLDiagnostics object.
  //
  
//===----------------------------------------------------------------------===//
#include "clang/Analysis/IssueHash.h"
  #include "clang/Analysis/PathDiagnostic.h"
-#include "clang/Analysis/PathDiagnosticConsumers.h"
  #include "clang/AST/Decl.h"
  #include "clang/AST/DeclBase.h"
  #include "clang/AST/Stmt.h"
@@ -25,6 +24,7 @@
  #include "clang/Lex/Token.h"
  #include "clang/Rewrite/Core/HTMLRewrite.h"
  #include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
  #include "llvm/ADT/ArrayRef.h"
  #include "llvm/ADT/SmallString.h"
  #include "llvm/ADT/StringRef.h"
@@ -50,17 +50,13 @@
  using namespace clang;
  using namespace ento;
-namespace clang {
-class CrossTUAnalysisHelper;
-}
-
  
//===----------------------------------------------------------------------===//
  // Boilerplate.
  
//===----------------------------------------------------------------------===//
namespace { -class HTMLPathDiagnosticConsumer : public PathDiagnosticConsumer {
+class HTMLDiagnostics : public PathDiagnosticConsumer {
    PathDiagnosticConsumerOptions DiagOpts;
    std::string Directory;
    bool createdDir = false;
@@ -69,18 +65,20 @@ class HTMLPathDiagnosticConsumer : public 
PathDiagnosticConsumer {
    const bool SupportsCrossFileDiagnostics;
public:
-  HTMLPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
-                             const std::string &OutputDir,
-                             const Preprocessor &PP, bool 
SupportsMultipleFiles)
-      : DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(PP),
-        SupportsCrossFileDiagnostics(SupportsMultipleFiles) {}
+  HTMLDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
+                  const std::string &OutputDir, const Preprocessor &pp,
+                  bool supportsMultipleFiles)
+      : DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(pp),
+        SupportsCrossFileDiagnostics(supportsMultipleFiles) {}
- ~HTMLPathDiagnosticConsumer() override { FlushDiagnostics(nullptr); }
+  ~HTMLDiagnostics() override { FlushDiagnostics(nullptr); }
void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
                              FilesMade *filesMade) override;
- StringRef getName() const override { return "HTMLPathDiagnosticConsumer"; }
+  StringRef getName() const override {
+    return "HTMLDiagnostics";
+  }
bool supportsCrossFileDiagnostics() const override {
      return SupportsCrossFileDiagnostics;
@@ -137,7 +135,7 @@ class HTMLPathDiagnosticConsumer : public 
PathDiagnosticConsumer {
  void ento::createHTMLDiagnosticConsumer(
      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
      const std::string &OutputDir, const Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
+    const cross_tu::CrossTranslationUnitContext &CTU) {
// FIXME: HTML is currently our default output type, but if the output
    // directory isn't specified, it acts like if it was in the minimal text
@@ -150,36 +148,47 @@ void ento::createHTMLDiagnosticConsumer(
    if (OutputDir.empty())
      return;
- C.push_back(
-      new HTMLPathDiagnosticConsumer(std::move(DiagOpts), OutputDir, PP, 
true));
+  C.push_back(new HTMLDiagnostics(std::move(DiagOpts), OutputDir, PP, true));
  }
void ento::createHTMLSingleFileDiagnosticConsumer(
      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
      const std::string &OutputDir, const Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
+    const cross_tu::CrossTranslationUnitContext &CTU) {
    createTextMinimalPathDiagnosticConsumer(DiagOpts, C, OutputDir, PP, CTU);
// TODO: Emit an error here.
    if (OutputDir.empty())
      return;
- C.push_back(new HTMLPathDiagnosticConsumer(std::move(DiagOpts), OutputDir, PP,
-                                             false));
+  C.push_back(new HTMLDiagnostics(std::move(DiagOpts), OutputDir, PP, false));
+}
+
+void ento::createPlistHTMLDiagnosticConsumer(
+    PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
+    const std::string &prefix, const Preprocessor &PP,
+    const cross_tu::CrossTranslationUnitContext &CTU) {
+  createHTMLDiagnosticConsumer(
+      DiagOpts, C, std::string(llvm::sys::path::parent_path(prefix)), PP,
+      CTU);
+  createPlistMultiFileDiagnosticConsumer(DiagOpts, C, prefix, PP, CTU);
+  createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, prefix, PP,
+                                          CTU);
  }
//===----------------------------------------------------------------------===//
  // Report processing.
  
//===----------------------------------------------------------------------===//
-void HTMLPathDiagnosticConsumer::FlushDiagnosticsImpl(
-    std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) {
+void HTMLDiagnostics::FlushDiagnosticsImpl(
+  std::vector<const PathDiagnostic *> &Diags,
+  FilesMade *filesMade) {
    for (const auto Diag : Diags)
      ReportDiag(*Diag, filesMade);
  }
-void HTMLPathDiagnosticConsumer::ReportDiag(const PathDiagnostic &D,
-                                            FilesMade *filesMade) {
+void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D,
+                                 FilesMade *filesMade) {
    // Create the HTML directory if it is missing.
    if (!createdDir) {
      createdDir = true;
@@ -287,11 +296,8 @@ void HTMLPathDiagnosticConsumer::ReportDiag(const 
PathDiagnostic &D,
    os << report;
  }
-std::string HTMLPathDiagnosticConsumer::GenerateHTML(const PathDiagnostic &D,
-                                                     Rewriter &R,
-                                                     const SourceManager &SMgr,
-                                                     const PathPieces &path,
-                                                     const char *declName) {
+std::string HTMLDiagnostics::GenerateHTML(const PathDiagnostic& D, Rewriter &R,
+    const SourceManager& SMgr, const PathPieces& path, const char *declName) {
    // Rewrite source files as HTML for every new file the path crosses
    std::vector<FileID> FileIDs;
    for (auto I : path) {
@@ -363,8 +369,9 @@ std::string HTMLPathDiagnosticConsumer::GenerateHTML(const 
PathDiagnostic &D,
    return os.str();
  }
-void HTMLPathDiagnosticConsumer::dumpCoverageData(
-    const PathDiagnostic &D, const PathPieces &path,
+void HTMLDiagnostics::dumpCoverageData(
+    const PathDiagnostic &D,
+    const PathPieces &path,
      llvm::raw_string_ostream &os) {
const FilesToLineNumsMap &ExecutedLines = D.getExecutedLines();
@@ -388,8 +395,8 @@ void HTMLPathDiagnosticConsumer::dumpCoverageData(
    os << "};";
  }
-std::string HTMLPathDiagnosticConsumer::showRelevantLinesJavascript(
-    const PathDiagnostic &D, const PathPieces &path) {
+std::string HTMLDiagnostics::showRelevantLinesJavascript(
+      const PathDiagnostic &D, const PathPieces &path) {
    std::string s;
    llvm::raw_string_ostream os(s);
    os << "<script type='text/javascript'>\n";
@@ -453,10 +460,9 @@ document.addEventListener("DOMContentLoaded", function() {
    return os.str();
  }
-void HTMLPathDiagnosticConsumer::FinalizeHTML(
-    const PathDiagnostic &D, Rewriter &R, const SourceManager &SMgr,
-    const PathPieces &path, FileID FID, const FileEntry *Entry,
-    const char *declName) {
+void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic& D, Rewriter &R,
+    const SourceManager& SMgr, const PathPieces& path, FileID FID,
+    const FileEntry *Entry, const char *declName) {
    // This is a cludge; basically we want to append either the full
    // working directory if we have no directory information.  This is
    // a work in progress.
@@ -601,7 +607,7 @@ void HTMLPathDiagnosticConsumer::FinalizeHTML(
    html::AddHeaderFooterInternalBuiltinCSS(R, FID, Entry->getName());
  }
-StringRef HTMLPathDiagnosticConsumer::showHelpJavascript() {
+StringRef HTMLDiagnostics::showHelpJavascript() {
    return R"<<<(
  <script type='text/javascript'>
@@ -684,9 +690,8 @@ static void HandlePopUpPieceEndTag(Rewriter &R,
    }
  }
-void HTMLPathDiagnosticConsumer::RewriteFile(Rewriter &R,
-                                             const PathPieces &path,
-                                             FileID FID) {
+void HTMLDiagnostics::RewriteFile(Rewriter &R,
+                                  const PathPieces& path, FileID FID) {
    // Process the path.
    // Maintain the counts of extra note pieces separately.
    unsigned TotalPieces = path.size();
@@ -764,9 +769,10 @@ void HTMLPathDiagnosticConsumer::RewriteFile(Rewriter &R,
    html::HighlightMacros(R, FID, PP);
  }
-void HTMLPathDiagnosticConsumer::HandlePiece(
-    Rewriter &R, FileID BugFileID, const PathDiagnosticPiece &P,
-    const std::vector<SourceRange> &PopUpRanges, unsigned num, unsigned max) {
+void HTMLDiagnostics::HandlePiece(Rewriter &R, FileID BugFileID,
+                                  const PathDiagnosticPiece &P,
+                                  const std::vector<SourceRange> &PopUpRanges,
+                                  unsigned num, unsigned max) {
    // For now, just draw a box above the line in question, and emit the
    // warning.
    FullSourceLoc Pos = P.getLocation().asLocation();
@@ -998,8 +1004,9 @@ static void EmitAlphaCounter(raw_ostream &os, unsigned n) {
    os << char('a' + x);
  }
-unsigned HTMLPathDiagnosticConsumer::ProcessMacroPiece(
-    raw_ostream &os, const PathDiagnosticMacroPiece &P, unsigned num) {
+unsigned HTMLDiagnostics::ProcessMacroPiece(raw_ostream &os,
+                                            const PathDiagnosticMacroPiece& P,
+                                            unsigned num) {
    for (const auto &subPiece : P.subPieces) {
      if (const auto *MP = dyn_cast<PathDiagnosticMacroPiece>(subPiece.get())) {
        num = ProcessMacroPiece(os, *MP, num);
@@ -1021,10 +1028,10 @@ unsigned HTMLPathDiagnosticConsumer::ProcessMacroPiece(
    return num;
  }
-void HTMLPathDiagnosticConsumer::HighlightRange(Rewriter &R, FileID BugFileID,
-                                                SourceRange Range,
-                                                const char *HighlightStart,
-                                                const char *HighlightEnd) {
+void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID,
+                                     SourceRange Range,
+                                     const char *HighlightStart,
+                                     const char *HighlightEnd) {
    SourceManager &SM = R.getSourceMgr();
    const LangOptions &LangOpts = R.getLangOpts();
@@ -1059,7 +1066,7 @@ void HTMLPathDiagnosticConsumer::HighlightRange(Rewriter &R, FileID BugFileID,
    html::HighlightRange(R, InstantiationStart, E, HighlightStart, 
HighlightEnd);
  }
-StringRef HTMLPathDiagnosticConsumer::generateKeyboardNavigationJavascript() {
+StringRef HTMLDiagnostics::generateKeyboardNavigationJavascript() {
    return R"<<<(
  <script type='text/javascript'>
  var digitMatcher = new RegExp("[0-9]+");

diff  --git a/clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp 
b/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
similarity index 96%
rename from clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp
rename to clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
index 52a488162dba..35e320c7755f 100644
--- a/clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
@@ -1,4 +1,4 @@
-//===--- PlistPathDiagnosticConsumer.cpp - Plist Diagnostics ----*- C++ 
-*-===//
+//===--- PlistDiagnostics.cpp - Plist Diagnostics for Paths -----*- C++ 
-*-===//
  //
  // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
  // See https://llvm.org/LICENSE.txt for license information.
@@ -6,21 +6,22 @@
  //
  
//===----------------------------------------------------------------------===//
  //
-//  This file defines the PlistPathDiagnosticConsumer object.
+//  This file defines the PlistDiagnostics object.
  //
  
//===----------------------------------------------------------------------===//
-#include "clang/Analysis/CrossTUAnalysisHelper.h"
  #include "clang/Analysis/IssueHash.h"
  #include "clang/Analysis/PathDiagnostic.h"
-#include "clang/Analysis/PathDiagnosticConsumers.h"
  #include "clang/Basic/FileManager.h"
  #include "clang/Basic/PlistSupport.h"
  #include "clang/Basic/SourceManager.h"
  #include "clang/Basic/Version.h"
+#include "clang/CrossTU/CrossTranslationUnit.h"
+#include "clang/Frontend/ASTUnit.h"
  #include "clang/Lex/Preprocessor.h"
  #include "clang/Lex/TokenConcatenation.h"
  #include "clang/Rewrite/Core/HTMLRewrite.h"
+#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
  #include "llvm/ADT/SmallPtrSet.h"
  #include "llvm/ADT/SmallVector.h"
  #include "llvm/ADT/Statistic.h"
@@ -37,29 +38,29 @@ using namespace markup;
  
//===----------------------------------------------------------------------===//
namespace {
-  class PlistPathDiagnosticConsumer : public PathDiagnosticConsumer {
+  class PlistDiagnostics : public PathDiagnosticConsumer {
      PathDiagnosticConsumerOptions DiagOpts;
      const std::string OutputFile;
      const Preprocessor &PP;
-    const CrossTUAnalysisHelper &CTU;
+    const cross_tu::CrossTranslationUnitContext &CTU;
      const bool SupportsCrossFileDiagnostics;
void printBugPath(llvm::raw_ostream &o, const FIDMap &FM,
                        const PathPieces &Path);
public:
-    PlistPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
+    PlistDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
                       const std::string &OutputFile, const Preprocessor &PP,
-                     const CrossTUAnalysisHelper &CTU,
+                     const cross_tu::CrossTranslationUnitContext &CTU,
                       bool supportsMultipleFiles);
- ~PlistPathDiagnosticConsumer() override {}
+    ~PlistDiagnostics() override {}
void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
                                FilesMade *filesMade) override;
StringRef getName() const override {
-      return "PlistPathDiagnosticConsumer";
+      return "PlistDiagnostics";
      }
PathGenerationScheme getGenerationScheme() const override {
@@ -78,13 +79,13 @@ namespace {
  class PlistPrinter {
    const FIDMap& FM;
    const Preprocessor &PP;
-  const CrossTUAnalysisHelper &CTU;
+  const cross_tu::CrossTranslationUnitContext &CTU;
    llvm::SmallVector<const PathDiagnosticMacroPiece *, 0> MacroPieces;
public:
    PlistPrinter(const FIDMap& FM,
                 const Preprocessor &PP,
-               const CrossTUAnalysisHelper &CTU)
+               const cross_tu::CrossTranslationUnitContext &CTU)
      : FM(FM), PP(PP), CTU(CTU) {
    }
@@ -174,7 +175,7 @@ static void printCoverage(const PathDiagnostic *D, static ExpansionInfo
  getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP,
-                 const CrossTUAnalysisHelper &CTU);
+                 const cross_tu::CrossTranslationUnitContext &CTU);
//===----------------------------------------------------------------------===//
  // Methods of PlistPrinter.
@@ -515,12 +516,12 @@ static void printCoverage(const PathDiagnostic *D,
  }
//===----------------------------------------------------------------------===//
-// Methods of PlistPathDiagnosticConsumer.
+// Methods of PlistDiagnostics.
  
//===----------------------------------------------------------------------===//
-PlistPathDiagnosticConsumer::PlistPathDiagnosticConsumer(
+PlistDiagnostics::PlistDiagnostics(
      PathDiagnosticConsumerOptions DiagOpts, const std::string &output,
-    const Preprocessor &PP, const CrossTUAnalysisHelper &CTU,
+    const Preprocessor &PP, const cross_tu::CrossTranslationUnitContext &CTU,
      bool supportsMultipleFiles)
      : DiagOpts(std::move(DiagOpts)), OutputFile(output), PP(PP), CTU(CTU),
        SupportsCrossFileDiagnostics(supportsMultipleFiles) {
@@ -531,14 +532,14 @@ PlistPathDiagnosticConsumer::PlistPathDiagnosticConsumer(
  void ento::createPlistDiagnosticConsumer(
      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
      const std::string &OutputFile, const Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
+    const cross_tu::CrossTranslationUnitContext &CTU) {
// TODO: Emit an error here.
    if (OutputFile.empty())
      return;
- C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP, CTU,
-                                              
/*supportsMultipleFiles=*/false));
+  C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU,
+                                   /*supportsMultipleFiles=*/false));
    createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, OutputFile,
                                            PP, CTU);
  }
@@ -546,21 +547,20 @@ void ento::createPlistDiagnosticConsumer(
  void ento::createPlistMultiFileDiagnosticConsumer(
      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
      const std::string &OutputFile, const Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
+    const cross_tu::CrossTranslationUnitContext &CTU) {
// TODO: Emit an error here.
    if (OutputFile.empty())
      return;
- C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP, CTU,
-                                              /*supportsMultipleFiles=*/true));
+  C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU,
+                                   /*supportsMultipleFiles=*/true));
    createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, OutputFile,
                                            PP, CTU);
  }
-void PlistPathDiagnosticConsumer::printBugPath(llvm::raw_ostream &o,
-                                               const FIDMap &FM,
-                                               const PathPieces &Path) {
+void PlistDiagnostics::printBugPath(llvm::raw_ostream &o, const FIDMap &FM,
+                                    const PathPieces &Path) {
    PlistPrinter Printer(FM, PP, CTU);
    assert(std::is_partitioned(Path.begin(), Path.end(),
                               [](const PathDiagnosticPieceRef &E) {
@@ -603,8 +603,9 @@ void 
PlistPathDiagnosticConsumer::printBugPath(llvm::raw_ostream &o,
    o << "   </array>\n";
  }
-void PlistPathDiagnosticConsumer::FlushDiagnosticsImpl(
-    std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) {
+void PlistDiagnostics::FlushDiagnosticsImpl(
+                                    std::vector<const PathDiagnostic *> &Diags,
+                                    FilesMade *filesMade) {
    // Build up a set of FIDs that we use by scanning the locations and
    // ranges of the diagnostics.
    FIDMap FM;
@@ -984,13 +985,12 @@ static const MacroInfo *getMacroInfoForLocation(const 
Preprocessor &PP,
static ExpansionInfo
  getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP,
-                 const CrossTUAnalysisHelper &CTU) {
+                 const cross_tu::CrossTranslationUnitContext &CTU) {
const Preprocessor *PPToUse = &PP;
-  if (auto LocAndUnit =
-      CTU.getImportedFromSourceLocationWithPreprocessor(MacroLoc)) {
+  if (auto LocAndUnit = CTU.getImportedFromSourceLocation(MacroLoc)) {
      MacroLoc = LocAndUnit->first;
-    PPToUse = LocAndUnit->second;
+    PPToUse = &LocAndUnit->second->getPreprocessor();
    }
llvm::SmallString<200> ExpansionBuf;

diff  --git a/clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp 
b/clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp
similarity index 93%
rename from clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp
rename to clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp
index e2fcad5b8e15..f93d04ccd61a 100644
--- a/clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp
@@ -1,4 +1,4 @@
-//===--- SarifPathDiagnosticConsumer.cpp - Sarif Diagnostics  ---*- C++ 
-*-===//
+//===--- SarifDiagnostics.cpp - Sarif Diagnostics for Paths -----*- C++ 
-*-===//
  //
  // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
  // See https://llvm.org/LICENSE.txt for license information.
@@ -6,15 +6,15 @@
  //
  
//===----------------------------------------------------------------------===//
  //
-//  This file defines the SarifPathDiagnosticConsumer object.
+//  This file defines the SarifDiagnostics object.
  //
  
//===----------------------------------------------------------------------===//
#include "clang/Analysis/PathDiagnostic.h"
-#include "clang/Analysis/PathDiagnosticConsumers.h"
  #include "clang/Basic/FileManager.h"
  #include "clang/Basic/Version.h"
  #include "clang/Lex/Preprocessor.h"
+#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
  #include "llvm/ADT/STLExtras.h"
  #include "llvm/ADT/StringMap.h"
  #include "llvm/Support/ConvertUTF.h"
@@ -25,24 +25,20 @@ using namespace llvm;
  using namespace clang;
  using namespace ento;
-namespace clang {
-class CrossTUAnalysisHelper;
-}
-
  namespace {
-class SarifPathDiagnosticConsumer : public PathDiagnosticConsumer {
+class SarifDiagnostics : public PathDiagnosticConsumer {
    std::string OutputFile;
    const LangOptions &LO;
public:
-  SarifPathDiagnosticConsumer(const std::string &Output, const LangOptions &LO)
+  SarifDiagnostics(const std::string &Output, const LangOptions &LO)
        : OutputFile(Output), LO(LO) {}
-  ~SarifPathDiagnosticConsumer() override = default;
+  ~SarifDiagnostics() override = default;
void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
                              FilesMade *FM) override;
- StringRef getName() const override { return "SarifPathDiagnosticConsumer"; }
+  StringRef getName() const override { return "SarifDiagnostics"; }
    PathGenerationScheme getGenerationScheme() const override { return Minimal; 
}
    bool supportsLogicalOpControlFlow() const override { return true; }
    bool supportsCrossFileDiagnostics() const override { return true; }
@@ -52,13 +48,13 @@ class SarifPathDiagnosticConsumer : public 
PathDiagnosticConsumer {
  void ento::createSarifDiagnosticConsumer(
      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
      const std::string &Output, const Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
+    const cross_tu::CrossTranslationUnitContext &CTU) {
// TODO: Emit an error here.
    if (Output.empty())
      return;
- C.push_back(new SarifPathDiagnosticConsumer(Output, PP.getLangOpts()));
+  C.push_back(new SarifDiagnostics(Output, PP.getLangOpts()));
    createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, Output, PP,
                                            CTU);
  }
@@ -303,9 +299,6 @@ static json::Object createResult(const LangOptions &LO,
  }
static StringRef getRuleDescription(StringRef CheckName) {
-  // FIXME: This is a layering violation; it only works for the particular
-  // use-case of clang static analyzer. This info should be provided
-  // as part of PathDiagnostic itself.
    return llvm::StringSwitch<StringRef>(CheckName)
  #define GET_CHECKERS
  #define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN)                
 \
@@ -317,9 +310,6 @@ static StringRef getRuleDescription(StringRef CheckName) {
  }
static StringRef getRuleHelpURIStr(StringRef CheckName) {
-  // FIXME: This is a layering violation; it only works for the particular
-  // use-case of clang static analyzer. This info should be provided
-  // as part of PathDiagnostic itself.
    return llvm::StringSwitch<StringRef>(CheckName)
  #define GET_CHECKERS
  #define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN)                
 \
@@ -387,7 +377,7 @@ static json::Object createRun(const LangOptions &LO,
                        {"columnKind", "unicodeCodePoints"}};
  }
-void SarifPathDiagnosticConsumer::FlushDiagnosticsImpl(
+void SarifDiagnostics::FlushDiagnosticsImpl(
      std::vector<const PathDiagnostic *> &Diags, FilesMade *) {
    // We currently overwrite the file if it already exists. However, it may be
    // useful to add a feature someday that allows the user to append a run to 
an

diff  --git a/clang/lib/Analysis/TextPathDiagnosticConsumer.cpp 
b/clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp
similarity index 79%
rename from clang/lib/Analysis/TextPathDiagnosticConsumer.cpp
rename to clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp
index e9010d5c08aa..ae2bad7ee77c 100644
--- a/clang/lib/Analysis/TextPathDiagnosticConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp
@@ -1,4 +1,4 @@
-//===--- TextPathDiagnosticConsumer.cpp - Text Diagnostics ------*- C++ 
-*-===//
+//===--- TextDiagnostics.cpp - Text Diagnostics for Paths -------*- C++ 
-*-===//
  //
  // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
  // See https://llvm.org/LICENSE.txt for license information.
@@ -6,17 +6,19 @@
  //
  
//===----------------------------------------------------------------------===//
  //
-//  This file defines the TextPathDiagnosticConsumer object.
+//  This file defines the TextDiagnostics object.
  //
  
//===----------------------------------------------------------------------===//
#include "clang/Analysis/PathDiagnostic.h"
-#include "clang/Analysis/PathDiagnosticConsumers.h"
  #include "clang/Basic/SourceManager.h"
  #include "clang/Basic/Version.h"
+#include "clang/CrossTU/CrossTranslationUnit.h"
  #include "clang/Frontend/ASTUnit.h"
  #include "clang/Lex/Preprocessor.h"
  #include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
+#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
  #include "clang/Tooling/Core/Replacement.h"
  #include "clang/Tooling/Tooling.h"
  #include "llvm/ADT/SmallPtrSet.h"
@@ -27,29 +29,25 @@ using namespace clang;
  using namespace ento;
  using namespace tooling;
-namespace clang {
-class CrossTUAnalysisHelper;
-}
-
  namespace {
-/// Emits minimal diagnostics (report message + notes) for the 'none' output
+/// Emitsd minimal diagnostics (report message + notes) for the 'none' output
  /// type to the standard error, or to to compliment many others. Emits 
detailed
  /// diagnostics in textual format for the 'text' output type.
-class TextPathDiagnosticConsumer : public PathDiagnosticConsumer {
+class TextDiagnostics : public PathDiagnosticConsumer {
    PathDiagnosticConsumerOptions DiagOpts;
    DiagnosticsEngine &DiagEng;
    const LangOptions &LO;
    bool ShouldDisplayPathNotes;
public:
-  TextPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
-                             DiagnosticsEngine &DiagEng, const LangOptions &LO,
-                             bool ShouldDisplayPathNotes)
+  TextDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
+                  DiagnosticsEngine &DiagEng, const LangOptions &LO,
+                  bool ShouldDisplayPathNotes)
        : DiagOpts(std::move(DiagOpts)), DiagEng(DiagEng), LO(LO),
          ShouldDisplayPathNotes(ShouldDisplayPathNotes) {}
-  ~TextPathDiagnosticConsumer() override {}
+  ~TextDiagnostics() override {}
- StringRef getName() const override { return "TextPathDiagnosticConsumer"; }
+  StringRef getName() const override { return "TextDiagnostics"; }
bool supportsLogicalOpControlFlow() const override { return true; }
    bool supportsCrossFileDiagnostics() const override { return true; }
@@ -141,17 +139,17 @@ class TextPathDiagnosticConsumer : public 
PathDiagnosticConsumer {
  void ento::createTextPathDiagnosticConsumer(
      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
      const std::string &Prefix, const clang::Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
-  C.emplace_back(new TextPathDiagnosticConsumer(
-      std::move(DiagOpts), PP.getDiagnostics(), PP.getLangOpts(),
-      /*ShouldDisplayPathNotes=*/true));
+    const cross_tu::CrossTranslationUnitContext &CTU) {
+  C.emplace_back(new TextDiagnostics(std::move(DiagOpts), PP.getDiagnostics(),
+                                     PP.getLangOpts(),
+                                     /*ShouldDisplayPathNotes=*/true));
  }
void ento::createTextMinimalPathDiagnosticConsumer(
      PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
      const std::string &Prefix, const clang::Preprocessor &PP,
-    const CrossTUAnalysisHelper &CTU) {
-  C.emplace_back(new TextPathDiagnosticConsumer(
-      std::move(DiagOpts), PP.getDiagnostics(), PP.getLangOpts(),
-      /*ShouldDisplayPathNotes=*/false));
+    const cross_tu::CrossTranslationUnitContext &CTU) {
+  C.emplace_back(new TextDiagnostics(std::move(DiagOpts), PP.getDiagnostics(),
+                                     PP.getLangOpts(),
+                                     /*ShouldDisplayPathNotes=*/false));
  }

diff  --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp 
b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index 1e94950ca097..f2a19b2ccc90 100644
--- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -21,7 +21,6 @@
  #include "clang/Analysis/CallGraph.h"
  #include "clang/Analysis/CodeInjector.h"
  #include "clang/Analysis/PathDiagnostic.h"
-#include "clang/Analysis/PathDiagnosticConsumers.h"
  #include "clang/Basic/SourceManager.h"
  #include "clang/CrossTU/CrossTranslationUnit.h"
  #include "clang/Frontend/CompilerInstance.h"
@@ -31,6 +30,7 @@
  #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
  #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
  #include "clang/StaticAnalyzer/Core/CheckerManager.h"
+#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
  #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
  #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
  #include "llvm/ADT/PostOrderIterator.h"
@@ -152,7 +152,7 @@ class AnalysisConsumer : public AnalysisASTConsumer,
    case PD_##NAME:                                                             
 \
      CREATEFN(Opts->getDiagOpts(), PathConsumers, OutDir, PP, CTU);            
 \
      break;
-#include "clang/Analysis/PathDiagnosticConsumers.def"
+#include "clang/StaticAnalyzer/Core/Analyses.def"
      default:
        llvm_unreachable("Unknown analyzer output type!");
      }


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to