Potential fixes needed for relocating libraries (#754)
[dyninst.git] / parseAPI / src / SymbolicExpression.h
1 #ifndef SYMBOLIC_EXPRESSION_H
2 #define SYMBOLIC_EXPRESSION_H
3
4 #include "DynAST.h"
5 #include "Absloc.h"
6 #include "CodeSource.h"
7 #include <map>
8 using Dyninst::AST;
9 using namespace Dyninst;
10 // This class tracks the expanded assignments,
11 // and also provides several helper functions for manipulating ASTs
12 class SymbolicExpression {
13
14     dyn_hash_map<Assignment::Ptr, AST::Ptr, Assignment::AssignmentPtrHasher> expandCache;
15
16 public:
17
18     AST::Ptr SimplifyRoot(AST::Ptr ast, Address addr, bool keepMultiOne = false);
19     AST::Ptr SimplifyAnAST(AST::Ptr ast, Address addr, bool keepMultiOne = false);
20     static AST::Ptr SubstituteAnAST(AST::Ptr ast, const std::map<AST::Ptr, AST::Ptr>& aliasMap);
21     static AST::Ptr DeepCopyAnAST(AST::Ptr ast);
22     static bool ContainAnAST(AST::Ptr root, AST::Ptr check);
23     bool ReadMemory(Address addr, uint64_t &val, int size);
24     ParseAPI::CodeSource* cs; 
25     // For archive, there are overlapping regions.
26     // Need to use the right region.
27     ParseAPI::CodeRegion* cr;
28     std::pair<AST::Ptr, bool> ExpandAssignment(Assignment::Ptr, bool keepMultiOne = false);
29
30     //On x86 and x86-64, the value of PC is post-instruction, 
31     // which is the current address plus the length of the instruction.
32     // On ARMv8, the value of PC is pre-instruction,
33     // which is the current address
34     static Address PCValue(Address cur, size_t insnSize, Architecture a);
35
36
37 };
38
39 #endif