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