diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-10-05 23:27:24 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-10-05 23:27:24 +0000 |
commit | 48569ed9223bf60aabcd7605bb54d8ba8999e7be (patch) | |
tree | a3ae6126cd14be244952fa3067ce7d7f07fbc3cc | |
parent | 13043a4b894de73a5fc3e9a79ef17bbadb677ab0 (diff) |
Removed DataflowStmtVisitor. It is no longer used, and is obsoleted
by newer visitor interfaces.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42662 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Analysis/Visitors/DataflowStmtVisitor.h | 130 |
1 files changed, 0 insertions, 130 deletions
diff --git a/include/clang/Analysis/Visitors/DataflowStmtVisitor.h b/include/clang/Analysis/Visitors/DataflowStmtVisitor.h deleted file mode 100644 index b6bf754512..0000000000 --- a/include/clang/Analysis/Visitors/DataflowStmtVisitor.h +++ /dev/null @@ -1,130 +0,0 @@ -//===--- DataFlowStmtVisitor.h - StmtVisitor for Dataflow -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file was developed by Ted Kremenek and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines the DataflowStmtVisitor interface, which extends -// CFGStmtVisitor. This interface is useful for visiting statements in a CFG -// with the understanding that statements are walked in order of the analysis -// traversal. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_ANALYSIS_DATAFLOW_STMTVISITOR_H -#define LLVM_CLANG_ANALYSIS_DATAFLOW_STMTVISITOR_H - -#include "clang/Analysis/Visitors/CFGStmtVisitor.h" - -namespace clang { - -// Tag classes describing what direction the dataflow analysis goes. -namespace dataflow { - struct forward_analysis_tag {}; - struct backward_analysis_tag {}; -} - -template < typename ImplClass, - typename AnalysisTag=dataflow::forward_analysis_tag > -class DataflowStmtVisitor : public CFGStmtVisitor<ImplClass,void> { -public: - //===--------------------------------------------------------------------===// - // Observer methods. These are called before a statement is visited, and - // there is no special dispatch on statement type. This allows subclasses - // to inject extra functionality (e.g. monitoring) that applies to all - // visited statements. - //===--------------------------------------------------------------------===// - - void ObserveStmt(Stmt* S) {} - - void ObserveBlockStmt(Stmt* S) { - static_cast<ImplClass*>(this)->ObserveStmt(S); - } - - //===--------------------------------------------------------------------===// - // Statment visitor methods. These modify the behavior of CFGVisitor::Visit - // and CFGVisitor::BlockStmt_Visit by performing a traversal of substatements - // depending on the direction of the dataflow analysis. For forward - // analyses, the traversal is postorder (representing evaluation order) - // and for backward analysis it is preorder (reverse-evaluation order). - //===--------------------------------------------------------------------===// - - void BlockStmt_Visit(Stmt* S) { BlockStmt_Visit(S,AnalysisTag()); } - - void BlockStmt_Visit(Stmt* S, dataflow::forward_analysis_tag) { - // Process statements in a postorder traversal of the AST. - if (!CFG::hasImplicitControlFlow(S) || - S->getStmtClass() == Stmt::CallExprClass) - static_cast<ImplClass*>(this)->VisitChildren(S); - - static_cast<ImplClass*>(this)->ObserveBlockStmt(S); - static_cast<CFGStmtVisitor<ImplClass,void>*>(this)->BlockStmt_Visit(S); - } - - void BlockStmt_Visit(Stmt* S, dataflow::backward_analysis_tag) { - // Process statements in a preorder traversal of the AST. - static_cast<ImplClass*>(this)->ObserveBlockStmt(S); - static_cast<CFGStmtVisitor<ImplClass,void>*>(this)->BlockStmt_Visit(S); - - if (!CFG::hasImplicitControlFlow(S) || - S->getStmtClass() == Stmt::CallExprClass) - static_cast<ImplClass*>(this)->VisitChildren(S); - } - - void Visit(Stmt* S) { Visit(S,AnalysisTag()); } - - void Visit(Stmt* S, dataflow::forward_analysis_tag) { - if (CFG::hasImplicitControlFlow(S)) - return; - - // Process statements in a postorder traversal of the AST. - static_cast<ImplClass*>(this)->VisitChildren(S); - static_cast<ImplClass*>(this)->ObserveStmt(S); - static_cast<CFGStmtVisitor<ImplClass,void>*>(this)->Visit(S); - } - - void Visit(Stmt* S, dataflow::backward_analysis_tag) { - if (CFG::hasImplicitControlFlow(S)) - return; - - // Process statements in a preorder traversal of the AST. - static_cast<ImplClass*>(this)->ObserveStmt(S); - static_cast<CFGStmtVisitor<ImplClass,void>*>(this)->Visit(S); - static_cast<ImplClass*>(this)->VisitChildren(S); - } - - //===--------------------------------------------------------------------===// - // Methods for visiting entire CFGBlocks. - //===--------------------------------------------------------------------===// - - void VisitBlockEntry(const CFGBlock* B) {} - void VisitBlockExit(const CFGBlock* B) {} - - void VisitBlock(const CFGBlock* B) { VisitBlock(B,AnalysisTag()); } - - void VisitBlock(const CFGBlock* B, dataflow::forward_analysis_tag ) { - static_cast<ImplClass*>(this)->VisitBlockEntry(B); - - for (CFGBlock::const_iterator I=B->begin(), E=B->end(); I!=E; ++I) - static_cast<ImplClass*>(this)->BlockStmt_Visit(const_cast<Stmt*>(*I)); - - static_cast<ImplClass*>(this)->VisitBlockExit(B); - } - - void VisitBlock(const CFGBlock* B, dataflow::backward_analysis_tag ) { - static_cast<ImplClass*>(this)->VisitBlockExit(B); - - for (CFGBlock::const_reverse_iterator I=B->rbegin(), E=B->rend(); I!=E; ++I) - static_cast<ImplClass*>(this)->BlockStmt_Visit(const_cast<Stmt*>(*I)); - - static_cast<ImplClass*>(this)->VisitBlockEntry(B); - } - -}; - -} // end namespace clang - -#endif |