Add new indirect control flow analysis code. The code is still using ParseAPI level...
[dyninst.git] / parseAPI / src / TableGuardData.h
1 #ifndef TABLE_GUARD_DATA_H
2 #define TABLE_GUARD_DATA_H
3
4 #include "CFG.h"
5 #include "Instruction.h"
6
7 #include "Instruction.h"
8 #include "DynAST.h"
9
10 using namespace Dyninst;
11 using namespace Dyninst::ParseAPI;
12 using namespace Dyninst::InstructionAPI;
13
14 struct GuardData {
15     ParseAPI::Function *func;
16     ParseAPI::Block* block;
17     Instruction::Ptr cmpInsn;
18     Instruction::Ptr jmpInsn;
19     Address cmpInsnAddr, jmpInsnAddr;
20     AST::Ptr cmpAST;
21     uint64_t cmpBound;
22     set<MachRegister> usedRegs;
23     bool constantBound, jumpWhenNoZF, varSubtrahend;  
24     GuardData(ParseAPI::Function *f,  ParseAPI::Block* b, Instruction::Ptr c, Instruction::Ptr j, Address ca, Address ja);
25     bool operator< (const GuardData &g) const { return block < g.block; }
26 };
27
28 typedef set<GuardData> GuardSet;
29
30
31 struct ReachFact {
32     GuardSet &guards;
33     set<ParseAPI::Block*> forbid;
34     map<ParseAPI::Block*, set<ParseAPI::Block*> > incoming;
35     map<ParseAPI::Block*, set<ParseAPI::Block*> > branch_taken;
36     map<ParseAPI::Block*, set<ParseAPI::Block*> > branch_ft;
37
38     void ReverseDFS(ParseAPI::Block *cur, set<ParseAPI::Block*> &visited);
39     void NaturalDFS(ParseAPI::Block *cur, set<ParseAPI::Block*> &visited);
40
41     void ReachBlocks();
42
43     ReachFact(GuardSet &g);
44 };
45
46 #endif