1 package Analysis.OwnershipAnalysis;
3 import java.util.HashSet;
4 import java.util.Iterator;
7 import IR.FieldDescriptor;
8 import IR.Flat.FlatCall;
9 import IR.Flat.TempDescriptor;
11 public class MethodEffects {
13 private EffectsSet effectsSet;
15 public MethodEffects() {
16 effectsSet = new EffectsSet();
19 public EffectsSet getEffects() {
23 public void analyzeFlatFieldNode(OwnershipGraph og, TempDescriptor srcDesc,
24 FieldDescriptor fieldDesc) {
26 LabelNode ln = getLabelNodeFromTemp(og, srcDesc);
28 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
30 while (heapRegionsItr.hasNext()) {
31 ReferenceEdge edge = heapRegionsItr.next();
32 HeapRegionNode hrn = edge.getDst();
34 if (hrn.isParameter()) {
35 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
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));
48 // check weather this heap region is parameter
51 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
52 if (paramSet != null) {
53 Iterator<Integer> paramIter = paramSet.iterator();
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));
69 public void analyzeFlatElementNode(OwnershipGraph og,
70 TempDescriptor srcDesc, FieldDescriptor fieldDesc) {
72 LabelNode ln = getLabelNodeFromTemp(og, srcDesc);
74 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
76 while (heapRegionsItr.hasNext()) {
77 ReferenceEdge edge = heapRegionsItr.next();
78 HeapRegionNode hrn = edge.getDst();
80 if (hrn.isParameter()) {
81 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
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));
93 // check weather this heap region is parameter
96 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
97 if (paramSet != null) {
98 Iterator<Integer> paramIter = paramSet.iterator();
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));
116 public void analyzeFlatSetElementNode(OwnershipGraph og,
117 TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
119 LabelNode ln = getLabelNodeFromTemp(og, dstDesc);
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();
131 if (fieldDesc != null
132 && fieldDesc != OwnershipAnalysis
133 .getArrayField(fieldDesc.getType())
134 && ((hrnX.getNumReferencers() == 1) || // case 1
135 (hrnX.isSingleObject() && ln.getNumReferencees() == 1) // case
144 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
145 while (heapRegionsItr.hasNext()) {
146 ReferenceEdge edge = heapRegionsItr.next();
147 HeapRegionNode hrn = edge.getDst();
149 if (hrn.isParameter()) {
150 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
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(),
160 .getGloballyUniqueIdentifier(), 0));
162 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
163 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
168 // check weather this heap region is parameter
171 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
172 if (paramSet != null) {
173 Iterator<Integer> paramIter = paramSet.iterator();
175 while (paramIter.hasNext()) {
176 Integer paramID = paramIter.next();
177 effectsSet.addWritingVar(paramID, new EffectsKey(
178 fieldDesc.getSymbol(), dstDesc.getType(),
180 .getGloballyUniqueIdentifier(), 1));
182 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
183 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
195 public void analyzeFlatSetFieldNode(OwnershipGraph og,
196 TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
198 LabelNode ln = getLabelNodeFromTemp(og, dstDesc);
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();
208 if( fieldDesc != null &&
209 fieldDesc != OwnershipAnalysis.getArrayField(fieldDesc.getType() ) &&
210 ( (hrnX.getNumReferencers() == 1) || // case 1
211 (hrnX.isSingleObject() && ln.getNumReferencees() == 1) // case 2
220 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
222 while (heapRegionsItr.hasNext()) {
223 ReferenceEdge edge = heapRegionsItr.next();
224 HeapRegionNode hrn = edge.getDst();
226 if (hrn.isParameter()) {
228 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
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));
238 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
239 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
245 // check weather this heap region is parameter
248 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
249 if (paramSet != null) {
250 Iterator<Integer> paramIter = paramSet.iterator();
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));
257 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
258 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
270 private Set<Integer> getReachableParamIndexSet(OwnershipGraph og,
271 TempDescriptor paramDesc) {
273 HashSet<Integer> resultSet = new HashSet<Integer>();
275 LabelNode ln = getLabelNodeFromTemp(og, paramDesc);
278 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
280 while (heapRegionsItr.hasNext()) {
281 ReferenceEdge edge = heapRegionsItr.next();
282 HeapRegionNode hrn = edge.getDst();
284 if (hrn.isParameter()) {
286 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
289 if (paramSet != null) {
290 Iterator<Integer> paramIter = paramSet.iterator();
291 while (paramIter.hasNext()) {
292 Integer paramID = paramIter.next();
294 resultSet.add(paramID);
299 // check weather this heap region is parameter
302 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
303 if (paramSet != null) {
304 Iterator<Integer> paramIter = paramSet.iterator();
306 while (paramIter.hasNext()) {
307 Integer paramID = paramIter.next();
309 resultSet.add(paramID);
323 public void analyzeFlatCall(OwnershipGraph og, FlatCall fc,
324 MethodContext mc, MethodEffects callee) {
326 TempDescriptor[] tdArray = fc.readsTemps();
328 for (int calleeParamIdx = 0; calleeParamIdx < tdArray.length; calleeParamIdx++) {
329 TempDescriptor paramDesc = tdArray[calleeParamIdx];
331 Set<Integer> paramIDs = getReachableParamIndexSet(og, paramDesc);
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);
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;
347 secHRN=og.id2hrn.get(secIdx);
352 for (Iterator iterator = newSet.iterator(); iterator.hasNext(); ) {
353 EffectsKey effectsKey = (EffectsKey) iterator.next();
354 HeapRegionNode hrnTemp;
355 if(effectsKey.getParamIden()==0) { //primary
360 EffectsKey newEffectsKey;
362 newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),0);
364 newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),effectsKey.getParamIden());
366 thisSet.add(newEffectsKey);
369 effectsSet.addReadingEffectsSet(paramIdx, thisSet);
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);
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;
388 secHRN=og.id2hrn.get(secIdx);
393 for (Iterator iterator = newSet.iterator(); iterator.hasNext(); ) {
394 EffectsKey effectsKey = (EffectsKey) iterator.next();
395 HeapRegionNode hrnTemp;
396 if(effectsKey.getParamIden()==0) { //primary
401 EffectsKey newEffectsKey;
403 newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),0);
405 newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),effectsKey.getParamIden());
407 thisSet.add(newEffectsKey);
410 effectsSet.addWritingEffectsSet(paramIdx, thisSet);
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);
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;
428 secHRN=og.id2hrn.get(secIdx);
433 for (Iterator iterator = newSet.iterator(); iterator.hasNext(); ) {
434 EffectsKey effectsKey = (EffectsKey) iterator.next();
435 HeapRegionNode hrnTemp;
436 if(effectsKey.getParamIden()==0) { //primary
441 EffectsKey newEffectsKey;
443 newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),0);
445 newEffectsKey=new EffectsKey(effectsKey.getFieldDescriptor(), effectsKey.getTypeDescriptor(), hrnTemp.getID(),hrnTemp.getGloballyUniqueIdentifier(),effectsKey.getParamIden());
447 thisSet.add(newEffectsKey);
450 effectsSet.addStrongUpdateEffectsSet(paramIdx, thisSet);
459 protected LabelNode getLabelNodeFromTemp(OwnershipGraph og,
463 if (!og.td2ln.containsKey(td)) {
464 og.td2ln.put(td, new LabelNode(td));
467 return og.td2ln.get(td);
470 public boolean equals(Object o) {
475 if (!(o instanceof MethodEffects)) {
479 MethodEffects in = (MethodEffects) o;
481 if (getEffects().equals(in.getEffects())) {
489 public int hashCode() {
492 hash += getEffects().hashCode() * 37;