[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