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 }