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