1. Should delete alias AST when a part of it is assigned a new value.
[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, 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
21 // On x86 and x86-64, the value of PC is post-instruction, 
22 // which is the current address plus the length of the instruction.
23 // On ARMv8, the value of PC is pre-instruction,
24 // which is the current address
25 Address PCValue(Address cur, size_t insnSize, Architecture a);
26
27 class SimplifyVisitor: public ASTVisitor {
28     Address addr;
29 public:
30     using ASTVisitor::visit;
31     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
32     SimplifyVisitor(Address a): addr(a) {}
33 };
34
35
36
37 class BoundCalcVisitor: public ASTVisitor {
38      
39 public:
40     using ASTVisitor::visit;
41     map<AST*, BoundValue*> 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     BoundValue* 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 public:
81     using ASTVisitor::visit;
82     ParseAPI::Block *b;
83     bool format;
84     virtual ASTPtr visit(DataflowAPI::RoseAST *ast);
85     JumpTableFormatVisitor(ParseAPI::Block *bl): b(bl), format(true) {}
86 };
87 #endif