1 salcianu 1.1 // EventDrivenTransformation.java, created Sat Apr 12 17:18:22 2003 by salcianu
  2 salcianu 1.1 // Copyright (C) 2003 Alexandru Salcianu <salcianu@MIT.EDU>
  3 salcianu 1.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 salcianu 1.1 package harpoon.Main;
  5 salcianu 1.1 
  6 salcianu 1.1 import harpoon.ClassFile.HCode;
  7 salcianu 1.1 import harpoon.ClassFile.HMethod;
  8 salcianu 1.1 import harpoon.ClassFile.CachingCodeFactory;
  9 salcianu 1.1 
 10 salcianu 1.1 import harpoon.Analysis.Quads.QuadClassHierarchy;
 11 salcianu 1.1 
 12 salcianu 1.1 import harpoon.Analysis.MetaMethods.MetaCallGraph;
 13 salcianu 1.1 import harpoon.Analysis.MetaMethods.MetaCallGraphImpl;
 14 salcianu 1.1 
 15 salcianu 1.1 import harpoon.Analysis.EventDriven.EventDriven;
 16 salcianu 1.1 
 17 salcianu 1.1 import harpoon.Util.Options.Option;
 18 salcianu 1.1 
 19 salcianu 1.1 import java.util.Iterator;
 20 salcianu 1.1 import java.util.Set;
 21 salcianu 1.1 import java.util.HashSet;
 22 salcianu 1.1 import java.util.List;
 23 salcianu 1.1 import java.util.LinkedList;
 24 salcianu 1.1 import java.util.Collection;
 25 salcianu 1.1 
 26 salcianu 1.1 /**
 27 salcianu 1.1  * <code>EventDrivenTransformation</code>
 28 salcianu 1.1  * 
 29 salcianu 1.1  * @author  Alexandru Salcianu <salcianu@MIT.EDU>
 30 salcianu 1.2  * @version $Id: EventDrivenTransformation.java,v 1.2 2003/04/22 00:09:57 salcianu Exp $
 31 salcianu 1.1  */
 32 salcianu 1.1 public abstract class EventDrivenTransformation {
 33 salcianu 1.1     
 34 salcianu 1.1     static boolean EVENTDRIVEN = false;
 35 salcianu 1.1     private static MetaCallGraph mcg = null;
 36 salcianu 1.1     private static boolean recycle = false;
 37 salcianu 1.1     private static boolean optimistic = false;
 38 salcianu 1.1 
 39 salcianu 1.1     private static boolean _enabled() { return EVENTDRIVEN; }
 40 salcianu 1.1 
 41 salcianu 1.1     private static List/*<Option>*/ getOptions() {
 42 salcianu 1.1         List/*<Option>*/ opts = new LinkedList/*<Option>*/();
 43 salcianu 1.1         opts.add(new Option("E", "Event Driven transformation") {
 44 salcianu 1.1             public void action() { EVENTDRIVEN = true; }
 45 salcianu 1.1         });
 46 salcianu 1.1         opts.add(new Option("p", "Optimistic option for EventDriven") {
 47 salcianu 1.1             public void action() { optimistic = true; }
 48 salcianu 1.1         });
 49 salcianu 1.1         opts.add(new Option("f",
 50 salcianu 1.1                             "Recycle option for EventDriven. " + 
 51 salcianu 1.1                             "Environmentally (f)riendly") {
 52 salcianu 1.1             public void action() { recycle = true; }
 53 salcianu 1.1         });
 54 salcianu 1.1         return opts;
 55 salcianu 1.1     }
 56 salcianu 1.1 
 57 salcianu 1.1     public static class QuadPass1 extends CompilerStageEZ {
 58 salcianu 1.1         public QuadPass1() { super("event-driven-quad-pass-1"); }
 59 salcianu 1.2         public boolean enabled() { return _enabled(); }
 60 salcianu 1.1 
 61 salcianu 1.1         // Pass 1 returns the options for the entire transformation
 62 salcianu 1.1         public List/*<Option>*/ getOptions() {
 63 salcianu 1.1             return EventDrivenTransformation.getOptions();
 64 salcianu 1.1         }
 65 salcianu 1.1 
 66 salcianu 1.1         protected void real_action() {
 67 salcianu 1.1             hcf = harpoon.IR.Quads.QuadNoSSA.codeFactory(hcf);
 68 salcianu 1.1             Set mroots = 
 69 salcianu 1.1                 extract_method_roots
 70 salcianu 1.1                 (frame.getRuntime().runtimeCallableMethods());
 71 salcianu 1.1             mroots.add(mainM);
 72 salcianu 1.1             mcg = new MetaCallGraphImpl
 73 salcianu 1.1                 (new CachingCodeFactory(hcf), linker, classHierarchy, mroots);
 74 salcianu 1.1         }
 75 salcianu 1.1 
 76 salcianu 1.1         // extract the method roots from the set of all the roots
 77 salcianu 1.1         // (methods and classes)
 78 salcianu 1.1         private Set extract_method_roots(Collection roots){
 79 salcianu 1.1             Set mroots = new HashSet();
 80 salcianu 1.1             for(Iterator it = roots.iterator(); it.hasNext(); ){
 81 salcianu 1.1                 Object obj = it.next();
 82 salcianu 1.1                 if(obj instanceof HMethod)
 83 salcianu 1.1                     mroots.add(obj);
 84 salcianu 1.1             }
 85 salcianu 1.1             return mroots;
 86 salcianu 1.1         }
 87 salcianu 1.1     };
 88 salcianu 1.1 
 89 salcianu 1.1     
 90 salcianu 1.1     public static class QuadPass2 extends CompilerStageEZ {
 91 salcianu 1.1         public QuadPass2() { super("event-driven-quad-pass-2"); }
 92 salcianu 1.2         public boolean enabled() { return _enabled(); }
 93 salcianu 1.1 
 94 salcianu 1.1         protected void real_action() {
 95 salcianu 1.1             if (!SAMain.OPTIMIZE) {
 96 salcianu 1.1                 hcf = harpoon.IR.Quads.QuadSSI.codeFactory(hcf); 
 97 salcianu 1.1             }
 98 salcianu 1.1             hcf = new CachingCodeFactory(hcf, true);
 99 salcianu 1.1             HCode hc = hcf.convert(mainM);
100 salcianu 1.1             EventDriven ed = 
101 salcianu 1.1                 new EventDriven((CachingCodeFactory) hcf, hc,
102 salcianu 1.1                                 classHierarchy, linker, optimistic, recycle);
103 salcianu 1.1             mainM=ed.convert(mcg);
104 salcianu 1.1             mcg=null; /*Memory management*/
105 salcianu 1.1             hcf = new CachingCodeFactory(hcf);
106 salcianu 1.1             Set eroots = new java.util.HashSet
107 salcianu 1.1                 (frame.getRuntime().runtimeCallableMethods());
108 salcianu 1.1             // and our main method is a root, too...
109 salcianu 1.1             eroots.add(mainM);
110 salcianu 1.1             hcf = new CachingCodeFactory(hcf);
111 salcianu 1.1             classHierarchy = new QuadClassHierarchy(linker, eroots, hcf);
112 salcianu 1.1         }
113 salcianu 1.1     };
114 salcianu 1.1     
115 salcianu 1.1 }