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      }