DebugCheckers.cpp revision ec8605f1d7ec846dbf51047bfd5c56d32d1ff91c
12d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//==- DebugCheckers.cpp - Debugging Checkers ---------------------*- C++ -*-==// 22d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// 32d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 42d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// 52d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 62d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 72d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// 82d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 92d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// 102d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// This file defines a checkers that display debugging information. 112d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// 122d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 132d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 142d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis#include "ClangSACheckers.h" 15ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/Checker.h" 162d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" 172d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis#include "clang/Analysis/Analyses/LiveVariables.h" 182d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 192d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisusing namespace clang; 202d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisusing namespace ento; 212d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 222d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 232d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// LiveVariablesDumper 242d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 252d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 262d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisnamespace { 27ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass LiveVariablesDumper : public Checker<check::ASTCodeBody> { 282d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidispublic: 292d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, 302d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis BugReporter &BR) const { 312d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis if (LiveVariables* L = mgr.getLiveVariables(D)) { 322d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis L->dumpBlockLiveness(mgr.getSourceManager()); 332d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis } 342d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis } 352d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}; 362d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis} 372d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 382d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisvoid ento::registerLiveVariablesDumper(CheckerManager &mgr) { 392d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis mgr.registerChecker<LiveVariablesDumper>(); 402d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis} 412d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 422d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 432d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// CFGViewer 442d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 452d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 462d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisnamespace { 47ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass CFGViewer : public Checker<check::ASTCodeBody> { 482d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidispublic: 492d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, 502d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis BugReporter &BR) const { 512d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis if (CFG *cfg = mgr.getCFG(D)) { 522d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis cfg->viewCFG(mgr.getLangOptions()); 532d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis } 542d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis } 552d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}; 562d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis} 572d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 582d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisvoid ento::registerCFGViewer(CheckerManager &mgr) { 592d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis mgr.registerChecker<CFGViewer>(); 602d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis} 612d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 622d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 632d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis// CFGDumper 642d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 652d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 662d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisnamespace { 67ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass CFGDumper : public Checker<check::ASTCodeBody> { 682d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidispublic: 692d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, 702d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis BugReporter &BR) const { 712d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis if (CFG *cfg = mgr.getCFG(D)) { 722d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis cfg->dump(mgr.getLangOptions()); 732d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis } 742d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis } 752d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis}; 762d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis} 772d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis 782d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidisvoid ento::registerCFGDumper(CheckerManager &mgr) { 792d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis mgr.registerChecker<CFGDumper>(); 802d67b90a21c9c1093e6598809c2cbc832919cfe6Argyrios Kyrtzidis} 81