diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2021-01-07 19:23:43 -0800 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2021-01-07 20:22:22 -0800 |
commit | 6b0ee02747ed22d41e175d15f27025183341e6f8 (patch) | |
tree | 45c1e33f7f171b603d1709b4cf692bea509b5a4d /clang/lib | |
parent | 2ff36e79291486b489ae26418daa1b123473b405 (diff) | |
download | llvm-6b0ee02747ed22d41e175d15f27025183341e6f8.zip llvm-6b0ee02747ed22d41e175d15f27025183341e6f8.tar.gz llvm-6b0ee02747ed22d41e175d15f27025183341e6f8.tar.bz2 |
Revert "Revert "Revert "Revert "[analyzer] NFC: Move path diagnostic consumer implementations to libAnalysis.""""
This reverts commit b12f26733a4259c90e5f387aceb9f23c35e003b8.
Fix dead include that looked like another missed circular dependency.
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Analysis/CMakeLists.txt | 7 | ||||
-rw-r--r-- | clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp (renamed from clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp) | 111 | ||||
-rw-r--r-- | clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp | 35 | ||||
-rw-r--r-- | clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp (renamed from clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp) | 62 | ||||
-rw-r--r-- | clang/lib/Analysis/SarifPathDiagnosticConsumer.cpp (renamed from clang/lib/StaticAnalyzer/Core/SarifDiagnostics.cpp) | 30 | ||||
-rw-r--r-- | clang/lib/Analysis/TextPathDiagnosticConsumer.cpp (renamed from clang/lib/StaticAnalyzer/Core/TextDiagnostics.cpp) | 42 | ||||
-rw-r--r-- | clang/lib/CrossTU/CrossTranslationUnit.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 2 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/CMakeLists.txt | 4 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp | 4 |
10 files changed, 182 insertions, 128 deletions
diff --git a/clang/lib/Analysis/CMakeLists.txt b/clang/lib/Analysis/CMakeLists.txt index ed626a6..94c6e32 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 index 149459c..fb60819 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 @@ private: 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 0000000..ca453ff --- /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/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/StaticAnalyzer/Core/PlistDiagnostics.cpp b/clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp index 35e320c..52a4881 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 index f93d04c..e2fcad5 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 @@ public: 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 index ae2bad7..e9010d5 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 @@ public: 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 e27779f..5ab5d6d 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 6795151..348f558 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/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 d947d41..b1f527e 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 f2a19b2..1e94950 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 @@ public: 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!"); } |