DebugCheckers.cpp revision 249423
138032Speter//==- DebugCheckers.cpp - Debugging Checkers ---------------------*- C++ -*-==//
273188Sgshapiro//
364562Sgshapiro//                     The LLVM Compiler Infrastructure
438032Speter//
538032Speter// This file is distributed under the University of Illinois Open Source
638032Speter// License. See LICENSE.TXT for details.
738032Speter//
838032Speter//===----------------------------------------------------------------------===//
938032Speter//
1038032Speter//  This file defines a checkers that display debugging information.
1138032Speter//
1238032Speter//===----------------------------------------------------------------------===//
1338032Speter
1438032Speter#include "ClangSACheckers.h"
1582017Sgshapiro#include "clang/Analysis/Analyses/Dominators.h"
1664562Sgshapiro#include "clang/Analysis/Analyses/LiveVariables.h"
1738032Speter#include "clang/Analysis/CallGraph.h"
1864562Sgshapiro#include "clang/StaticAnalyzer/Core/Checker.h"
1938032Speter#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
2064562Sgshapiro#include "llvm/Support/Process.h"
2164562Sgshapiro
2264562Sgshapirousing namespace clang;
2364562Sgshapirousing namespace ento;
2464562Sgshapiro
2564562Sgshapiro//===----------------------------------------------------------------------===//
2664562Sgshapiro// DominatorsTreeDumper
2764562Sgshapiro//===----------------------------------------------------------------------===//
2864562Sgshapiro
2964562Sgshapironamespace {
3064562Sgshapiroclass DominatorsTreeDumper : public Checker<check::ASTCodeBody> {
3164562Sgshapiropublic:
3264562Sgshapiro  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
3364562Sgshapiro                        BugReporter &BR) const {
3464562Sgshapiro    if (AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D)) {
3538032Speter      DominatorTree dom;
3638032Speter      dom.buildDominatorTree(*AC);
3738032Speter      dom.dump();
3838032Speter    }
3938032Speter  }
4038032Speter};
4138032Speter}
4238032Speter
4338032Spetervoid ento::registerDominatorsTreeDumper(CheckerManager &mgr) {
4438032Speter  mgr.registerChecker<DominatorsTreeDumper>();
4538032Speter}
4638032Speter
4738032Speter//===----------------------------------------------------------------------===//
4838032Speter// LiveVariablesDumper
4938032Speter//===----------------------------------------------------------------------===//
5038032Speter
5138032Speternamespace {
5238032Speterclass LiveVariablesDumper : public Checker<check::ASTCodeBody> {
5338032Speterpublic:
5438032Speter  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
5538032Speter                        BugReporter &BR) const {
5638032Speter    if (LiveVariables* L = mgr.getAnalysis<LiveVariables>(D)) {
5738032Speter      L->dumpBlockLiveness(mgr.getSourceManager());
5838032Speter    }
5938032Speter  }
6038032Speter};
6138032Speter}
6238032Speter
6338032Spetervoid ento::registerLiveVariablesDumper(CheckerManager &mgr) {
6438032Speter  mgr.registerChecker<LiveVariablesDumper>();
6538032Speter}
6638032Speter
6738032Speter//===----------------------------------------------------------------------===//
6838032Speter// CFGViewer
6938032Speter//===----------------------------------------------------------------------===//
7038032Speter
7138032Speternamespace {
7238032Speterclass CFGViewer : public Checker<check::ASTCodeBody> {
7338032Speterpublic:
7438032Speter  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
7538032Speter                        BugReporter &BR) const {
7638032Speter    if (CFG *cfg = mgr.getCFG(D)) {
7738032Speter      cfg->viewCFG(mgr.getLangOpts());
7838032Speter    }
7938032Speter  }
8038032Speter};
8138032Speter}
8238032Speter
8338032Spetervoid ento::registerCFGViewer(CheckerManager &mgr) {
8438032Speter  mgr.registerChecker<CFGViewer>();
8538032Speter}
8638032Speter
8738032Speter//===----------------------------------------------------------------------===//
8838032Speter// CFGDumper
8964562Sgshapiro//===----------------------------------------------------------------------===//
9038032Speter
9138032Speternamespace {
9238032Speterclass CFGDumper : public Checker<check::ASTCodeBody> {
9338032Speterpublic:
9438032Speter  void checkASTCodeBody(const Decl *D, AnalysisManager& mgr,
9538032Speter                        BugReporter &BR) const {
9638032Speter    if (CFG *cfg = mgr.getCFG(D)) {
9738032Speter      cfg->dump(mgr.getLangOpts(),
9838032Speter                llvm::sys::Process::StandardErrHasColors());
9964562Sgshapiro    }
10038032Speter  }
10138032Speter};
10238032Speter}
10338032Speter
10438032Spetervoid ento::registerCFGDumper(CheckerManager &mgr) {
10564562Sgshapiro  mgr.registerChecker<CFGDumper>();
10638032Speter}
10738032Speter
10838032Speter//===----------------------------------------------------------------------===//
10938032Speter// CallGraphViewer
11038032Speter//===----------------------------------------------------------------------===//
11138032Speter
11238032Speternamespace {
11338032Speterclass CallGraphViewer : public Checker< check::ASTDecl<TranslationUnitDecl> > {
11438032Speterpublic:
11538032Speter  void checkASTDecl(const TranslationUnitDecl *TU, AnalysisManager& mgr,
11642575Speter                    BugReporter &BR) const {
11738032Speter    CallGraph CG;
11838032Speter    CG.addToCallGraph(const_cast<TranslationUnitDecl*>(TU));
11938032Speter    CG.viewGraph();
12038032Speter  }
12138032Speter};
12242575Speter}
12338032Speter
12438032Spetervoid ento::registerCallGraphViewer(CheckerManager &mgr) {
12538032Speter  mgr.registerChecker<CallGraphViewer>();
12638032Speter}
12738032Speter
12842575Speter//===----------------------------------------------------------------------===//
12938032Speter// CallGraphDumper
13038032Speter//===----------------------------------------------------------------------===//
13138032Speter
13238032Speternamespace {
13338032Speterclass CallGraphDumper : public Checker< check::ASTDecl<TranslationUnitDecl> > {
13438032Speterpublic:
13538032Speter  void checkASTDecl(const TranslationUnitDecl *TU, AnalysisManager& mgr,
13638032Speter                    BugReporter &BR) const {
13738032Speter    CallGraph CG;
13864562Sgshapiro    CG.addToCallGraph(const_cast<TranslationUnitDecl*>(TU));
13964562Sgshapiro    CG.dump();
14038032Speter  }
14138032Speter};
14238032Speter}
14338032Speter
14464562Sgshapirovoid ento::registerCallGraphDumper(CheckerManager &mgr) {
14538032Speter  mgr.registerChecker<CallGraphDumper>();
14638032Speter}
14738032Speter
14838032Speter
14938032Speter//===----------------------------------------------------------------------===//
15038032Speter// ConfigDumper
15177349Sgshapiro//===----------------------------------------------------------------------===//
15238032Speter
15338032Speternamespace {
15438032Speterclass ConfigDumper : public Checker< check::EndOfTranslationUnit > {
15538032Speterpublic:
15638032Speter  void checkEndOfTranslationUnit(const TranslationUnitDecl *TU,
15738032Speter                                 AnalysisManager& mgr,
15838032Speter                                 BugReporter &BR) const {
15938032Speter
16038032Speter    const AnalyzerOptions::ConfigTable &Config = mgr.options.Config;
16138032Speter    AnalyzerOptions::ConfigTable::const_iterator I =
16238032Speter      Config.begin(), E = Config.end();
16338032Speter
16438032Speter    std::vector<StringRef> Keys;
16538032Speter    for (; I != E ; ++I) { Keys.push_back(I->getKey()); }
16638032Speter    sort(Keys.begin(), Keys.end());
16764562Sgshapiro
16864562Sgshapiro    llvm::errs() << "[config]\n";
16964562Sgshapiro    for (unsigned i = 0, n = Keys.size(); i < n ; ++i) {
17064562Sgshapiro      StringRef Key = Keys[i];
17164562Sgshapiro      I = Config.find(Key);
17238032Speter      llvm::errs() << Key << " = " << I->second << '\n';
17338032Speter    }
17438032Speter    llvm::errs() << "[stats]\n" << "num-entries = " << Keys.size() << '\n';
17538032Speter  }
17638032Speter};
17738032Speter}
17838032Speter
17938032Spetervoid ento::registerConfigDumper(CheckerManager &mgr) {
18038032Speter  mgr.registerChecker<ConfigDumper>();
18138032Speter}
18238032Speter