summaryrefslogtreecommitdiffstats
path: root/clang/Driver/ASTConsumers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/Driver/ASTConsumers.cpp')
-rw-r--r--clang/Driver/ASTConsumers.cpp41
1 files changed, 28 insertions, 13 deletions
diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp
index 5868a28b70a..60246865e91 100644
--- a/clang/Driver/ASTConsumers.cpp
+++ b/clang/Driver/ASTConsumers.cpp
@@ -12,18 +12,20 @@
//===----------------------------------------------------------------------===//
#include "ASTConsumers.h"
+#include "HTMLDiagnostics.h"
#include "clang/AST/TranslationUnit.h"
-#include "clang/Basic/Diagnostic.h"
+#include "clang/Analysis/PathDiagnostic.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/FileManager.h"
#include "clang/AST/AST.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/CFG.h"
#include "clang/Analysis/Analyses/LiveVariables.h"
-#include "clang/Analysis/Analyses/GRSimpleVals.h"
#include "clang/Analysis/LocalCheckers.h"
#include "llvm/Support/Streams.h"
#include "llvm/Support/Timer.h"
+#include "llvm/ADT/OwningPtr.h"
+
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -630,12 +632,15 @@ namespace {
class GRSimpleValsVisitor : public CFGVisitor {
Diagnostic &Diags;
ASTContext* Ctx;
+ const std::string& HTMLDir;
bool Visualize;
bool TrimGraph;
public:
GRSimpleValsVisitor(Diagnostic &diags, const std::string& fname,
+ const std::string& htmldir,
bool visualize, bool trim)
- : CFGVisitor(fname), Diags(diags), Visualize(visualize), TrimGraph(trim){}
+ : CFGVisitor(fname), Diags(diags), HTMLDir(htmldir),
+ Visualize(visualize), TrimGraph(trim) {}
virtual void Initialize(ASTContext &Context) { Ctx = &Context; }
virtual void VisitCFG(CFG& C, Decl&);
@@ -645,9 +650,11 @@ namespace {
ASTConsumer* clang::CreateGRSimpleVals(Diagnostic &Diags,
const std::string& FunctionName,
+ const std::string& HTMLDir,
bool Visualize, bool TrimGraph) {
- return new GRSimpleValsVisitor(Diags, FunctionName, Visualize, TrimGraph);
+ return new GRSimpleValsVisitor(Diags, FunctionName, HTMLDir,
+ Visualize, TrimGraph);
}
void GRSimpleValsVisitor::VisitCFG(CFG& C, Decl& CD) {
@@ -678,16 +685,21 @@ void GRSimpleValsVisitor::VisitCFG(CFG& C, Decl& CD) {
#if 0
llvm::Timer T("GRSimpleVals");
T.startTimer();
- unsigned size = RunGRSimpleVals(C, CD, *Ctx, Diags, false, false);
+ unsigned size = RunGRSimpleVals(C, CD, *Ctx, Diags, NULL, false, false);
T.stopTimer();
llvm::cerr << size << ' ' << T.getWallTime() << '\n';
#else
- RunGRSimpleVals(C, CD, *Ctx, Diags, false, false);
+ llvm::OwningPtr<PathDiagnosticClient> PD;
+
+ if (!HTMLDir.empty())
+ PD.reset(CreateHTMLDiagnosticClient(HTMLDir));
+
+ RunGRSimpleVals(C, CD, *Ctx, Diags, PD.get(), false, false);
#endif
}
else {
llvm::cerr << '\n';
- RunGRSimpleVals(C, CD, *Ctx, Diags, Visualize, TrimGraph);
+ RunGRSimpleVals(C, CD, *Ctx, Diags, NULL, Visualize, TrimGraph);
}
}
@@ -699,10 +711,12 @@ namespace {
class CFRefCountCheckerVisitor : public CFGVisitor {
Diagnostic &Diags;
ASTContext* Ctx;
+ const std::string& HTMLDir;
public:
- CFRefCountCheckerVisitor(Diagnostic &diags, const std::string& fname)
- : CFGVisitor(fname), Diags(diags) {}
+ CFRefCountCheckerVisitor(Diagnostic &diags, const std::string& fname,
+ const std::string& htmldir)
+ : CFGVisitor(fname), Diags(diags), HTMLDir(htmldir) {}
virtual void Initialize(ASTContext &Context) { Ctx = &Context; }
virtual void VisitCFG(CFG& C, Decl&);
@@ -712,20 +726,21 @@ namespace {
ASTConsumer* clang::CreateCFRefChecker(Diagnostic &Diags,
- const std::string& FunctionName) {
+ const std::string& FunctionName,
+ const std::string& HTMLDir) {
- return new CFRefCountCheckerVisitor(Diags, FunctionName);
+ return new CFRefCountCheckerVisitor(Diags, FunctionName, HTMLDir);
}
void CFRefCountCheckerVisitor::VisitCFG(CFG& C, Decl& CD) {
-
+
SourceLocation Loc = CD.getLocation();
if (!Loc.isFileID() ||
Loc.getFileID() != Ctx->getSourceManager().getMainFileID())
return;
- CheckCFRefCount(C, CD, *Ctx, Diags);
+ CheckCFRefCount(C, CD, *Ctx, Diags, NULL);
}
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud