remove unnecessary assertion for unknown phdr_type (#757)
[dyninst.git] / parseAPI / src / JumpTableFormatPred.h
1 #ifndef JUMP_TABLE_FORMAT_PRED_H
2 #define JUMP_TABLE_FORMAT_PRED_H
3
4 #include "CFG.h"
5 #include "slicing.h"
6 #include "Edge.h"
7 #include "ThunkData.h"
8 #include "Graph.h"
9 #include "SymbolicExpression.h"
10 //#include "BoundFactCalculator.h"
11 using namespace Dyninst;
12
13 class JumpTableFormatPred : public Slicer::Predicates {
14 public:
15     ParseAPI::Function *func;
16     ParseAPI::Block *block;
17     ReachFact &rf;
18     ThunkData &thunks;
19     SymbolicExpression &se;
20
21     bool jumpTableFormat;
22     bool findIndex;
23     bool findTableBase;
24
25     AbsRegion index;
26     Assignment::Ptr indexLoc;
27     bool firstMemoryRead;
28     Assignment::Ptr memLoc;
29     AST::Ptr jumpTargetExpr;
30
31     set<Address> constAddr;
32     dyn_hash_map<Assignment::Ptr, std::pair<AST::Ptr, AST::Ptr>, Assignment::AssignmentPtrHasher> aliases;
33
34     // On ppc 64, r2 is reserved for storing the address of the global offset table 
35     Address toc_address;
36
37     virtual bool modifyCurrentFrame(Slicer::SliceFrame &frame, Graph::Ptr g, Slicer*);
38     std::string format();
39     bool isJumpTableFormat() { return jumpTableFormat && findIndex && findTableBase && memLoc;}
40     bool findRead(Graph::Ptr g, SliceNode::Ptr &);
41     bool adjustSliceFrame(Slicer::SliceFrame &frame, SliceNode::Ptr, Slicer*);
42     bool isTOCRead(Slicer::SliceFrame &frame, SliceNode::Ptr);
43     void FindTOC();
44     JumpTableFormatPred(ParseAPI::Function *f,
45                         ParseAPI::Block *b,
46                         ReachFact &r,
47                         ThunkData &t,
48                         SymbolicExpression &sym);
49     virtual bool ignoreEdge(ParseAPI::Edge *e);
50
51 };
52
53 #endif