1 cananian 1.1.2.1 // AnalysisCheckOracle.java, created Tue Jan 16 12:12:16 2001 by cananian 2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Analysis.Transactions; 5 cananian 1.1.2.1 6 cananian 1.1.2.2 import harpoon.ClassFile.HCodeElement; 7 cananian 1.1.2.4 import harpoon.Temp.Temp; 8 cananian 1.4 import net.cscott.jutil.AggregateSetFactory; 9 cananian 1.4 import net.cscott.jutil.SetFactory; 10 cananian 1.1.2.3 11 cananian 1.1.2.4 import java.util.Collection; 12 cananian 1.1.2.4 import java.util.HashMap; 13 cananian 1.1.2.4 import java.util.Iterator; 14 cananian 1.1.2.4 import java.util.Map; 15 cananian 1.1.2.4 import java.util.Set; 16 cananian 1.1.2.1 17 cananian 1.1.2.1 /** 18 cananian 1.1.2.1 * An <code>AnalysisCheckOracle</code> is used when one wants to 19 cananian 1.1.2.1 * do some analysis and store the results of the check oracle. 20 cananian 1.1.2.1 * 21 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 22 cananian 1.4 * @version $Id: AnalysisCheckOracle.java,v 1.4 2004/02/08 01:54:21 cananian Exp $ 23 cananian 1.1.2.1 */ 24 cananian 1.1.2.1 abstract class AnalysisCheckOracle extends CheckOracle { 25 cananian 1.2.2.1 final Map<HCodeElement,CheckSet> results = 26 cananian 1.2.2.1 new HashMap<HCodeElement,CheckSet>(); 27 cananian 1.2.2.1 public Set<Temp> createReadVersions(HCodeElement hce) { 28 cananian 1.2.2.1 return results.get(hce).readVersions; 29 cananian 1.1.2.1 } 30 cananian 1.2.2.1 public Set<Temp> createWriteVersions(HCodeElement hce) { 31 cananian 1.2.2.1 return results.get(hce).writeVersions; 32 cananian 1.1.2.1 } 33 cananian 1.2.2.1 public Set<RefAndField> checkFieldReads(HCodeElement hce) { 34 cananian 1.2.2.1 return results.get(hce).fieldReads; 35 cananian 1.1.2.1 } 36 cananian 1.2.2.1 public Set<RefAndField> checkFieldWrites(HCodeElement hce) { 37 cananian 1.2.2.1 return results.get(hce).fieldWrites; 38 cananian 1.1.2.6 } 39 cananian 1.2.2.1 public Set<RefAndIndexAndType> checkArrayElementReads(HCodeElement hce) { 40 cananian 1.2.2.1 return results.get(hce).elementReads; 41 cananian 1.1.2.6 } 42 cananian 1.2.2.1 public Set<RefAndIndexAndType> checkArrayElementWrites(HCodeElement hce) { 43 cananian 1.2.2.1 return results.get(hce).elementWrites; 44 cananian 1.1.2.1 } 45 cananian 1.1.2.1 46 cananian 1.1.2.1 /** Creates a <code>AnalysisCheckOracle</code>. */ 47 cananian 1.1.2.3 AnalysisCheckOracle() { /* nothing */ } 48 cananian 1.1.2.1 49 cananian 1.1.2.3 private final SetFactory sf = new AggregateSetFactory(); 50 cananian 1.1.2.1 51 cananian 1.1.2.3 class CheckSet { 52 cananian 1.2.2.1 final Set<Temp> readVersions = sf.makeSet(); 53 cananian 1.2.2.1 final Set<Temp> writeVersions = sf.makeSet(); 54 cananian 1.2.2.1 final Set<RefAndField> fieldReads = sf.makeSet(); 55 cananian 1.2.2.1 final Set<RefAndField> fieldWrites = sf.makeSet(); 56 cananian 1.2.2.1 final Set<RefAndIndexAndType> elementReads = sf.makeSet(); 57 cananian 1.2.2.1 final Set<RefAndIndexAndType> elementWrites = sf.makeSet(); 58 cananian 1.1.2.1 59 cananian 1.1.2.1 CheckSet() { /* new empty set */ } 60 cananian 1.1.2.3 CheckSet(CheckSet cs) { // new set w/ contents of given set. 61 cananian 1.1.2.3 this.readVersions.addAll(cs.readVersions); 62 cananian 1.1.2.3 this.writeVersions.addAll(cs.writeVersions); 63 cananian 1.1.2.6 this.fieldReads.addAll(cs.fieldReads); 64 cananian 1.1.2.6 this.fieldWrites.addAll(cs.fieldWrites); 65 cananian 1.1.2.6 this.elementReads.addAll(cs.elementReads); 66 cananian 1.1.2.6 this.elementWrites.addAll(cs.elementWrites); 67 cananian 1.1.2.3 } 68 cananian 1.1.2.1 CheckSet(CheckOracle co, HCodeElement hce) { 69 cananian 1.1.2.1 this.readVersions.addAll(co.createReadVersions(hce)); 70 cananian 1.1.2.1 this.writeVersions.addAll(co.createWriteVersions(hce)); 71 cananian 1.1.2.6 this.fieldReads.addAll(co.checkFieldReads(hce)); 72 cananian 1.1.2.6 this.fieldWrites.addAll(co.checkFieldWrites(hce)); 73 cananian 1.1.2.6 this.elementReads.addAll(co.checkArrayElementReads(hce)); 74 cananian 1.1.2.6 this.elementWrites.addAll(co.checkArrayElementWrites(hce)); 75 cananian 1.1.2.1 } 76 cananian 1.1.2.1 void addAll(CheckSet cs) { 77 cananian 1.1.2.1 this.readVersions.addAll(cs.readVersions); 78 cananian 1.1.2.1 this.writeVersions.addAll(cs.writeVersions); 79 cananian 1.1.2.6 this.fieldReads.addAll(cs.fieldReads); 80 cananian 1.1.2.6 this.fieldWrites.addAll(cs.fieldWrites); 81 cananian 1.1.2.6 this.elementReads.addAll(cs.elementReads); 82 cananian 1.1.2.6 this.elementWrites.addAll(cs.elementWrites); 83 cananian 1.1.2.4 } 84 cananian 1.1.2.4 /** Remove all checks which mention <code>Temp</code>s contained 85 cananian 1.1.2.4 * in the given <code>Collection</code>. */ 86 cananian 1.2.2.1 void removeAll(Collection<Temp> temps) { 87 cananian 1.2.2.1 for (Iterator<Temp> it=readVersions.iterator(); it.hasNext(); ) 88 cananian 1.2.2.1 if (temps.contains(it.next())) 89 cananian 1.1.2.4 it.remove(); 90 cananian 1.2.2.1 for (Iterator<Temp> it=writeVersions.iterator(); it.hasNext(); ) 91 cananian 1.2.2.1 if (temps.contains(it.next())) 92 cananian 1.1.2.4 it.remove(); 93 cananian 1.2.2.1 for (Iterator<RefAndField> it=fieldReads.iterator();it.hasNext();) 94 cananian 1.2.2.1 if (temps.contains(it.next().objref)) 95 cananian 1.1.2.6 it.remove(); 96 cananian 1.2.2.1 for (Iterator<RefAndField> it=fieldWrites.iterator();it.hasNext();) 97 cananian 1.2.2.1 if (temps.contains(it.next().objref)) 98 cananian 1.1.2.4 it.remove(); 99 cananian 1.2.2.1 for (Iterator<RefAndIndexAndType> it=elementReads.iterator(); 100 cananian 1.2.2.1 it.hasNext(); ) { 101 cananian 1.2.2.1 RefAndIndexAndType rit = it.next(); 102 cananian 1.1.2.6 if (temps.contains(rit.objref) || temps.contains(rit.index)) 103 cananian 1.1.2.6 it.remove(); 104 cananian 1.1.2.6 } 105 cananian 1.2.2.1 for (Iterator<RefAndIndexAndType> it=elementWrites.iterator(); 106 cananian 1.2.2.1 it.hasNext(); ) { 107 cananian 1.2.2.1 RefAndIndexAndType rit = it.next(); 108 cananian 1.1.2.4 if (temps.contains(rit.objref) || temps.contains(rit.index)) 109 cananian 1.1.2.4 it.remove(); 110 cananian 1.1.2.4 } 111 cananian 1.1.2.1 } 112 cananian 1.1.2.5 void retainAll(CheckSet cs) { 113 cananian 1.1.2.5 this.readVersions.retainAll(cs.readVersions); 114 cananian 1.1.2.5 this.writeVersions.retainAll(cs.writeVersions); 115 cananian 1.1.2.6 this.fieldReads.retainAll(cs.fieldReads); 116 cananian 1.1.2.6 this.fieldWrites.retainAll(cs.fieldWrites); 117 cananian 1.1.2.6 this.elementReads.retainAll(cs.elementReads); 118 cananian 1.1.2.6 this.elementWrites.retainAll(cs.elementWrites); 119 cananian 1.1.2.5 } 120 cananian 1.1.2.1 void removeAll(CheckSet cs) { 121 cananian 1.1.2.1 this.readVersions.removeAll(cs.readVersions); 122 cananian 1.1.2.1 this.writeVersions.removeAll(cs.writeVersions); 123 cananian 1.1.2.6 this.fieldReads.removeAll(cs.fieldReads); 124 cananian 1.1.2.6 this.fieldWrites.removeAll(cs.fieldWrites); 125 cananian 1.1.2.6 this.elementReads.removeAll(cs.elementReads); 126 cananian 1.1.2.6 this.elementWrites.removeAll(cs.elementWrites); 127 cananian 1.1.2.5 } 128 cananian 1.1.2.5 boolean isEmpty() { 129 cananian 1.1.2.5 return readVersions.isEmpty() && writeVersions.isEmpty() 130 cananian 1.1.2.6 && fieldReads.isEmpty() && fieldWrites.isEmpty() 131 cananian 1.1.2.6 && elementReads.isEmpty() && elementWrites.isEmpty(); 132 cananian 1.1.2.2 } 133 cananian 1.1.2.2 void clear() { 134 cananian 1.1.2.2 this.readVersions.clear(); 135 cananian 1.1.2.2 this.writeVersions.clear(); 136 cananian 1.1.2.6 this.fieldReads.clear(); 137 cananian 1.1.2.6 this.fieldWrites.clear(); 138 cananian 1.1.2.6 this.elementReads.clear(); 139 cananian 1.1.2.6 this.elementWrites.clear(); 140 cananian 1.1.2.2 } 141 cananian 1.2.2.2 public CheckSet clone() { return new CheckSet(this); } 142 cananian 1.1.2.2 public String toString() { 143 cananian 1.1.2.2 return "Rd: "+readVersions+" / Wr: "+writeVersions+" / "+ 144 cananian 1.1.2.6 "FldR: "+fieldReads+" / FldW: "+fieldWrites+" / "+ 145 cananian 1.1.2.6 "EleR: "+elementReads+" / EleW: "+elementWrites; 146 cananian 1.1.2.1 } 147 cananian 1.1.2.1 } 148 cananian 1.2 }