Update Dyninst version in shared.cmake (#799)
[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 #include "SymbolicExpression.h"
11
12 using namespace std;
13 using namespace Dyninst;
14 using namespace Dyninst::DataflowAPI;
15
16 //bool PerformTableRead(StridedInterval &target, set<int64_t> & jumpTargets, CodeSource*);
17
18 #define SIGNEX_64_32 0xffffffff00000000LL
19 #define SIGNEX_64_16 0xffffffffffff0000LL
20 #define SIGNEX_64_8  0xffffffffffffff00LL
21 #define SIGNEX_32_16 0xffff0000
22 #define SIGNEX_32_8 0xffffff00
23
24
25
26 class SimplifyVisitor: public ASTVisitor {
27     Address addr;
28     bool keepMultiOne;
29     SymbolicExpression &se;
30 public:
31     using ASTVisitor::visit;
32     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
33     SimplifyVisitor(Address a, bool k, SymbolicExpression &sym): addr(a), keepMultiOne(k), se(sym) {}
34 };
35
36
37 class BoundCalcVisitor: public ASTVisitor {
38      
39 public:
40     using ASTVisitor::visit;
41     map<AST*, StridedInterval*> bound;
42     BoundFact &boundFact;
43     ParseAPI::Block *block;
44     bool handleOneByteRead;
45     int derefSize;
46
47     BoundCalcVisitor(BoundFact &bf, ParseAPI::Block* b, bool handle, int size): 
48         boundFact(bf), block(b), handleOneByteRead(handle), derefSize(size) {}
49     ~BoundCalcVisitor();
50     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
51     virtual ASTPtr visit(DataflowAPI::ConstantAST *ast);
52     virtual ASTPtr visit(DataflowAPI::VariableAST *ast);
53     bool IsResultBounded(AST::Ptr ast) {
54         return bound.find(ast.get()) != bound.end();
55     }
56     StridedInterval* GetResultBound(AST::Ptr ast); 
57 };
58
59 class JumpCondVisitor: public ASTVisitor {
60
61 public:
62     using ASTVisitor::visit;
63     bool invertFlag;
64     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
65     JumpCondVisitor() : invertFlag(false) {}
66 };
67
68 class ComparisonVisitor: public ASTVisitor {
69
70 public:
71     using ASTVisitor::visit;
72     AST::Ptr subtrahend, minuend;
73     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
74
75     ComparisonVisitor(): subtrahend(AST::Ptr()), minuend(AST::Ptr()) {} 
76 };
77
78 class JumpTableFormatVisitor: public ASTVisitor {
79
80     bool PotentialIndexing(AST::Ptr);
81 public:
82     using ASTVisitor::visit;
83     AbsRegion index;
84     int numOfVar;
85     int memoryReadLayer;
86     ParseAPI::Block *b;
87     bool findIncorrectFormat;
88     bool findTableBase;    
89     bool findIndex;
90     bool firstAdd;
91     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
92     virtual ASTPtr visit(DataflowAPI::VariableAST *ast);
93     JumpTableFormatVisitor(ParseAPI::Block *bl);
94 };
95
96 class JumpTableReadVisitor: public ASTVisitor {
97 public:
98     using ASTVisitor::visit;
99     AbsRegion index;
100     int64_t indexValue;
101     CodeSource* cs;
102     CodeRegion* cr;
103     Address targetAddress;
104     Address readAddress;
105     int memoryReadSize;
106     bool valid;
107     bool isZeroExtend;
108
109
110     // This tracks the results of computation for each sub AST
111     map<AST*, int64_t> results;
112     JumpTableReadVisitor(AbsRegion i, int v, CodeSource *c, CodeRegion *r, bool ze, int m);
113     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
114     virtual ASTPtr visit(DataflowAPI::ConstantAST *ast);
115     virtual ASTPtr visit(DataflowAPI::VariableAST *ast);
116     bool PerformMemoryRead(Address addr, int64_t &v);
117 };
118 #endif