1 salcianu 1.1.2.1 // Debug.java, created Thu Feb 10 19:06:16 2000 by salcianu 2 salcianu 1.1.2.1 // Copyright (C) 2000 Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu> 3 salcianu 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 salcianu 1.1.2.1 package harpoon.Analysis.PointerAnalysis; 5 salcianu 1.1.2.1 6 salcianu 1.1.2.1 import java.util.Set; 7 salcianu 1.9 import java.util.Map; 8 salcianu 1.1.2.1 import java.util.Arrays; 9 salcianu 1.1.2.4 import java.util.Iterator; 10 salcianu 1.1.2.10 import java.util.Collection; 11 salcianu 1.1.2.1 12 salcianu 1.1.2.6 import harpoon.Util.UComp; 13 salcianu 1.1.2.3 14 salcianu 1.7 import harpoon.Util.Graphs.TopSortedCompDiGraph; 15 salcianu 1.7 16 salcianu 1.1.2.4 import harpoon.ClassFile.HMethod; 17 salcianu 1.1.2.13 import harpoon.ClassFile.HClass; 18 salcianu 1.1.2.8 import harpoon.ClassFile.HCodeElement; 19 salcianu 1.1.2.4 import harpoon.Analysis.MetaMethods.MetaMethod; 20 salcianu 1.7 import harpoon.Analysis.MetaMethods.MetaCallGraph; 21 salcianu 1.1.2.4 22 salcianu 1.9 import harpoon.Util.LightBasicBlocks.CachingSCCLBBFactory; 23 salcianu 1.1.2.7 import harpoon.Util.LightBasicBlocks.LightBasicBlock; 24 salcianu 1.1.2.7 import harpoon.Util.Graphs.SCComponent; 25 salcianu 1.1.2.7 import harpoon.ClassFile.HCodeElement; 26 salcianu 1.1.2.7 27 salcianu 1.1.2.11 import harpoon.Util.DataStructs.Relation; 28 salcianu 1.1.2.11 29 salcianu 1.1.2.1 /** 30 salcianu 1.1.2.1 * <code>Debug</code> 31 salcianu 1.1.2.1 * 32 salcianu 1.1.2.1 * @author Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu> 33 salcianu 1.10 * @version $Id: Debug.java,v 1.10 2004/03/06 21:52:23 salcianu Exp $ 34 salcianu 1.1.2.1 */ 35 salcianu 1.1.2.16 public abstract class Debug implements java.io.Serializable { 36 salcianu 1.1.2.1 37 salcianu 1.1.2.1 /** Returns a sorted array containing all the objects from 38 salcianu 1.1.2.1 <code>set</code>. Increasing lexicographic order of the 39 salcianu 1.1.2.1 string representation of the objects is used. */ 40 salcianu 1.1.2.10 public static Object[] sortedCollection(Collection col){ 41 salcianu 1.1.2.10 Object[] objs = col.toArray(new Object[col.size()]); 42 salcianu 1.1.2.10 Arrays.sort(objs, UComp.uc); 43 salcianu 1.1.2.10 return objs; 44 salcianu 1.1.2.1 } 45 salcianu 1.1.2.1 46 salcianu 1.1.2.10 public static Object[] sortedSet(Set set) { 47 salcianu 1.1.2.10 return sortedCollection(set); 48 salcianu 1.1.2.10 } 49 salcianu 1.1.2.10 50 salcianu 1.1.2.10 51 salcianu 1.1.2.1 /** Provides a string representation of a set; the elements of the 52 salcianu 1.1.2.1 set appear in increasing lexicographic order. 53 salcianu 1.1.2.1 <code>set1.equals(set2) <==> stringImg(set1).equals(stringImg(set2)).</code>*/ 54 salcianu 1.1.2.10 public static String stringImg(Collection col){ 55 salcianu 1.1.2.1 StringBuffer buffer = new StringBuffer(); 56 salcianu 1.1.2.1 57 salcianu 1.1.2.10 Object[] objs = sortedCollection(col); 58 salcianu 1.1.2.1 59 salcianu 1.1.2.1 buffer.append("[ "); 60 salcianu 1.1.2.10 for(int i = 0; i < objs.length; i++){ 61 salcianu 1.1.2.10 buffer.append(objs[i]); 62 salcianu 1.1.2.1 buffer.append(" "); 63 salcianu 1.1.2.1 } 64 salcianu 1.1.2.1 buffer.append("]"); 65 salcianu 1.1.2.2 66 salcianu 1.1.2.2 return buffer.toString(); 67 salcianu 1.1.2.2 } 68 salcianu 1.1.2.2 69 salcianu 1.1.2.2 public static String stringImg(Object[] v){ 70 salcianu 1.1.2.2 71 salcianu 1.1.2.2 if(v==null) return "null"; 72 salcianu 1.1.2.2 73 salcianu 1.1.2.2 StringBuffer buffer = new StringBuffer(); 74 salcianu 1.1.2.2 75 salcianu 1.1.2.2 Arrays.sort(v,UComp.uc); 76 salcianu 1.1.2.2 for(int i=0; i<v.length;i++){ 77 salcianu 1.1.2.2 buffer.append(v[i]); 78 salcianu 1.1.2.2 buffer.append("\n"); 79 salcianu 1.1.2.2 } 80 salcianu 1.1.2.1 81 salcianu 1.1.2.1 return buffer.toString(); 82 salcianu 1.1.2.4 } 83 salcianu 1.1.2.4 84 salcianu 1.1.2.4 /** Displays a <i>split</i> relation (see the MetaCallGraph stuff). */ 85 salcianu 1.1.2.4 public static void show_split(Relation split){ 86 cananian 1.6 for(Object hmO : split.keys()){ 87 cananian 1.6 HMethod hm = (HMethod) hmO; 88 salcianu 1.1.2.4 System.out.print(hm); 89 salcianu 1.1.2.11 System.out.println(" (" + split.getValues(hm).size() + 90 salcianu 1.1.2.4 " specialization(s))"); 91 salcianu 1.1.2.11 Iterator itmm = split.getValues(hm).iterator(); 92 salcianu 1.1.2.11 while(itmm.hasNext()) { 93 salcianu 1.1.2.4 System.out.print(" "); 94 salcianu 1.1.2.4 System.out.println((MetaMethod)itmm.next()); 95 salcianu 1.1.2.4 } 96 salcianu 1.1.2.4 } 97 salcianu 1.1.2.5 } 98 salcianu 1.1.2.5 99 salcianu 1.1.2.7 100 salcianu 1.1.2.7 public static void show_lbb(LightBasicBlock lbb){ 101 salcianu 1.1.2.7 System.out.println(" " + lbb + "{"); 102 salcianu 1.1.2.7 HCodeElement[] hces = lbb.getElements(); 103 salcianu 1.1.2.7 for(int i = 0; i < hces.length; i++) 104 salcianu 1.1.2.7 System.out.println(" " + hces[i].getSourceFile() + ":" + 105 salcianu 1.1.2.7 hces[i].getLineNumber() + " " + hces[i]); 106 salcianu 1.1.2.7 107 salcianu 1.1.2.7 LightBasicBlock[] prev = lbb.getPrevLBBs(); 108 salcianu 1.1.2.7 if(prev.length != 0){ 109 salcianu 1.1.2.7 System.out.print(" Prev: "); 110 salcianu 1.1.2.7 for(int i = 0; i < prev.length; i++) 111 salcianu 1.1.2.7 System.out.print(prev[i] + " "); 112 salcianu 1.1.2.7 System.out.println(); 113 salcianu 1.1.2.7 } 114 salcianu 1.1.2.7 115 salcianu 1.1.2.7 LightBasicBlock[] next = lbb.getNextLBBs(); 116 salcianu 1.1.2.7 if(next.length != 0){ 117 salcianu 1.1.2.7 System.out.print(" Next: "); 118 salcianu 1.1.2.7 for(int i = 0; i < next.length; i++) 119 salcianu 1.1.2.7 System.out.print(next[i] + " "); 120 salcianu 1.1.2.7 System.out.println(); 121 salcianu 1.1.2.7 } 122 salcianu 1.1.2.7 123 salcianu 1.1.2.7 System.out.println(" }"); 124 salcianu 1.1.2.7 } 125 salcianu 1.1.2.7 126 salcianu 1.8 public static void show_lbb_scc 127 salcianu 1.9 (MetaMethod mm, TopSortedCompDiGraph<LightBasicBlock> ts_sccs) { 128 salcianu 1.9 129 salcianu 1.9 System.out.println("THE CODE FOR :" + mm.getHMethod()); 130 salcianu 1.9 131 salcianu 1.8 for(SCComponent scc : ts_sccs.decrOrder()) { 132 salcianu 1.1.2.7 System.out.println("SCC" + scc.getId() + "{"); 133 salcianu 1.10 Object nodes[] = scc.nodes().toArray(); 134 salcianu 1.5 Arrays.sort(nodes, harpoon.Util.UComp.uc); 135 salcianu 1.5 for(int i = 0; i < nodes.length; i++) 136 salcianu 1.5 show_lbb((LightBasicBlock) nodes[i]); 137 salcianu 1.1.2.7 System.out.println("}"); 138 salcianu 1.1.2.7 } 139 salcianu 1.1.2.7 } 140 salcianu 1.1.2.5 141 salcianu 1.1.2.9 142 salcianu 1.1.2.13 /** Checks whether the method <code>hm</code> is the method named 143 salcianu 1.1.2.13 <code>mthd</code> from the class named <code>cls</code>. */ 144 salcianu 1.1.2.13 public static boolean isThatOne(HMethod hm, String cls, String mthd) { 145 salcianu 1.1.2.13 return 146 salcianu 1.1.2.13 hm.getName().equals(mthd) && 147 salcianu 1.1.2.13 hm.getDeclaringClass().getName().equals(cls); 148 salcianu 1.3 } 149 salcianu 1.7 150 salcianu 1.7 /** Pretty print debug function for SCC's of <code>MetaMethod</code>s. */ 151 salcianu 1.7 public static String sccToString(SCComponent scc, MetaCallGraph mcg) { 152 salcianu 1.7 StringBuffer buffer = new StringBuffer(); 153 salcianu 1.7 154 salcianu 1.7 buffer.append("SCC" + scc.getId() + " (size " + scc.size() + ") {\n"); 155 salcianu 1.7 156 salcianu 1.10 for(Object o : scc.nodes()) { 157 salcianu 1.9 buffer.append(" ").append(o).append("\n"); 158 salcianu 1.9 int k = 0; 159 salcianu 1.10 for(Object next : mcg.getCallees((MetaMethod) o)) 160 salcianu 1.10 if(scc.contains(next)) { 161 salcianu 1.10 buffer.append(" ").append(next).append("\n"); 162 salcianu 1.9 k++; 163 salcianu 1.9 } 164 salcianu 1.9 if(k > 0) 165 salcianu 1.9 buffer.append("\n"); 166 salcianu 1.7 } 167 salcianu 1.7 buffer.append("}\n"); 168 salcianu 1.7 169 salcianu 1.7 int nb_prev = scc.prevLength(); 170 salcianu 1.7 if(nb_prev > 0) { 171 salcianu 1.7 buffer.append("Prev:"); 172 salcianu 1.7 for(int i = 0; i < nb_prev ; i++) { 173 salcianu 1.7 buffer.append(" SCC" + scc.prev(i).getId()); 174 salcianu 1.7 } 175 salcianu 1.7 buffer.append("\n"); 176 salcianu 1.7 } 177 salcianu 1.7 178 salcianu 1.7 int nb_next = scc.nextLength(); 179 salcianu 1.7 if(nb_next > 0) { 180 salcianu 1.7 buffer.append("Next:"); 181 salcianu 1.7 for(int i = 0; i < nb_next ; i++) { 182 salcianu 1.7 buffer.append(" SCC" + scc.next(i).getId()); 183 salcianu 1.7 } 184 salcianu 1.7 buffer.append("\n"); 185 salcianu 1.7 } 186 salcianu 1.7 187 salcianu 1.7 return buffer.toString(); 188 salcianu 1.7 } 189 salcianu 1.7 190 salcianu 1.7 191 salcianu 1.7 // Displays all stringly connected components of methods 192 salcianu 1.7 static void display_mm_sccs 193 salcianu 1.8 (TopSortedCompDiGraph<MetaMethod> ts_mmethods, 194 salcianu 1.8 MetaCallGraph mcg, long time) { 195 salcianu 1.7 int counter = 0; 196 salcianu 1.7 int mmethods = 0; 197 salcianu 1.7 198 salcianu 1.7 if(PointerAnalysis.DEBUG_SCC) 199 salcianu 1.7 System.out.println("===== SCCs of methods ====="); 200 salcianu 1.7 201 salcianu 1.8 for(SCComponent scc : ts_mmethods.incrOrder()) { 202 salcianu 1.8 if(PointerAnalysis.DEBUG_SCC) 203 salcianu 1.7 System.out.print(Debug.sccToString(scc, mcg)); 204 salcianu 1.7 counter++; 205 salcianu 1.10 mmethods += scc.nodes().size(); 206 salcianu 1.7 } 207 salcianu 1.7 208 salcianu 1.7 if(PointerAnalysis.DEBUG_SCC) 209 salcianu 1.7 System.out.println("===== END SCCs ============"); 210 salcianu 1.7 211 salcianu 1.7 if(PointerAnalysis.TIMING) 212 salcianu 1.7 System.out.println(counter + " component(s); " + 213 salcianu 1.7 mmethods + " meta-method(s); " + 214 salcianu 1.7 time + "ms processing time"); 215 salcianu 1.7 } 216 salcianu 1.7 217 salcianu 1.9 // prints method name and size information 218 salcianu 1.9 static void print_method_stats 219 salcianu 1.9 (MetaMethod mm, CachingSCCLBBFactory scc_lbb_factory) { 220 salcianu 1.9 HMethod hm = mm.getHMethod(); 221 salcianu 1.9 222 salcianu 1.9 int nb_sccs = 0; 223 salcianu 1.9 int nb_lbbs = 0; 224 salcianu 1.9 int nb_instrs = 0; 225 salcianu 1.9 226 salcianu 1.9 for(SCComponent scc : scc_lbb_factory.computeSCCLBB(hm).decrOrder()) { 227 salcianu 1.9 nb_sccs++; 228 salcianu 1.10 nb_lbbs += scc.nodes().size(); 229 salcianu 1.10 for(Object lbb0 : scc.nodes()) 230 salcianu 1.10 nb_instrs += ((LightBasicBlock) lbb0).getElements().length; 231 salcianu 1.9 } 232 salcianu 1.9 233 salcianu 1.9 System.out.println("METHOD: " + hm); 234 salcianu 1.9 System.out.println("size: " + 235 salcianu 1.9 nb_sccs + " SCCs; " + 236 salcianu 1.9 nb_lbbs + " LBBs; " + 237 salcianu 1.9 nb_instrs + " instrs"); 238 salcianu 1.9 } 239 salcianu 1.9 240 salcianu 1.9 static void print_lbb(LightBasicBlock lbb, Map lbb2passes) { 241 salcianu 1.9 Integer ipass = (Integer) lbb2passes.get(lbb); 242 salcianu 1.9 int pass = ((ipass == null) ? 0 : ipass.intValue()) + 1; 243 salcianu 1.9 lbb2passes.put(lbb, new Integer(pass)); 244 salcianu 1.9 System.out.println 245 salcianu 1.9 ("\nBEGIN: Analyze_basic_block " + lbb + " pass: " + pass); 246 salcianu 1.9 System.out.print("Prev BBs: "); 247 salcianu 1.9 Object[] prev_lbbs = lbb.getPrevLBBs(); 248 salcianu 1.9 Arrays.sort(prev_lbbs, UComp.uc); 249 salcianu 1.9 for(int i = 0 ; i < prev_lbbs.length ; i++) 250 salcianu 1.9 System.out.print((LightBasicBlock) prev_lbbs[i] + " "); 251 salcianu 1.9 System.out.println(); 252 salcianu 1.9 } 253 cananian 1.2 }