Add new indirect control flow analysis code. The code is still using ParseAPI level...
[dyninst.git] / parseAPI / src / IndirectASTVisitor.h
1 #ifndef INDIRECT_AST_VISITOR_H
2 #define INDIRECT_AST_VISITOR_H
3
4 #include <set>
5
6 #include "DynAST.h"
7 #include "SymEval.h"
8
9 #include "BoundFactData.h"
10
11 using namespace std;
12 using namespace Dyninst;
13 using namespace Dyninst::DataflowAPI;
14
15 AST::Ptr SimplifyRoot(AST::Ptr ast, uint64_t size);
16 AST::Ptr SimplifyAnAST(AST::Ptr ast, uint64_t size);
17
18
19 class SimplifyVisitor: public ASTVisitor {
20     uint64_t size;
21 public:
22     using ASTVisitor::visit;
23     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
24     SimplifyVisitor(uint64_t s): size(s) {}
25 };
26
27
28
29 class BoundCalcVisitor: public ASTVisitor {
30      
31 public:
32     using ASTVisitor::visit;
33     map<void*, BoundValue> bound;
34     BoundFact &boundFact;
35     BoundCalcVisitor(BoundFact &bf): boundFact(bf) {}
36     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
37     virtual ASTPtr visit(DataflowAPI::ConstantAST *ast);
38     virtual ASTPtr visit(DataflowAPI::VariableAST *ast);
39     bool IsResultBounded(AST::Ptr ast) {
40         return bound.find(ast.get()) != bound.end();
41     }
42     BoundValue GetResultBound(AST::Ptr ast) {
43         if (IsResultBounded(ast))
44             return bound[ast.get()];
45         else
46             return BoundValue();
47     }
48 };
49
50 class JumpCondVisitor: public ASTVisitor {
51
52 public:
53     using ASTVisitor::visit;
54     bool invertFlag;
55     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
56     JumpCondVisitor() : invertFlag(false) {}
57 };
58
59 class ComparisonVisitor: public ASTVisitor {
60
61 public:
62     using ASTVisitor::visit;
63     AST::Ptr subtrahend, minuend;
64     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
65
66     ComparisonVisitor(): subtrahend(AST::Ptr()), minuend(AST::Ptr()) {} 
67 };
68
69 #endif