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