00001 //===-- ExprVisitor.h -------------------------------------------*- C++ -*-===// 00002 // 00003 // The KLEE Symbolic Virtual Machine 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 00010 #ifndef KLEE_EXPRVISITOR_H 00011 #define KLEE_EXPRVISITOR_H 00012 00013 #include "ExprHashMap.h" 00014 00015 namespace klee { 00016 class ExprVisitor { 00017 protected: 00018 // typed variant, but non-virtual for efficiency 00019 class Action { 00020 public: 00021 enum Kind { SkipChildren, DoChildren, ChangeTo }; 00022 00023 private: 00024 // Action() {} 00025 Action(Kind _kind) 00026 : kind(_kind), argument(ConstantExpr::alloc(0, Expr::Bool)) {} 00027 Action(Kind _kind, const ref<Expr> &_argument) 00028 : kind(_kind), argument(_argument) {} 00029 00030 friend class ExprVisitor; 00031 00032 public: 00033 Kind kind; 00034 ref<Expr> argument; 00035 00036 static Action changeTo(const ref<Expr> &expr) { 00037 return Action(ChangeTo,expr); 00038 } 00039 static Action doChildren() { return Action(DoChildren); } 00040 static Action skipChildren() { return Action(SkipChildren); } 00041 }; 00042 00043 protected: 00044 explicit 00045 ExprVisitor(bool _recursive=false) : recursive(_recursive) {} 00046 virtual ~ExprVisitor() {} 00047 00048 virtual Action visitExpr(const Expr&); 00049 virtual Action visitExprPost(const Expr&); 00050 00051 virtual Action visitNotOptimized(const NotOptimizedExpr&); 00052 virtual Action visitRead(const ReadExpr&); 00053 virtual Action visitSelect(const SelectExpr&); 00054 virtual Action visitConcat(const ConcatExpr&); 00055 virtual Action visitExtract(const ExtractExpr&); 00056 virtual Action visitZExt(const ZExtExpr&); 00057 virtual Action visitSExt(const SExtExpr&); 00058 virtual Action visitAdd(const AddExpr&); 00059 virtual Action visitSub(const SubExpr&); 00060 virtual Action visitMul(const MulExpr&); 00061 virtual Action visitUDiv(const UDivExpr&); 00062 virtual Action visitSDiv(const SDivExpr&); 00063 virtual Action visitURem(const URemExpr&); 00064 virtual Action visitSRem(const SRemExpr&); 00065 virtual Action visitAnd(const AndExpr&); 00066 virtual Action visitOr(const OrExpr&); 00067 virtual Action visitXor(const XorExpr&); 00068 virtual Action visitShl(const ShlExpr&); 00069 virtual Action visitLShr(const LShrExpr&); 00070 virtual Action visitAShr(const AShrExpr&); 00071 virtual Action visitEq(const EqExpr&); 00072 virtual Action visitNe(const NeExpr&); 00073 virtual Action visitUlt(const UltExpr&); 00074 virtual Action visitUle(const UleExpr&); 00075 virtual Action visitUgt(const UgtExpr&); 00076 virtual Action visitUge(const UgeExpr&); 00077 virtual Action visitSlt(const SltExpr&); 00078 virtual Action visitSle(const SleExpr&); 00079 virtual Action visitSgt(const SgtExpr&); 00080 virtual Action visitSge(const SgeExpr&); 00081 00082 private: 00083 typedef ExprHashMap< ref<Expr> > visited_ty; 00084 visited_ty visited; 00085 bool recursive; 00086 00087 ref<Expr> visitActual(const ref<Expr> &e); 00088 00089 public: 00090 // apply the visitor to the expression and return a possibly 00091 // modified new expression. 00092 ref<Expr> visit(const ref<Expr> &e); 00093 }; 00094 00095 } 00096 00097 #endif
1.5.8