1 bdemsky 1.1.2.1 // LockRemove.java, created Fri Nov 12 14:03:59 1999 by kkz 2 cananian 1.1.2.2 // Copyright (C) 1999 Karen K. Zee <kkz@alum.mit.edu> 3 bdemsky 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 bdemsky 1.1.2.1 package harpoon.Analysis.EventDriven; 5 bdemsky 1.1.2.1 6 bdemsky 1.1.2.1 import harpoon.ClassFile.HCode; 7 bdemsky 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 8 bdemsky 1.1.2.1 import harpoon.ClassFile.HClass; 9 bdemsky 1.1.2.1 import harpoon.ClassFile.HMethod; 10 bdemsky 1.1.2.1 import harpoon.ClassFile.Linker; 11 bdemsky 1.1.2.1 import harpoon.IR.Quads.MONITORENTER; 12 bdemsky 1.1.2.1 import harpoon.IR.Quads.MONITOREXIT; 13 bdemsky 1.1.2.1 import harpoon.IR.Quads.Quad; 14 bdemsky 1.1.2.1 import harpoon.IR.Quads.QuadVisitor; 15 bdemsky 1.1.2.1 import harpoon.IR.Quads.QuadNoSSA; 16 bdemsky 1.1.2.1 import harpoon.Temp.Temp; 17 bdemsky 1.1.2.1 import harpoon.Util.Tuple; 18 cananian 1.3 import net.cscott.jutil.WorkSet; 19 bdemsky 1.1.2.1 20 bdemsky 1.1.2.1 import java.util.HashMap; 21 bdemsky 1.1.2.1 import java.util.Iterator; 22 bdemsky 1.1.2.1 import java.util.Map; 23 bdemsky 1.1.2.1 import java.util.Set; 24 bdemsky 1.1.2.1 25 bdemsky 1.1.2.1 /** 26 bdemsky 1.1.2.1 * <code>LockRemove</code> 27 bdemsky 1.1.2.1 * 28 cananian 1.1.2.2 * @author Karen K. Zee <kkz@alum.mit.edu> 29 cananian 1.3 * @version $Id: LockRemove.java,v 1.3 2004/02/08 01:51:58 cananian Exp $ 30 bdemsky 1.1.2.1 */ 31 bdemsky 1.1.2.1 public class LockRemove implements HCodeFactory { 32 bdemsky 1.1.2.1 Set hclassSet; 33 bdemsky 1.1.2.1 Map typeMap; 34 bdemsky 1.1.2.1 HCodeFactory parent; 35 bdemsky 1.1.2.1 36 bdemsky 1.1.2.1 public LockRemove(Set hclassSet, Map typeMap, HCodeFactory parent) { 37 bdemsky 1.1.2.1 this.hclassSet=hclassSet; 38 bdemsky 1.1.2.1 this.typeMap=typeMap; 39 bdemsky 1.1.2.1 this.parent=parent; 40 bdemsky 1.1.2.1 } 41 bdemsky 1.1.2.1 42 bdemsky 1.1.2.1 public void clear(HMethod m) { parent.clear(m); } 43 bdemsky 1.1.2.1 44 bdemsky 1.1.2.1 public String getCodeName() { return parent.getCodeName(); } 45 bdemsky 1.1.2.1 46 bdemsky 1.1.2.1 public HCode convert(HMethod m) { 47 bdemsky 1.1.2.1 // Clone the class that main was in, and replace it 48 bdemsky 1.1.2.1 HCode hc = parent.convert(m); 49 bdemsky 1.1.2.1 if (hc!=null) 50 bdemsky 1.1.2.1 stripLocks(hc); 51 bdemsky 1.1.2.1 return hc; 52 bdemsky 1.1.2.1 } 53 bdemsky 1.1.2.1 54 bdemsky 1.1.2.1 private void stripLocks(HCode hc) { 55 bdemsky 1.1.2.1 WorkSet done=new WorkSet(); 56 bdemsky 1.1.2.1 WorkSet todo=new WorkSet(); 57 bdemsky 1.1.2.1 LockVisitor visitor=new LockVisitor(hclassSet, typeMap,hc); 58 bdemsky 1.1.2.1 todo.add(hc.getRootElement()); 59 bdemsky 1.1.2.1 while(!todo.isEmpty()) { 60 bdemsky 1.1.2.1 Quad q=(Quad)todo.pop(); 61 bdemsky 1.1.2.1 done.add(q); 62 bdemsky 1.1.2.1 for (int i=0;i<q.nextLength();i++) 63 bdemsky 1.1.2.1 if (!done.contains(q.next(i))) 64 bdemsky 1.1.2.1 todo.add(q.next(i)); 65 bdemsky 1.1.2.1 q.accept(visitor); 66 bdemsky 1.1.2.1 } 67 bdemsky 1.1.2.1 } 68 bdemsky 1.1.2.1 69 bdemsky 1.1.2.1 static class LockVisitor extends QuadVisitor { 70 bdemsky 1.1.2.1 Set hclassSet; 71 bdemsky 1.1.2.1 Map typeMap; 72 bdemsky 1.1.2.1 HCode hc; 73 bdemsky 1.1.2.1 74 bdemsky 1.1.2.1 LockVisitor(Set hclassSet, Map typeMap, HCode hc) { 75 bdemsky 1.1.2.1 this.hclassSet=hclassSet; 76 bdemsky 1.1.2.1 this.typeMap=typeMap; 77 bdemsky 1.1.2.1 this.hc=hc; 78 bdemsky 1.1.2.1 } 79 bdemsky 1.1.2.1 80 bdemsky 1.1.2.1 public void visit(Quad q) {} 81 bdemsky 1.1.2.1 82 bdemsky 1.1.2.1 public void visit(MONITORENTER q) { 83 bdemsky 1.1.2.1 // Temp lock=q.lock(); 84 bdemsky 1.1.2.1 boolean remove=true; 85 bdemsky 1.1.2.1 // HClass hcl=null; 86 bdemsky 1.1.2.1 // if (typeMap.containsKey(new Tuple(new Object[] {q,lock}))) 87 bdemsky 1.1.2.1 // hcl=(HClass)typeMap.get(new Tuple(new Object[] {q,lock})); 88 bdemsky 1.1.2.1 // else 89 bdemsky 1.1.2.1 // hcl=((QuadNoSSA)hc).typeMap.typeMap(q,lock); 90 bdemsky 1.1.2.1 // Iterator iter=hclassSet.iterator(); 91 bdemsky 1.1.2.1 // while (iter.hasNext()) { 92 bdemsky 1.1.2.1 // HClass oth=(HClass)iter.next(); 93 bdemsky 1.1.2.1 // System.out.println(oth+" "+hcl); 94 bdemsky 1.1.2.1 // if (oth.isAssignableFrom(hcl)|| 95 bdemsky 1.1.2.1 // hcl.isAssignableFrom(oth)) { 96 bdemsky 1.1.2.1 // remove=false; 97 bdemsky 1.1.2.1 // break; 98 bdemsky 1.1.2.1 // } 99 bdemsky 1.1.2.1 // } 100 bdemsky 1.1.2.1 101 bdemsky 1.1.2.1 if (remove) 102 bdemsky 1.1.2.1 Quad.addEdge(q.prev(0),q.prevEdge(0).which_succ(), 103 bdemsky 1.1.2.1 q.next(0),q.nextEdge(0).which_pred()); 104 bdemsky 1.1.2.1 } 105 bdemsky 1.1.2.1 106 bdemsky 1.1.2.1 public void visit(MONITOREXIT q) { 107 bdemsky 1.1.2.1 // Temp lock=q.lock(); 108 bdemsky 1.1.2.1 boolean remove=true; 109 bdemsky 1.1.2.1 // HClass hcl=null; 110 bdemsky 1.1.2.1 // if (typeMap.containsKey(new Tuple(new Object[] {q,lock}))) 111 bdemsky 1.1.2.1 // hcl=(HClass)typeMap.get(new Tuple(new Object[] {q,lock})); 112 bdemsky 1.1.2.1 // else 113 bdemsky 1.1.2.1 // hcl=((QuadNoSSA)hc).typeMap.typeMap(q,lock); 114 bdemsky 1.1.2.1 // Iterator iter=hclassSet.iterator(); 115 bdemsky 1.1.2.1 // while (iter.hasNext()) { 116 bdemsky 1.1.2.1 // HClass oth=(HClass)iter.next(); 117 bdemsky 1.1.2.1 // System.out.println(oth+" "+hcl); 118 bdemsky 1.1.2.1 // if (oth.isAssignableFrom(hcl)|| 119 bdemsky 1.1.2.1 // hcl.isAssignableFrom(oth)) { 120 bdemsky 1.1.2.1 // remove=false; 121 bdemsky 1.1.2.1 // break; 122 bdemsky 1.1.2.1 // } 123 bdemsky 1.1.2.1 // } 124 bdemsky 1.1.2.1 125 bdemsky 1.1.2.1 if (remove) 126 bdemsky 1.1.2.1 Quad.addEdge(q.prev(0),q.prevEdge(0).which_succ(), 127 bdemsky 1.1.2.1 q.next(0),q.nextEdge(0).which_pred()); 128 bdemsky 1.1.2.1 } 129 bdemsky 1.1.2.1 } 130 bdemsky 1.1.2.1 } 131 bdemsky 1.1.2.1 132 cananian 1.2