[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