More pieces for new version of analysis
[IRC.git] / Robust / src / Analysis / OwnershipAnalysis / MethodEffects.java
1 package Analysis.OwnershipAnalysis;
2
3 import java.util.HashSet;
4 import java.util.Iterator;
5 import java.util.Set;
6
7 import IR.FieldDescriptor;
8 import IR.Flat.FlatCall;
9 import IR.Flat.TempDescriptor;
10
11 public class MethodEffects {
12
13         private EffectsSet effectsSet;
14
15         public MethodEffects() {
16                 effectsSet = new EffectsSet();
17         }
18
19         public EffectsSet getEffects() {
20                 return effectsSet;
21         }
22
23         public void analyzeFlatFieldNode(OwnershipGraph og, TempDescriptor srcDesc,
24                         FieldDescriptor fieldDesc) {
25
26                 LabelNode ln = getLabelNodeFromTemp(og, srcDesc);
27                 if (ln != null) {
28                         Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
29
30                         while (heapRegionsItr.hasNext()) {
31                                 ReferenceEdge edge = heapRegionsItr.next();
32                                 HeapRegionNode hrn = edge.getDst();
33
34                                 if (hrn.isParameter()) {
35                                         Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
36                                                         .getID());
37
38                                         if (paramSet != null) {
39                                                 Iterator<Integer> paramIter = paramSet.iterator();
40                                                 while (paramIter.hasNext()) {
41                                                         Integer paramID = paramIter.next();
42                                                         effectsSet.addReadingVar(paramID, new EffectsKey(
43                                                         fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
44
45                                                 }
46                                         }
47
48                                         // check weather this heap region is parameter
49                                         // reachable...
50
51                                         paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
52                                         if (paramSet != null) {
53                                                 Iterator<Integer> paramIter = paramSet.iterator();
54
55                                                 while (paramIter.hasNext()) {
56                                                         Integer paramID = paramIter.next();
57                                                         effectsSet.addReadingVar(paramID, new EffectsKey(
58                                                                         fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
59
60                                                 }
61                                         }
62
63                                 }
64                         }
65                 }
66
67         }
68         
69         public void analyzeFlatElementNode(OwnershipGraph og,
70                         TempDescriptor srcDesc, FieldDescriptor fieldDesc){
71
72                 LabelNode ln = getLabelNodeFromTemp(og, srcDesc);
73                 if (ln != null) {
74                         Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
75
76                         while (heapRegionsItr.hasNext()) {
77                                 ReferenceEdge edge = heapRegionsItr.next();
78                                 HeapRegionNode hrn = edge.getDst();
79
80                                 if (hrn.isParameter()) {
81                                         Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
82                                                         .getID());
83
84                                         if (paramSet != null) {
85                                                 Iterator<Integer> paramIter = paramSet.iterator();
86                                                 while (paramIter.hasNext()) {
87                                                         Integer paramID = paramIter.next();
88                                                         effectsSet.addReadingVar(paramID, new EffectsKey(
89                                                         fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
90                                                 }
91                                         }
92
93                                         // check weather this heap region is parameter
94                                         // reachable...
95
96                                         paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
97                                         if (paramSet != null) {
98                                                 Iterator<Integer> paramIter = paramSet.iterator();
99
100                                                 while (paramIter.hasNext()) {
101                                                         Integer paramID = paramIter.next();
102                                                         effectsSet.addReadingVar(paramID, new EffectsKey(
103                                                                         fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
104                                                 }
105                                         }
106
107                                 }
108                         }
109                 }
110
111         
112                 
113                 
114         }
115         
116         public void analyzeFlatSetElementNode(OwnershipGraph og,
117                         TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
118
119                 LabelNode ln = getLabelNodeFromTemp(og, dstDesc);
120                 if (ln != null) {
121
122                         // / check possible strong updates
123                         boolean strongUpdate = false;
124                         if (!fieldDesc.getType().isImmutable()
125                                         || fieldDesc.getType().isArray()) {
126                                 Iterator<ReferenceEdge> itrXhrn = ln.iteratorToReferencees();
127                                 while (itrXhrn.hasNext()) {
128                                         ReferenceEdge edgeX = itrXhrn.next();
129                                         HeapRegionNode hrnX = edgeX.getDst();
130
131                                         if (fieldDesc != null
132                                                         && fieldDesc != OwnershipAnalysis
133                                                                         .getArrayField(fieldDesc.getType())
134                                                         && ((hrnX.getNumReferencers() == 1) || // case 1
135                                                         (hrnX.isSingleObject() && ln.getNumReferencees() == 1) // case
136                                                                                                                                                                         // 2
137                                                         )) {
138                                                 strongUpdate = true;
139                                         }
140                                 }
141                         }
142                         // //
143
144                         Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
145                         while (heapRegionsItr.hasNext()) {
146                                 ReferenceEdge edge = heapRegionsItr.next();
147                                 HeapRegionNode hrn = edge.getDst();
148
149                                 if (hrn.isParameter()) {
150                                         Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
151                                                         .getID());
152
153                                         if (paramSet != null) {
154                                                 Iterator<Integer> paramIter = paramSet.iterator();
155                                                 while (paramIter.hasNext()) {
156                                                         Integer paramID = paramIter.next();
157                                                         effectsSet.addWritingVar(paramID, new EffectsKey(
158                                                                         fieldDesc.getSymbol(), dstDesc.getType(),
159                                                                         hrn.getID(), hrn
160                                                                                         .getGloballyUniqueIdentifier(), 0));
161                                                         if(strongUpdate){
162                                                                 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
163                                                                                 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
164                                                         }
165                                                 }
166                                         }
167
168                                         // check weather this heap region is parameter
169                                         // reachable...
170
171                                         paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
172                                         if (paramSet != null) {
173                                                 Iterator<Integer> paramIter = paramSet.iterator();
174
175                                                 while (paramIter.hasNext()) {
176                                                         Integer paramID = paramIter.next();
177                                                         effectsSet.addWritingVar(paramID, new EffectsKey(
178                                                                         fieldDesc.getSymbol(), dstDesc.getType(),
179                                                                         hrn.getID(), hrn
180                                                                                         .getGloballyUniqueIdentifier(), 1));
181                                                         if(strongUpdate){
182                                                                 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
183                                                                                 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
184                                                         }
185                                                 }
186                                         }
187
188                                 }
189
190                         }
191                 }
192
193         }
194
195         public void analyzeFlatSetFieldNode(OwnershipGraph og,
196                         TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
197
198                 LabelNode ln = getLabelNodeFromTemp(og, dstDesc);
199                 if (ln != null) {
200                         /// check possible strong updates
201                             boolean strongUpdate = false;
202                             if( !fieldDesc.getType().isImmutable() || fieldDesc.getType().isArray() ) {
203                                  Iterator<ReferenceEdge> itrXhrn = ln.iteratorToReferencees();
204                                             while( itrXhrn.hasNext() ) {
205                                               ReferenceEdge edgeX = itrXhrn.next();
206                                               HeapRegionNode hrnX = edgeX.getDst();
207                         
208                                               if( fieldDesc != null &&
209                                                           fieldDesc != OwnershipAnalysis.getArrayField( fieldDesc.getType() ) &&            
210                                                   (   (hrnX.getNumReferencers()                         == 1) || // case 1
211                                                       (hrnX.isSingleObject() && ln.getNumReferencees() == 1)    // case 2
212                                                       )
213                                                   ) {
214                                                 strongUpdate = true;
215                                               }
216                                             }
217                             }
218                         ////
219                         
220                         Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
221
222                         while (heapRegionsItr.hasNext()) {
223                                 ReferenceEdge edge = heapRegionsItr.next();
224                                 HeapRegionNode hrn = edge.getDst();
225
226                                 if (hrn.isParameter()) {
227
228                                         Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
229                                                         .getID());
230
231                                         if (paramSet != null) {
232                                                 Iterator<Integer> paramIter = paramSet.iterator();
233                                                 while (paramIter.hasNext()) {
234                                                         Integer paramID = paramIter.next();
235                                                         effectsSet.addWritingVar(paramID, new EffectsKey(
236                                                                         fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
237                                                         if(strongUpdate){
238                                                                 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
239                                                                                 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
240                                                         }
241
242                                                 }
243                                         }
244
245                                         // check weather this heap region is parameter
246                                         // reachable...
247
248                                         paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
249                                         if (paramSet != null) {
250                                                 Iterator<Integer> paramIter = paramSet.iterator();
251
252                                                 while (paramIter.hasNext()) {
253                                                         Integer paramID = paramIter.next();
254                                                         effectsSet.addWritingVar(paramID, new EffectsKey(
255                                                                         fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
256                                                         if(strongUpdate){
257                                                                 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
258                                                                                 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
259                                                         }
260
261                                                 }
262                                         }
263
264                                 }
265                         }
266                 }
267
268         }
269
270         private Set<Integer> getReachableParamIndexSet(OwnershipGraph og,
271                         TempDescriptor paramDesc) {
272
273                 HashSet<Integer> resultSet = new HashSet<Integer>();
274
275                 LabelNode ln = getLabelNodeFromTemp(og, paramDesc);
276                 if (ln != null) {
277
278                         Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
279
280                         while (heapRegionsItr.hasNext()) {
281                                 ReferenceEdge edge = heapRegionsItr.next();
282                                 HeapRegionNode hrn = edge.getDst();
283
284                                 if (hrn.isParameter()) {
285
286                                         Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
287                                                         .getID());
288
289                                         if (paramSet != null) {
290                                                 Iterator<Integer> paramIter = paramSet.iterator();
291                                                 while (paramIter.hasNext()) {
292                                                         Integer paramID = paramIter.next();
293
294                                                         resultSet.add(paramID);
295
296                                                 }
297                                         }
298
299                                         // check weather this heap region is parameter
300                                         // reachable...
301
302                                         paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
303                                         if (paramSet != null) {
304                                                 Iterator<Integer> paramIter = paramSet.iterator();
305
306                                                 while (paramIter.hasNext()) {
307                                                         Integer paramID = paramIter.next();
308
309                                                         resultSet.add(paramID);
310
311                                                 }
312                                         }
313
314                                 }
315                         }
316
317                 }
318
319                 return resultSet;
320
321         }
322
323         public void analyzeFlatCall(OwnershipGraph og, FlatCall fc,
324                         MethodContext mc, MethodEffects callee) {
325
326                 TempDescriptor[] tdArray = fc.readsTemps();
327
328                 for (int calleeParamIdx = 0; calleeParamIdx < tdArray.length; calleeParamIdx++) {
329                         TempDescriptor paramDesc = tdArray[calleeParamIdx];
330
331                         Set<Integer> paramIDs = getReachableParamIndexSet(og, paramDesc);
332
333                         // handle read effects
334                         Iterator<Integer> paramIter = paramIDs.iterator();
335                         while (paramIter.hasNext()) {
336                                 Integer paramIdx = paramIter.next();
337                                 HashSet<EffectsKey> newSet = callee.getEffects().getReadTable()
338                                                 .get(calleeParamIdx);
339                         
340                                 
341                                 if(newSet!=null){
342                                         HashSet<EffectsKey> thisSet=new HashSet<EffectsKey>();
343                                         HeapRegionNode priHRN=og.id2hrn.get(og.paramIndex2idPrimary.get(paramIdx));
344                                         Integer secIdx=og.paramIndex2idSecondary.get(paramIdx);
345                                         HeapRegionNode secHRN=null;
346                                         if(secIdx!=null){
347                                                  secHRN=og.id2hrn.get(secIdx);
348                                         }else{
349                                                 secHRN=priHRN;
350                                         }
351                                         
352                                         for (Iterator iterator = newSet.iterator(); iterator.hasNext();) {
353                                                 EffectsKey effectsKey = (EffectsKey) iterator.next();
354                                                 HeapRegionNode hrnTemp;
355                                                 if(effectsKey.getParamIden()==0){//primary
356                                                         hrnTemp=priHRN;
357                                                 }else{//secondary
358                                                         hrnTemp=secHRN;
359                                                 }
360                                                 EffectsKey newEffectsKey;
361                                                 if(secIdx==null){
362                                                         newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),0);
363                                                 }else{
364                                                         newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),effectsKey.getParamIden());
365                                                 }
366                                                 thisSet.add(newEffectsKey);
367                                         }
368                                         
369                                         effectsSet.addReadingEffectsSet(paramIdx, thisSet);
370                                 }
371                 
372                         }
373
374                         // handle write effects
375                         paramIter = paramIDs.iterator();
376                         while (paramIter.hasNext()) {
377                                 Integer paramIdx = paramIter.next();
378                                 HashSet<EffectsKey> newSet = callee.getEffects()
379                                                 .getWriteTable().get(calleeParamIdx);
380                                 
381                                 if(newSet!=null){
382                                         
383                                         HashSet<EffectsKey> thisSet=new HashSet<EffectsKey>();
384                                         HeapRegionNode priHRN=og.id2hrn.get(og.paramIndex2idPrimary.get(paramIdx));
385                                         Integer secIdx=og.paramIndex2idSecondary.get(paramIdx);
386                                         HeapRegionNode secHRN=null;
387                                         if(secIdx!=null){
388                                                  secHRN=og.id2hrn.get(secIdx);
389                                         }else{
390                                                 secHRN=priHRN;
391                                         }
392                                         
393                                         for (Iterator iterator = newSet.iterator(); iterator.hasNext();) {
394                                                 EffectsKey effectsKey = (EffectsKey) iterator.next();
395                                                 HeapRegionNode hrnTemp;
396                                                 if(effectsKey.getParamIden()==0){//primary
397                                                         hrnTemp=priHRN;
398                                                 }else{//secondary
399                                                         hrnTemp=secHRN;
400                                                 }
401                                                 EffectsKey newEffectsKey;
402                                                 if(secIdx==null){
403                                                         newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),0);
404                                                 }else{
405                                                         newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),effectsKey.getParamIden());
406                                                 }
407                                                 thisSet.add(newEffectsKey);
408                                         }
409                                         
410                                         effectsSet.addWritingEffectsSet(paramIdx, thisSet);
411                                 }
412                                 
413                         }
414                         
415                         // handle strong update effects
416                         paramIter = paramIDs.iterator();
417                         while (paramIter.hasNext()) {
418                                 Integer paramIdx = paramIter.next();
419                                 HashSet<EffectsKey> newSet = callee.getEffects()
420                                                 .getStrongUpdateTable().get(calleeParamIdx);
421                                 if(newSet!=null){
422                                         
423                                         HashSet<EffectsKey> thisSet=new HashSet<EffectsKey>();
424                                         HeapRegionNode priHRN=og.id2hrn.get(og.paramIndex2idPrimary.get(paramIdx));
425                                         Integer secIdx=og.paramIndex2idSecondary.get(paramIdx);
426                                         HeapRegionNode secHRN=null;
427                                         if(secIdx!=null){
428                                                  secHRN=og.id2hrn.get(secIdx);
429                                         }else{
430                                                 secHRN=priHRN;
431                                         }
432                                         
433                                         for (Iterator iterator = newSet.iterator(); iterator.hasNext();) {
434                                                 EffectsKey effectsKey = (EffectsKey) iterator.next();
435                                                 HeapRegionNode hrnTemp;
436                                                 if(effectsKey.getParamIden()==0){//primary
437                                                         hrnTemp=priHRN;
438                                                 }else{//secondary
439                                                         hrnTemp=secHRN;
440                                                 }
441                                                 EffectsKey newEffectsKey;
442                                                 if(secIdx==null){
443                                                         newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),0);
444                                                 }else{
445                                                         newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),effectsKey.getParamIden());
446                                                 }
447                                                 thisSet.add(newEffectsKey);
448                                         }
449                                         
450                                         effectsSet.addStrongUpdateEffectsSet(paramIdx, thisSet);
451                                 }
452                                 
453                         }
454
455                 }
456
457         }
458
459         protected LabelNode getLabelNodeFromTemp(OwnershipGraph og,
460                         TempDescriptor td) {
461                 assert td != null;
462
463                 if (!og.td2ln.containsKey(td)) {
464                         og.td2ln.put(td, new LabelNode(td));
465                 }
466
467                 return og.td2ln.get(td);
468         }
469
470         public boolean equals(Object o) {
471                 if (o == null) {
472                         return false;
473                 }
474
475                 if (!(o instanceof MethodEffects)) {
476                         return false;
477                 }
478
479                 MethodEffects in = (MethodEffects) o;
480
481                 if (getEffects().equals(in.getEffects())) {
482                         return true;
483                 } else {
484                         return false;
485                 }
486
487         }
488
489         public int hashCode() {
490                 int hash = 1;
491
492                 hash += getEffects().hashCode() * 37;
493
494                 return hash;
495         }
496
497 }