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