Address calculation should use 64-bit integers..
[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 AST::Ptr SimplifyRoot(AST::Ptr ast, Address addr);
16 AST::Ptr SimplifyAnAST(AST::Ptr ast, Address addr);
17 AST::Ptr SubstituteAnAST(AST::Ptr ast, const BoundFact::AliasMap &aliasMap);
18 AST::Ptr DeepCopyAnAST(AST::Ptr ast);
19 bool ContainAnAST(AST::Ptr root, AST::Ptr check);
20 bool PerformTableRead(BoundValue &target, set<int64_t> & jumpTargets, CodeSource*);
21
22
23 // On x86 and x86-64, the value of PC is post-instruction, 
24 // which is the current address plus the length of the instruction.
25 // On ARMv8, the value of PC is pre-instruction,
26 // which is the current address
27 Address PCValue(Address cur, size_t insnSize, Architecture a);
28
29 class SimplifyVisitor: public ASTVisitor {
30     Address addr;
31 public:
32     using ASTVisitor::visit;
33     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
34     SimplifyVisitor(Address a): addr(a) {}
35 };
36
37
38
39 class BoundCalcVisitor: public ASTVisitor {
40      
41 public:
42     using ASTVisitor::visit;
43     map<AST*, BoundValue*> bound;
44     BoundFact &boundFact;
45     ParseAPI::Block *block;
46     bool handleOneByteRead;
47     int derefSize;
48
49     BoundCalcVisitor(BoundFact &bf, ParseAPI::Block* b, bool handle, int size): 
50         boundFact(bf), block(b), handleOneByteRead(handle), derefSize(size) {}
51     ~BoundCalcVisitor();
52     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
53     virtual ASTPtr visit(DataflowAPI::ConstantAST *ast);
54     virtual ASTPtr visit(DataflowAPI::VariableAST *ast);
55     bool IsResultBounded(AST::Ptr ast) {
56         return bound.find(ast.get()) != bound.end();
57     }
58     BoundValue* GetResultBound(AST::Ptr ast); 
59 };
60
61 class JumpCondVisitor: public ASTVisitor {
62
63 public:
64     using ASTVisitor::visit;
65     bool invertFlag;
66     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
67     JumpCondVisitor() : invertFlag(false) {}
68 };
69
70 class ComparisonVisitor: public ASTVisitor {
71
72 public:
73     using ASTVisitor::visit;
74     AST::Ptr subtrahend, minuend;
75     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
76
77     ComparisonVisitor(): subtrahend(AST::Ptr()), minuend(AST::Ptr()) {} 
78 };
79
80 class JumpTableFormatVisitor: public ASTVisitor {
81
82 public:
83     using ASTVisitor::visit;
84     ParseAPI::Block *b;
85     bool format;
86     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
87     JumpTableFormatVisitor(ParseAPI::Block *bl): b(bl), format(true) {}
88 };
89 #endif