aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2021-01-07 19:23:43 -0800
committerArtem Dergachev <artem.dergachev@gmail.com>2021-01-07 20:22:22 -0800
commit6b0ee02747ed22d41e175d15f27025183341e6f8 (patch)
tree45c1e33f7f171b603d1709b4cf692bea509b5a4d /clang/lib
parent2ff36e79291486b489ae26418daa1b123473b405 (diff)
downloadllvm-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.txt7
-rw-r--r--clang/lib/Analysis/HTMLPathDiagnosticConsumer.cpp (renamed from clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp)111
-rw-r--r--clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp35
-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.cpp13
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp2
-rw-r--r--clang/lib/StaticAnalyzer/Core/CMakeLists.txt4
-rw-r--r--clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp4
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!");
}