[cfe-commits] r50102 - in /cfe/trunk: Driver/HTMLDiagnostics.cpp include/clang/Analysis/PathDiagnostic.h lib/Analysis/BugReporter.cpp lib/Analysis/PathDiagnostic.cpp
Ted Kremenek
kremenek at apple.com
Tue Apr 22 09:15:03 PDT 2008
Author: kremenek
Date: Tue Apr 22 11:15:03 2008
New Revision: 50102
URL: http://llvm.org/viewvc/llvm-project?rev=50102&view=rev
Log:
PathDiagnosticClients now retain ownership of passed PathDiagnostics, requiring
them to not be stack-allocated.
HTMLDiagnostics now batches PathDiagnostics before emitting HTML in its dtor.
This is a workaround for a problem when we trampled the Preprocessor state
when highlighting macros (sometimes resulting in an assertion failure).
Modified:
cfe/trunk/Driver/HTMLDiagnostics.cpp
cfe/trunk/include/clang/Analysis/PathDiagnostic.h
cfe/trunk/lib/Analysis/BugReporter.cpp
cfe/trunk/lib/Analysis/PathDiagnostic.cpp
Modified: cfe/trunk/Driver/HTMLDiagnostics.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/HTMLDiagnostics.cpp?rev=50102&r1=50101&r2=50102&view=diff
==============================================================================
--- cfe/trunk/Driver/HTMLDiagnostics.cpp (original)
+++ cfe/trunk/Driver/HTMLDiagnostics.cpp Tue Apr 22 11:15:03 2008
@@ -39,18 +39,21 @@
bool createdDir, noDir;
Preprocessor* PP;
PreprocessorFactory* PPF;
+ std::vector<const PathDiagnostic*> BatchedDiags;
public:
HTMLDiagnostics(const std::string& prefix, Preprocessor* pp,
PreprocessorFactory* ppf);
- virtual ~HTMLDiagnostics() {}
+ virtual ~HTMLDiagnostics();
- virtual void HandlePathDiagnostic(const PathDiagnostic& D);
+ virtual void HandlePathDiagnostic(const PathDiagnostic* D);
void HandlePiece(Rewriter& R, const PathDiagnosticPiece& P,
unsigned num, unsigned max);
void HighlightRange(Rewriter& R, SourceRange Range);
+
+ void ReportDiag(const PathDiagnostic& D);
};
} // end anonymous namespace
@@ -75,10 +78,29 @@
// Report processing.
//===----------------------------------------------------------------------===//
-void HTMLDiagnostics::HandlePathDiagnostic(const PathDiagnostic& D) {
-
- if (D.empty())
+void HTMLDiagnostics::HandlePathDiagnostic(const PathDiagnostic* D) {
+ if (!D)
+ return;
+
+ if (D->empty()) {
+ delete D;
return;
+ }
+
+ BatchedDiags.push_back(D);
+}
+
+HTMLDiagnostics::~HTMLDiagnostics() {
+
+ while (!BatchedDiags.empty()) {
+ const PathDiagnostic* D = BatchedDiags.back();
+ BatchedDiags.pop_back();
+ ReportDiag(*D);
+ delete D;
+ }
+}
+
+void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D) {
// Create the HTML directory if it is missing.
@@ -127,7 +149,13 @@
// for example.
if (PP) html::SyntaxHighlight(R, FileID, *PP);
- if (PPF) html::HighlightMacros(R, FileID, *PPF);
+
+ // FIXME: We eventually want to use PPF to create a fresh Preprocessor,
+ // once we have worked out the bugs.
+ //
+ // if (PPF) html::HighlightMacros(R, FileID, *PPF);
+ //
+ if (PP) html::HighlightMacros(R, FileID, *PP);
// Get the full directory name of the analyzed file.
Modified: cfe/trunk/include/clang/Analysis/PathDiagnostic.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathDiagnostic.h?rev=50102&r1=50101&r2=50102&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathDiagnostic.h (original)
+++ cfe/trunk/include/clang/Analysis/PathDiagnostic.h Tue Apr 22 11:15:03 2008
@@ -181,7 +181,7 @@
const SourceRange *Ranges,
unsigned NumRanges);
- virtual void HandlePathDiagnostic(const PathDiagnostic& D) = 0;
+ virtual void HandlePathDiagnostic(const PathDiagnostic* D) = 0;
};
} //end clang namespace
Modified: cfe/trunk/lib/Analysis/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BugReporter.cpp?rev=50102&r1=50101&r2=50102&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BugReporter.cpp (original)
+++ cfe/trunk/lib/Analysis/BugReporter.cpp Tue Apr 22 11:15:03 2008
@@ -382,52 +382,51 @@
if (R.getBugType().isCached(R))
return;
- PathDiagnostic D(R.getName());
- GeneratePathDiagnostic(D, R);
+ llvm::OwningPtr<PathDiagnostic> D(new PathDiagnostic(R.getName()));
+ GeneratePathDiagnostic(*D.get(), R);
// Emit a full diagnostic for the path if we have a PathDiagnosticClient.
- if (PD && !D.empty()) {
- PD->HandlePathDiagnostic(D);
+ if (PD && !D->empty()) {
+ PD->HandlePathDiagnostic(D.take());
return;
}
// We don't have a PathDiagnosticClient, but we can still emit a single
// line diagnostic. Determine the location.
- FullSourceLoc L = D.empty() ? R.getLocation(Ctx.getSourceManager())
- : D.back()->getLocation();
+ FullSourceLoc L = D->empty() ? R.getLocation(Ctx.getSourceManager())
+ : D->back()->getLocation();
// Determine the range.
const SourceRange *Beg, *End;
- if (!D.empty()) {
- Beg = D.back()->ranges_begin();
- End = D.back()->ranges_end();
+ if (!D->empty()) {
+ Beg = D->back()->ranges_begin();
+ End = D->back()->ranges_end();
}
else
R.getRanges(Beg, End);
if (PD) {
- PathDiagnostic D(R.getName());
PathDiagnosticPiece* piece = new PathDiagnosticPiece(L, R.getDescription());
for ( ; Beg != End; ++Beg)
piece->addRange(*Beg);
- D.push_back(piece);
- PD->HandlePathDiagnostic(D);
+ D->push_back(piece);
+ PD->HandlePathDiagnostic(D.take());
}
else {
std::ostringstream os;
os << "[CHECKER] ";
- if (D.empty())
+ if (D->empty())
os << R.getDescription();
else
- os << D.back()->getString();
+ os << D->back()->getString();
unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
Modified: cfe/trunk/lib/Analysis/PathDiagnostic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PathDiagnostic.cpp?rev=50102&r1=50101&r2=50102&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/PathDiagnostic.cpp (original)
+++ cfe/trunk/lib/Analysis/PathDiagnostic.cpp Tue Apr 22 11:15:03 2008
@@ -31,7 +31,7 @@
// Create a PathDiagnostic with a single piece.
- PathDiagnostic D;
+ PathDiagnostic* D = new PathDiagnostic();
// Ripped from TextDiagnostics::FormatDiagnostic. Perhaps we should
// centralize it somewhere?
@@ -68,7 +68,7 @@
++Ranges;
}
- D.push_front(P);
+ D->push_front(P);
HandlePathDiagnostic(D);
}
More information about the cfe-commits
mailing list