Start to split jump table analysis to two different slices.
[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 #include "CodeSource.h"
9 //#include "BoundFactData.h"
10
11 using namespace std;
12 using namespace Dyninst;
13 using namespace Dyninst::DataflowAPI;
14
15 //bool PerformTableRead(BoundValue &target, set<int64_t> & jumpTargets, CodeSource*);
16
17
18
19 class SimplifyVisitor: public ASTVisitor {
20     Address addr;
21 public:
22     using ASTVisitor::visit;
23     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
24     SimplifyVisitor(Address a): addr(a) {}
25 };
26
27
28 /*
29 class BoundCalcVisitor: public ASTVisitor {
30      
31 public:
32     using ASTVisitor::visit;
33     map<AST*, BoundValue*> bound;
34     BoundFact &boundFact;
35     ParseAPI::Block *block;
36     bool handleOneByteRead;
37     int derefSize;
38
39     BoundCalcVisitor(BoundFact &bf, ParseAPI::Block* b, bool handle, int size): 
40         boundFact(bf), block(b), handleOneByteRead(handle), derefSize(size) {}
41     ~BoundCalcVisitor();
42     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
43     virtual ASTPtr visit(DataflowAPI::ConstantAST *ast);
44     virtual ASTPtr visit(DataflowAPI::VariableAST *ast);
45     bool IsResultBounded(AST::Ptr ast) {
46         return bound.find(ast.get()) != bound.end();
47     }
48     BoundValue* GetResultBound(AST::Ptr ast); 
49 };
50
51 class JumpCondVisitor: public ASTVisitor {
52
53 public:
54     using ASTVisitor::visit;
55     bool invertFlag;
56     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
57     JumpCondVisitor() : invertFlag(false) {}
58 };
59
60 class ComparisonVisitor: public ASTVisitor {
61
62 public:
63     using ASTVisitor::visit;
64     AST::Ptr subtrahend, minuend;
65     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
66
67     ComparisonVisitor(): subtrahend(AST::Ptr()), minuend(AST::Ptr()) {} 
68 };
69 */
70 class JumpTableFormatVisitor: public ASTVisitor {
71
72     bool PotentialIndexing(AST::Ptr);
73 public:
74     using ASTVisitor::visit;
75     AbsRegion index;
76     int numOfVar;
77     ParseAPI::Block *b;
78     bool findIncorrectFormat;
79     bool findTableBase;
80     bool findIndex;
81     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
82     virtual ASTPtr visit(DataflowAPI::VariableAST *ast);
83     JumpTableFormatVisitor(ParseAPI::Block *bl);
84 };
85 #endif