changes towards method context insensitive analysis.
[IRC.git] / Robust / src / Analysis / MLP / ParentChildConflictsMap.java
1 package Analysis.MLP;
2
3 import java.util.HashSet;
4 import java.util.Hashtable;
5 import java.util.Iterator;
6 import java.util.Set;
7
8 import Analysis.OwnershipAnalysis.ReachabilitySet;
9 import Analysis.OwnershipAnalysis.TokenTupleSet;
10 import IR.Flat.TempDescriptor;
11
12 public class ParentChildConflictsMap {
13
14         public static final Integer ACCESSIBLE = new Integer(1);
15         public static final Integer INACCESSIBLE = new Integer(2);
16
17         private Hashtable<TempDescriptor, Integer> accessibleMap;
18         private Hashtable<TempDescriptor, StallSite> stallMap;
19
20         public ParentChildConflictsMap() {
21
22                 accessibleMap = new Hashtable<TempDescriptor, Integer>();
23                 stallMap = new Hashtable<TempDescriptor, StallSite>();
24
25         }
26
27         public Hashtable<TempDescriptor, Integer> getAccessibleMap() {
28                 return accessibleMap;
29         }
30
31         public Hashtable<TempDescriptor, StallSite> getStallMap() {
32                 return stallMap;
33         }
34
35         public void addAccessibleVar(TempDescriptor td) {
36                 accessibleMap.put(td, ACCESSIBLE);
37         }
38
39         public void addInaccessibleVar(TempDescriptor td) {
40                 accessibleMap.put(td, INACCESSIBLE);
41         }
42
43         public void addStallSite(TempDescriptor td) {
44                 StallSite stallSite = new StallSite();
45                 stallMap.put(td, stallSite);
46         }
47
48         public boolean isAccessible(TempDescriptor td) {
49                 if (accessibleMap.contains(td)
50                                 && accessibleMap.get(td).equals(ACCESSIBLE)) {
51                         return true;
52                 }
53                 return false;
54         }
55
56         public void contributeEffect(TempDescriptor td, String type, String field,
57                         int effect) {
58
59                 StallSite stallSite = stallMap.get(td);
60                 if (stallSite != null) {
61                         stallSite.addEffect(type, field, effect);
62                 }
63
64         }
65
66         public void merge(ParentChildConflictsMap newConflictsMap) {
67
68                 Hashtable<TempDescriptor, Integer> newAccessibleMap = newConflictsMap
69                                 .getAccessibleMap();
70                 Hashtable<TempDescriptor, StallSite> newStallMap = newConflictsMap
71                                 .getStallMap();
72
73                 Set<TempDescriptor> keySet = newAccessibleMap.keySet();
74                 for (Iterator<TempDescriptor> iterator = keySet.iterator(); iterator
75                                 .hasNext();) {
76                         TempDescriptor key = iterator.next();
77
78                         Integer newStatus = newAccessibleMap.get(key);
79
80                         // inaccessible is prior to accessible
81                         Integer currentStatus = getAccessibleMap().get(key);
82                         if (currentStatus != null && currentStatus == ACCESSIBLE
83                                         && newStatus == INACCESSIBLE) {
84                                 getAccessibleMap().put(key, INACCESSIBLE);
85                         }
86                 }
87
88                 keySet = newStallMap.keySet();
89                 for (Iterator<TempDescriptor> iterator = keySet.iterator(); iterator
90                                 .hasNext();) {
91                         TempDescriptor key = iterator.next();
92
93                         StallSite newStallSite = newStallMap.get(key);
94                         StallSite currentStallSite = getStallMap().get(key);
95
96                         // handle effects
97                         HashSet<Effect> currentEffectSet = currentStallSite.getEffectSet();
98                         HashSet<Effect> newEffectSet = newStallSite.getEffectSet();
99                         for (Iterator iterator2 = newEffectSet.iterator(); iterator2
100                                         .hasNext();) {
101                                 Effect effect = (Effect) iterator2.next();
102                                 if (!currentEffectSet.contains(effect)) {
103                                         currentEffectSet.add(effect);
104                                 }
105                         }
106
107                         // handle heap region
108                         HashSet<Integer> currentHRNSet = currentStallSite.getHRNIDSet();
109                         HashSet<Integer> newHRNSet = newStallSite.getHRNIDSet();
110                         for (Iterator iterator2 = newHRNSet.iterator(); iterator2.hasNext();) {
111                                 Integer hrnID = (Integer) iterator2.next();
112                                 if (!currentHRNSet.contains(hrnID)) {
113                                         currentHRNSet.add(hrnID);
114                                 }
115                         }
116
117                         // handle reachabilitySet
118                         ReachabilitySet currentRSet = currentStallSite.getReachabilitySet();
119                         ReachabilitySet newRSet = newStallSite.getReachabilitySet();
120                         Iterator<TokenTupleSet> ttsIter = newRSet.iterator();
121                         while (ttsIter.hasNext()) {
122                                 TokenTupleSet tokenTupleSet = (TokenTupleSet) ttsIter.next();
123                                 currentRSet.add(tokenTupleSet);
124                         }
125
126                         getStallMap()
127                                         .put(
128                                                         key,
129                                                         new StallSite(currentEffectSet, currentHRNSet,
130                                                                         currentRSet));
131
132                 }
133
134         }
135
136 }