1*57d736fdSArgyrios Kyrtzidis //==- DebugCheckers.cpp - Debugging Checkers ---------------------*- C++ -*-==// 2*57d736fdSArgyrios Kyrtzidis // 3*57d736fdSArgyrios Kyrtzidis // The LLVM Compiler Infrastructure 4*57d736fdSArgyrios Kyrtzidis // 5*57d736fdSArgyrios Kyrtzidis // This file is distributed under the University of Illinois Open Source 6*57d736fdSArgyrios Kyrtzidis // License. See LICENSE.TXT for details. 7*57d736fdSArgyrios Kyrtzidis // 8*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 9*57d736fdSArgyrios Kyrtzidis // 10*57d736fdSArgyrios Kyrtzidis // This file defines a checkers that display debugging information. 11*57d736fdSArgyrios Kyrtzidis // 12*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 13*57d736fdSArgyrios Kyrtzidis 14*57d736fdSArgyrios Kyrtzidis #include "ClangSACheckers.h" 15*57d736fdSArgyrios Kyrtzidis #include "clang/StaticAnalyzer/Core/CheckerV2.h" 16*57d736fdSArgyrios Kyrtzidis #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" 17*57d736fdSArgyrios Kyrtzidis #include "clang/Analysis/Analyses/LiveVariables.h" 18*57d736fdSArgyrios Kyrtzidis 19*57d736fdSArgyrios Kyrtzidis using namespace clang; 20*57d736fdSArgyrios Kyrtzidis using namespace ento; 21*57d736fdSArgyrios Kyrtzidis 22*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 23*57d736fdSArgyrios Kyrtzidis // LiveVariablesDumper 24*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 25*57d736fdSArgyrios Kyrtzidis 26*57d736fdSArgyrios Kyrtzidis namespace { 27*57d736fdSArgyrios Kyrtzidis class LiveVariablesDumper : public CheckerV2<check::ASTCodeBody> { 28*57d736fdSArgyrios Kyrtzidis public: 29*57d736fdSArgyrios Kyrtzidis void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, 30*57d736fdSArgyrios Kyrtzidis BugReporter &BR) const { 31*57d736fdSArgyrios Kyrtzidis if (LiveVariables* L = mgr.getLiveVariables(D)) { 32*57d736fdSArgyrios Kyrtzidis L->dumpBlockLiveness(mgr.getSourceManager()); 33*57d736fdSArgyrios Kyrtzidis } 34*57d736fdSArgyrios Kyrtzidis } 35*57d736fdSArgyrios Kyrtzidis }; 36*57d736fdSArgyrios Kyrtzidis } 37*57d736fdSArgyrios Kyrtzidis 38*57d736fdSArgyrios Kyrtzidis void ento::registerLiveVariablesDumper(CheckerManager &mgr) { 39*57d736fdSArgyrios Kyrtzidis mgr.registerChecker<LiveVariablesDumper>(); 40*57d736fdSArgyrios Kyrtzidis } 41*57d736fdSArgyrios Kyrtzidis 42*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 43*57d736fdSArgyrios Kyrtzidis // CFGViewer 44*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 45*57d736fdSArgyrios Kyrtzidis 46*57d736fdSArgyrios Kyrtzidis namespace { 47*57d736fdSArgyrios Kyrtzidis class CFGViewer : public CheckerV2<check::ASTCodeBody> { 48*57d736fdSArgyrios Kyrtzidis public: 49*57d736fdSArgyrios Kyrtzidis void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, 50*57d736fdSArgyrios Kyrtzidis BugReporter &BR) const { 51*57d736fdSArgyrios Kyrtzidis if (CFG *cfg = mgr.getCFG(D)) { 52*57d736fdSArgyrios Kyrtzidis cfg->viewCFG(mgr.getLangOptions()); 53*57d736fdSArgyrios Kyrtzidis } 54*57d736fdSArgyrios Kyrtzidis } 55*57d736fdSArgyrios Kyrtzidis }; 56*57d736fdSArgyrios Kyrtzidis } 57*57d736fdSArgyrios Kyrtzidis 58*57d736fdSArgyrios Kyrtzidis void ento::registerCFGViewer(CheckerManager &mgr) { 59*57d736fdSArgyrios Kyrtzidis mgr.registerChecker<CFGViewer>(); 60*57d736fdSArgyrios Kyrtzidis } 61*57d736fdSArgyrios Kyrtzidis 62*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 63*57d736fdSArgyrios Kyrtzidis // CFGDumper 64*57d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 65*57d736fdSArgyrios Kyrtzidis 66*57d736fdSArgyrios Kyrtzidis namespace { 67*57d736fdSArgyrios Kyrtzidis class CFGDumper : public CheckerV2<check::ASTCodeBody> { 68*57d736fdSArgyrios Kyrtzidis public: 69*57d736fdSArgyrios Kyrtzidis void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, 70*57d736fdSArgyrios Kyrtzidis BugReporter &BR) const { 71*57d736fdSArgyrios Kyrtzidis if (CFG *cfg = mgr.getCFG(D)) { 72*57d736fdSArgyrios Kyrtzidis cfg->dump(mgr.getLangOptions()); 73*57d736fdSArgyrios Kyrtzidis } 74*57d736fdSArgyrios Kyrtzidis } 75*57d736fdSArgyrios Kyrtzidis }; 76*57d736fdSArgyrios Kyrtzidis } 77*57d736fdSArgyrios Kyrtzidis 78*57d736fdSArgyrios Kyrtzidis void ento::registerCFGDumper(CheckerManager &mgr) { 79*57d736fdSArgyrios Kyrtzidis mgr.registerChecker<CFGDumper>(); 80*57d736fdSArgyrios Kyrtzidis } 81