1ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//===--- TextPathDiagnostics.cpp - Text Diagnostics for Paths ---*- C++ -*-===// 2ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// 3ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 4ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// 5ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 6ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 7ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// 8ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 9ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// 10ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// This file defines the TextPathDiagnostics object. 11ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// 12ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 13ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 14f39d962cf84f46d2c0512157259ae1d41a1a5173David Blaikie#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" 159b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h" 16ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis#include "clang/Lex/Preprocessor.h" 17ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis#include "llvm/Support/raw_ostream.h" 18ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidisusing namespace clang; 199ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento; 20ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidisusing namespace llvm; 21ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 22ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidisnamespace { 23ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 24a599ae8826b01c0160a519b0fc5a4871f599bf04Argyrios Kyrtzidis/// \brief Simple path diagnostic client used for outputting as diagnostic notes 25ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis/// the sequence of events. 26ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikieclass TextPathDiagnostics : public PathDiagnosticConsumer { 27ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis const std::string OutputFile; 28d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diag; 29ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 30ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidispublic: 31d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie TextPathDiagnostics(const std::string& output, DiagnosticsEngine &diag) 32ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis : OutputFile(output), Diag(diag) {} 33ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 34bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags, 35bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek SmallVectorImpl<std::string> *FilesMade); 36ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner virtual StringRef getName() const { 38ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis return "TextPathDiagnostics"; 39ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis } 40ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 41774dfbb046c5087a3b82790833d0604bf4c3be6cArgyrios Kyrtzidis PathGenerationScheme getGenerationScheme() const { return Minimal; } 42ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis bool supportsLogicalOpControlFlow() const { return true; } 43ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis bool supportsAllBlockEdges() const { return true; } 44ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis virtual bool useVerboseDescription() const { return true; } 45ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis}; 46ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 47ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis} // end anonymous namespace 48ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 49ef3643fbbbf66247c5e205497fae0f46e240c143David BlaikiePathDiagnosticConsumer* 50ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikieento::createTextPathDiagnosticConsumer(const std::string& out, 519ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek const Preprocessor &PP) { 52ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis return new TextPathDiagnostics(out, PP.getDiagnostics()); 53ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis} 54ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis 55bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenekvoid TextPathDiagnostics::FlushDiagnosticsImpl( 56bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek std::vector<const PathDiagnostic *> &Diags, 57bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek SmallVectorImpl<std::string> *FilesMade) { 58bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek for (std::vector<const PathDiagnostic *>::iterator it = Diags.begin(), 59bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek et = Diags.end(); it != et; ++it) { 60bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek const PathDiagnostic *D = *it; 61802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek for (PathPieces::const_iterator I = D->path.begin(), E = D->path.end(); 62802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek I != E; ++I) { 63bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek unsigned diagID = 64bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek Diag.getDiagnosticIDs()->getCustomDiagID(DiagnosticIDs::Note, 65802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek (*I)->getString()); 66802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek Diag.Report((*I)->getLocation().asLocation(), diagID); 67bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek } 68ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis } 69ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis} 70