Otawa  0.10
XIterativeDFA.h
Go to the documentation of this file.
1 /*
2  * $Id$
3  * Copyright (c) 2006 IRIT-UPS
4  *
5  * XIterativeDFA class interface.
6  */
7 #ifndef OTAWA_DFA_XITERATIVEDFA_H
8 #define OTAWA_DFA_XITERATIVEDFA_H
9 
10 #include <elm/assert.h>
11 
12 namespace otawa { namespace dfa {
13 
14 // XIterativeDFA class
15 template <class V>
17  V& visit;
18  int size;
19  typename V::domain_t **outs, **gens, **preserves, *new_out, **ins;
20 public:
21  inline XIterativeDFA(V& visitor);
22  inline ~XIterativeDFA(void);
23  inline void process(void);
24  inline void nextPred(int pred);
25  inline typename V::domain_t *in(const typename V::key_t& key)
26  { return ins[visit.index(key)]; }
27  inline typename V::domain_t *out(const typename V::key_t& key)
28  { return outs[visit.index(key)]; }
29  inline typename V::domain_t *gen(const typename V::key_t& key)
30  { return gens[visit.index(key)]; }
31  inline typename V::domain_t *preserve(const typename V::key_t& key)
32  { return preserves[visit.index(key)]; }
33 };
34 
35 
36 // Inlines
37 template <class V>
39 : visit(visitor), ins(0) {
40  size = visit.size();
41  ins = new typename V::domain_t *[size];
42  outs = new typename V::domain_t *[size];
43  gens = new typename V::domain_t *[size];
44  preserves = new typename V::domain_t *[size];
45  for(int i = 0; i < size; i++) {
46  ins[i] = visit.empty();
47  outs[i] = visit.empty();
48  gens[i] = visit.gen(i);
49  preserves[i] = visit.preserve(i);
50  }
51 }
52 
53 template <class V>
55  for(int i = 0; i < size; i++) {
56  visit.free(ins[i]);
57  visit.free(outs[i]);
58  visit.free(gens[i]);
59  visit.free(preserves[i]);
60  }
61  delete [] ins;
62  delete [] outs;
63  delete [] gens;
64  delete [] preserves;
65 }
66 
67 template <class V>
68 inline void XIterativeDFA<V>::nextPred(int pred) {
69  ASSERT(pred < size);
70  new_out->join(outs[pred]);
71 }
72 
73 template <class V>
74 inline void XIterativeDFA<V>::process(void) {
75  bool fixpoint = false;
76  typename V::domain_t *tmp;
77  new_out = visit.empty();
78  while(!fixpoint) {
79  fixpoint = true;
80  for(int i = 0; i < size; i++) {
81  new_out->reset();
82  visit.visitPreds(*this, i);
83  tmp = new_out;
84  new_out = ins[i];
85  ins[i] = tmp;
86  new_out->reset();
87  new_out->join(ins[i]);
88  new_out->meet(preserves[i]);
89  new_out->join(gens[i]);
90  if(!new_out->equals(outs[i])) {
91  fixpoint = false;
92  tmp = new_out;
93  new_out = outs[i];
94  outs[i] = tmp;
95  }
96  }
97  }
98  visit.free(new_out);
99 }
100 
101 } } // otawa::dfa
102 
103 #endif // OTAWA_DFA_XITERATIVEDFA_H
XIterativeDFA(V &visitor)
Build an iterative DFA with the given visitor.
Definition: XIterativeDFA.h:38
V::domain_t ** ins
Definition: XIterativeDFA.h:19
V & visit
Definition: XIterativeDFA.h:17
uint32 size
void nextPred(int pred)
This functions is used internally to communicate with the visitor.
Definition: XIterativeDFA.h:68
V::domain_t * gen(const typename V::key_t &key)
Definition: XIterativeDFA.h:29
V::domain_t * in(const typename V::key_t &key)
Definition: XIterativeDFA.h:25
~XIterativeDFA(void)
Definition: XIterativeDFA.h:54
int size
Definition: XIterativeDFA.h:18
V::domain_t * out(const typename V::key_t &key)
Definition: XIterativeDFA.h:27
void process(void)
Definition: XIterativeDFA.h:74
V::domain_t ** gens
Definition: XIterativeDFA.h:19
V::domain_t * new_out
Definition: XIterativeDFA.h:19
clp::Value V
Definition: SymbolicExpr.h:46
V::domain_t ** outs
Definition: XIterativeDFA.h:19
V::domain_t ** preserves
Definition: XIterativeDFA.h:19
V::domain_t * preserve(const typename V::key_t &key)
Definition: XIterativeDFA.h:31
The DFAEngine implements an extended Iterative Data Flow Algorithm, that is, it work on graphs with a...
Definition: XIterativeDFA.h:16