157d736fdSArgyrios Kyrtzidis //==- DebugCheckers.cpp - Debugging Checkers ---------------------*- C++ -*-==//
257d736fdSArgyrios Kyrtzidis //
357d736fdSArgyrios Kyrtzidis //                     The LLVM Compiler Infrastructure
457d736fdSArgyrios Kyrtzidis //
557d736fdSArgyrios Kyrtzidis // This file is distributed under the University of Illinois Open Source
657d736fdSArgyrios Kyrtzidis // License. See LICENSE.TXT for details.
757d736fdSArgyrios Kyrtzidis //
857d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
957d736fdSArgyrios Kyrtzidis //
1057d736fdSArgyrios Kyrtzidis //  This file defines a checkers that display debugging information.
1157d736fdSArgyrios Kyrtzidis //
1257d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
1357d736fdSArgyrios Kyrtzidis 
1457d736fdSArgyrios Kyrtzidis #include "ClangSACheckers.h"
156a5674ffSArgyrios Kyrtzidis #include "clang/StaticAnalyzer/Core/Checker.h"
1657d736fdSArgyrios Kyrtzidis #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
1757d736fdSArgyrios Kyrtzidis #include "clang/Analysis/Analyses/LiveVariables.h"
180062e749STed Kremenek #include "clang/Analysis/Analyses/Dominators.h"
19*72be32afSTed Kremenek #include "llvm/Support/Process.h"
2057d736fdSArgyrios Kyrtzidis 
2157d736fdSArgyrios Kyrtzidis using namespace clang;
2257d736fdSArgyrios Kyrtzidis using namespace ento;
2357d736fdSArgyrios Kyrtzidis 
2457d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
250062e749STed Kremenek // DominatorsTreeDumper
260062e749STed Kremenek //===----------------------------------------------------------------------===//
270062e749STed Kremenek 
280062e749STed Kremenek namespace {
290062e749STed Kremenek class DominatorsTreeDumper : public Checker<check::ASTCodeBody> {
300062e749STed Kremenek public:
310062e749STed Kremenek   void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
320062e749STed Kremenek                         BugReporter &BR) const {
330062e749STed Kremenek     if (AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D)) {
3402a1fc1dSAnna Zaks       DominatorTree dom;
3502a1fc1dSAnna Zaks       dom.buildDominatorTree(*AC);
360062e749STed Kremenek       dom.dump();
370062e749STed Kremenek     }
380062e749STed Kremenek   }
390062e749STed Kremenek };
400062e749STed Kremenek }
410062e749STed Kremenek 
420062e749STed Kremenek void ento::registerDominatorsTreeDumper(CheckerManager &mgr) {
430062e749STed Kremenek   mgr.registerChecker<DominatorsTreeDumper>();
440062e749STed Kremenek }
450062e749STed Kremenek 
460062e749STed Kremenek //===----------------------------------------------------------------------===//
4757d736fdSArgyrios Kyrtzidis // LiveVariablesDumper
4857d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
4957d736fdSArgyrios Kyrtzidis 
5057d736fdSArgyrios Kyrtzidis namespace {
516a5674ffSArgyrios Kyrtzidis class LiveVariablesDumper : public Checker<check::ASTCodeBody> {
5257d736fdSArgyrios Kyrtzidis public:
5357d736fdSArgyrios Kyrtzidis   void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
5457d736fdSArgyrios Kyrtzidis                         BugReporter &BR) const {
55dccc2b22STed Kremenek     if (LiveVariables* L = mgr.getAnalysis<LiveVariables>(D)) {
5657d736fdSArgyrios Kyrtzidis       L->dumpBlockLiveness(mgr.getSourceManager());
5757d736fdSArgyrios Kyrtzidis     }
5857d736fdSArgyrios Kyrtzidis   }
5957d736fdSArgyrios Kyrtzidis };
6057d736fdSArgyrios Kyrtzidis }
6157d736fdSArgyrios Kyrtzidis 
6257d736fdSArgyrios Kyrtzidis void ento::registerLiveVariablesDumper(CheckerManager &mgr) {
6357d736fdSArgyrios Kyrtzidis   mgr.registerChecker<LiveVariablesDumper>();
6457d736fdSArgyrios Kyrtzidis }
6557d736fdSArgyrios Kyrtzidis 
6657d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
6757d736fdSArgyrios Kyrtzidis // CFGViewer
6857d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
6957d736fdSArgyrios Kyrtzidis 
7057d736fdSArgyrios Kyrtzidis namespace {
716a5674ffSArgyrios Kyrtzidis class CFGViewer : public Checker<check::ASTCodeBody> {
7257d736fdSArgyrios Kyrtzidis public:
7357d736fdSArgyrios Kyrtzidis   void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
7457d736fdSArgyrios Kyrtzidis                         BugReporter &BR) const {
7557d736fdSArgyrios Kyrtzidis     if (CFG *cfg = mgr.getCFG(D)) {
7657d736fdSArgyrios Kyrtzidis       cfg->viewCFG(mgr.getLangOptions());
7757d736fdSArgyrios Kyrtzidis     }
7857d736fdSArgyrios Kyrtzidis   }
7957d736fdSArgyrios Kyrtzidis };
8057d736fdSArgyrios Kyrtzidis }
8157d736fdSArgyrios Kyrtzidis 
8257d736fdSArgyrios Kyrtzidis void ento::registerCFGViewer(CheckerManager &mgr) {
8357d736fdSArgyrios Kyrtzidis   mgr.registerChecker<CFGViewer>();
8457d736fdSArgyrios Kyrtzidis }
8557d736fdSArgyrios Kyrtzidis 
8657d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
8757d736fdSArgyrios Kyrtzidis // CFGDumper
8857d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
8957d736fdSArgyrios Kyrtzidis 
9057d736fdSArgyrios Kyrtzidis namespace {
916a5674ffSArgyrios Kyrtzidis class CFGDumper : public Checker<check::ASTCodeBody> {
9257d736fdSArgyrios Kyrtzidis public:
9357d736fdSArgyrios Kyrtzidis   void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
9457d736fdSArgyrios Kyrtzidis                         BugReporter &BR) const {
9557d736fdSArgyrios Kyrtzidis     if (CFG *cfg = mgr.getCFG(D)) {
96*72be32afSTed Kremenek       cfg->dump(mgr.getLangOptions(),
97*72be32afSTed Kremenek                 llvm::sys::Process::StandardErrHasColors());
9857d736fdSArgyrios Kyrtzidis     }
9957d736fdSArgyrios Kyrtzidis   }
10057d736fdSArgyrios Kyrtzidis };
10157d736fdSArgyrios Kyrtzidis }
10257d736fdSArgyrios Kyrtzidis 
10357d736fdSArgyrios Kyrtzidis void ento::registerCFGDumper(CheckerManager &mgr) {
10457d736fdSArgyrios Kyrtzidis   mgr.registerChecker<CFGDumper>();
10557d736fdSArgyrios Kyrtzidis }
106