1. Refactor code of reading contents from jump tables and determining jump target...
[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     Address targetBase;    
22     // If tableReadSize == 0, this does not represent a memory access
23     // Otherwise, tableReadSize reprenents the number bytes of the access
24     int tableReadSize;
25     int tableStride;
26
27     // On ARM, the table content is often multiplied by 4 before adding with targetBase
28     int tcMultiply;
29     bool isInverted;
30     bool isSubReadContent;
31     bool isZeroExtend;
32
33     bool jumpTableFormat;
34     bool unknownInstruction;
35     bool findIndex;
36
37     AbsRegion index;
38     Assignment::Ptr indexLoc;
39     bool firstMemoryRead;
40     Assignment::Ptr memLoc;
41     AST::Ptr jumpTargetExpr;
42
43
44
45     JumpTableFormatPred(ParseAPI::Function *f,
46                         ParseAPI::Block *b,
47                         ReachFact &r,
48                         ThunkData &t,
49                         SymbolicExpression &sym):
50             func(f), block(b), rf(r), thunks(t), se(sym) {
51                 targetBase = 0;
52                 tableReadSize = 0;
53                 tcMultiply = 1;
54                 isInverted = false;
55                 isSubReadContent = false;
56                 isZeroExtend = false;
57                 jumpTableFormat = true;
58                 unknownInstruction = false;
59                 findIndex = false;
60                 firstMemoryRead = true;
61             }
62
63     virtual bool modifyCurrentFrame(Slicer::SliceFrame &frame, Graph::Ptr g);
64     std::string format();
65     bool isJumpTableFormat() { return jumpTableFormat && findIndex; }
66     bool findSpillRead(Graph::Ptr g, SliceNode::Ptr &);
67     void adjustActiveMap(Slicer::SliceFrame &frame, SliceNode::Ptr);
68 };
69
70 #endif