Add new indirect control flow analysis code. The code is still using ParseAPI level...
[dyninst.git] / parseAPI / src / BoundFactData.h
1 #ifndef BOUND_FACT_DATA_H
2 #define BOUND_FACT_DATA_H
3
4 #include "Absloc.h"
5 #include "Node.h"
6
7 using namespace std;
8 using namespace Dyninst;
9 using namespace Dyninst::DataflowAPI;
10
11
12 typedef enum {
13     Equal, LessThan
14 } BoundType;
15
16 struct BoundValue {
17
18
19     BoundType type;
20     uint64_t value;
21     int coe;
22     uint64_t tableBase, targetBase;
23     bool tableLookup, tableOffset, posi;
24     BoundValue(BoundType t, uint64_t val, int c, uint64_t tableB, uint64_t tarB, bool tl, bool to, bool p = true): 
25         type(t), value(val), coe(c), tableBase(tableB), targetBase(tarB), tableLookup(tl), tableOffset(to), posi(p) {}
26     BoundValue(): 
27         type(Equal), value(0), coe(1), tableBase(0), targetBase(0), tableLookup(false), tableOffset(false), posi(false) {}
28
29     bool operator< (const BoundValue &bv) const { return value < bv.value; }
30     bool operator== (const BoundValue &bv) const;
31     bool CoeBounded() {return (coe == 4) || (coe == 8); }
32     bool HasTableBase() {return tableBase != 0;}
33     bool HasTargetBase() {return targetBase != 0; }
34 };
35
36 struct BoundFact {
37
38     // Special fact representation for cmp table guard
39     AST::Ptr cmpAST;
40     uint64_t cmpBound;
41     bool cmpBoundFactLive;
42     set<MachRegister> cmpUsedRegs;
43
44     typedef map<Absloc, BoundValue > FactType;
45     FactType fact;
46     bool operator< (const BoundFact &bf) const {return fact < bf.fact; }
47     bool operator!= (const BoundFact &bf) const;
48
49     bool IsBounded(const Absloc &al) { return fact.find(al) != fact.end();}
50     BoundValue GetBound(const Absloc &al); 
51     
52     void Intersect(BoundFact &bf);
53
54     void GenFact(const Absloc &al, BoundValue bv);
55     void KillFact(const Absloc &al);
56     void Print();
57     void CheckCmpValidity(const MachRegister &reg);
58     bool CMPBoundMatch(AST* ast);
59 };
60
61 typedef map<Node*, BoundFact> BoundFactsType;
62
63
64 #endif