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"
15*6a5674ffSArgyrios Kyrtzidis #include "clang/StaticAnalyzer/Core/Checker.h"
1657d736fdSArgyrios Kyrtzidis #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
1757d736fdSArgyrios Kyrtzidis #include "clang/Analysis/Analyses/LiveVariables.h"
1857d736fdSArgyrios Kyrtzidis 
1957d736fdSArgyrios Kyrtzidis using namespace clang;
2057d736fdSArgyrios Kyrtzidis using namespace ento;
2157d736fdSArgyrios Kyrtzidis 
2257d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
2357d736fdSArgyrios Kyrtzidis // LiveVariablesDumper
2457d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
2557d736fdSArgyrios Kyrtzidis 
2657d736fdSArgyrios Kyrtzidis namespace {
27*6a5674ffSArgyrios Kyrtzidis class LiveVariablesDumper : public Checker<check::ASTCodeBody> {
2857d736fdSArgyrios Kyrtzidis public:
2957d736fdSArgyrios Kyrtzidis   void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
3057d736fdSArgyrios Kyrtzidis                         BugReporter &BR) const {
3157d736fdSArgyrios Kyrtzidis     if (LiveVariables* L = mgr.getLiveVariables(D)) {
3257d736fdSArgyrios Kyrtzidis       L->dumpBlockLiveness(mgr.getSourceManager());
3357d736fdSArgyrios Kyrtzidis     }
3457d736fdSArgyrios Kyrtzidis   }
3557d736fdSArgyrios Kyrtzidis };
3657d736fdSArgyrios Kyrtzidis }
3757d736fdSArgyrios Kyrtzidis 
3857d736fdSArgyrios Kyrtzidis void ento::registerLiveVariablesDumper(CheckerManager &mgr) {
3957d736fdSArgyrios Kyrtzidis   mgr.registerChecker<LiveVariablesDumper>();
4057d736fdSArgyrios Kyrtzidis }
4157d736fdSArgyrios Kyrtzidis 
4257d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
4357d736fdSArgyrios Kyrtzidis // CFGViewer
4457d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
4557d736fdSArgyrios Kyrtzidis 
4657d736fdSArgyrios Kyrtzidis namespace {
47*6a5674ffSArgyrios Kyrtzidis class CFGViewer : public Checker<check::ASTCodeBody> {
4857d736fdSArgyrios Kyrtzidis public:
4957d736fdSArgyrios Kyrtzidis   void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
5057d736fdSArgyrios Kyrtzidis                         BugReporter &BR) const {
5157d736fdSArgyrios Kyrtzidis     if (CFG *cfg = mgr.getCFG(D)) {
5257d736fdSArgyrios Kyrtzidis       cfg->viewCFG(mgr.getLangOptions());
5357d736fdSArgyrios Kyrtzidis     }
5457d736fdSArgyrios Kyrtzidis   }
5557d736fdSArgyrios Kyrtzidis };
5657d736fdSArgyrios Kyrtzidis }
5757d736fdSArgyrios Kyrtzidis 
5857d736fdSArgyrios Kyrtzidis void ento::registerCFGViewer(CheckerManager &mgr) {
5957d736fdSArgyrios Kyrtzidis   mgr.registerChecker<CFGViewer>();
6057d736fdSArgyrios Kyrtzidis }
6157d736fdSArgyrios Kyrtzidis 
6257d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
6357d736fdSArgyrios Kyrtzidis // CFGDumper
6457d736fdSArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
6557d736fdSArgyrios Kyrtzidis 
6657d736fdSArgyrios Kyrtzidis namespace {
67*6a5674ffSArgyrios Kyrtzidis class CFGDumper : public Checker<check::ASTCodeBody> {
6857d736fdSArgyrios Kyrtzidis public:
6957d736fdSArgyrios Kyrtzidis   void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
7057d736fdSArgyrios Kyrtzidis                         BugReporter &BR) const {
7157d736fdSArgyrios Kyrtzidis     if (CFG *cfg = mgr.getCFG(D)) {
7257d736fdSArgyrios Kyrtzidis       cfg->dump(mgr.getLangOptions());
7357d736fdSArgyrios Kyrtzidis     }
7457d736fdSArgyrios Kyrtzidis   }
7557d736fdSArgyrios Kyrtzidis };
7657d736fdSArgyrios Kyrtzidis }
7757d736fdSArgyrios Kyrtzidis 
7857d736fdSArgyrios Kyrtzidis void ento::registerCFGDumper(CheckerManager &mgr) {
7957d736fdSArgyrios Kyrtzidis   mgr.registerChecker<CFGDumper>();
8057d736fdSArgyrios Kyrtzidis }
81