00001 package ca.mcgill.sable.soot.jimple;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 import ca.mcgill.sable.soot.*;
00085 import ca.mcgill.sable.util.*;
00086
00087
00088
00089 public class SparseLocalDefs implements LocalDefs
00090 {
00091 Map localStmtPairToDefs;
00092 LiveLocals liveLocals;
00093
00094 class LocalStmtPair
00095 {
00096 Local local;
00097 Stmt stmt;
00098
00099 LocalStmtPair(Local local, Stmt stmt)
00100 {
00101 this.local = local;
00102 this.stmt = stmt;
00103 }
00104
00105 public boolean equals(Object other)
00106 {
00107 if(other instanceof LocalStmtPair &&
00108 ((LocalStmtPair) other).local == this.local &&
00109 ((LocalStmtPair) other).stmt == this.stmt)
00110 {
00111 return true;
00112 }
00113 else
00114 return false;
00115 }
00116
00117 public int hashCode()
00118 {
00119 return local.hashCode() * 101 + stmt.hashCode() + 17;
00120 }
00121 }
00122 public SparseLocalDefs(CompleteStmtGraph g, LiveLocals liveLocals)
00123 {
00124 if(Main.isProfilingOptimization)
00125 Main.defsTimer.start();
00126
00127 if(Main.isVerbose)
00128 System.out.println("[" + g.getBody().getMethod().getName() +
00129 "] Constructing SparseLocalDefs...");
00130
00131 SparseLocalDefsFlowAnalysis analysis = new SparseLocalDefsFlowAnalysis(g, liveLocals);
00132
00133 if(Main.isProfilingOptimization)
00134 Main.defsPostTimer.start();
00135
00136
00137 {
00138 Iterator stmtIt = g.iterator();
00139
00140 localStmtPairToDefs = new HashMap(g.size() * 2 + 1, 0.7f);
00141
00142 while(stmtIt.hasNext())
00143 {
00144 Stmt s = (Stmt) stmtIt.next();
00145
00146 Iterator boxIt = s.getUseBoxes().iterator();
00147
00148 while(boxIt.hasNext())
00149 {
00150 ValueBox box = (ValueBox) boxIt.next();
00151
00152 if(box.getValue() instanceof Local)
00153 {
00154 Local l = (Local) box.getValue();
00155 LocalStmtPair pair = new LocalStmtPair(l, s);
00156
00157 if(!localStmtPairToDefs.containsKey(pair))
00158 {
00159 FlowSet value = (FlowSet) analysis.getFlowBeforeStmt(s);
00160
00161 List allLocalDefs = value.toList();
00162
00163
00164 {
00165 List localDefs = new ArrayList();
00166 Iterator defIt = allLocalDefs.iterator();
00167
00168 while(defIt.hasNext())
00169 {
00170 DefinitionStmt d = (DefinitionStmt) defIt.next();
00171
00172 if(d.getLeftOp() == l)
00173 localDefs.add(d);
00174 }
00175
00176 localStmtPairToDefs.put(pair, Collections.unmodifiableList(localDefs));
00177 }
00178 }
00179 }
00180 }
00181 }
00182 }
00183
00184 if(Main.isProfilingOptimization)
00185 Main.defsPostTimer.end();
00186
00187 if(Main.isProfilingOptimization)
00188 Main.defsTimer.end();
00189 }
00190 public List getDefsOfAt(Local l, Stmt s)
00191 {
00192 LocalStmtPair pair = new LocalStmtPair(l, s);
00193
00194 return (List) localStmtPairToDefs.get(pair);
00195 }
00196 }