1 salcianu 1.1 // Transactions.java, created Sat Apr 12 15:17:41 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 
 7 salcianu 1.1 import harpoon.Analysis.Quads.QuadClassHierarchy;
 8 salcianu 1.1 import harpoon.Analysis.Transactions.SyncTransformer;
 9 cananian 1.3 import harpoon.Backend.Generic.Frame;
10 cananian 1.3 import harpoon.ClassFile.HData;
11 salcianu 1.1 import harpoon.Util.Options.Option;
12 salcianu 1.1 
13 cananian 1.3 import java.util.Arrays;
14 cananian 1.3 import java.util.Iterator;
15 salcianu 1.1 import java.util.List;
16 salcianu 1.1 import java.util.LinkedList;
17 salcianu 1.1 
18 salcianu 1.1 
19 salcianu 1.1 /**
20 salcianu 1.1  * <code>Transactions</code>
21 salcianu 1.1  * 
22 salcianu 1.1  * @author  Alexandru Salcianu <salcianu@MIT.EDU>
23 cananian 1.3  * @version $Id: Transactions.java,v 1.3 2003/07/21 21:21:55 cananian Exp $
24 salcianu 1.1  */
25 salcianu 1.1 public abstract class Transactions {
26 salcianu 1.1     
27 cananian 1.3     static boolean DO_TRANSACTIONS = false;
28 salcianu 1.1     private static SyncTransformer syncTransformer = null;
29 salcianu 1.1 
30 salcianu 1.1     private static boolean enabled() { return DO_TRANSACTIONS; }
31 salcianu 1.1 
32 salcianu 1.1     public static class QuadPass extends CompilerStageEZ {
33 salcianu 1.1         public QuadPass() { super("transactions.quad-pass"); }
34 salcianu 1.1 
35 cananian 1.3         public List<Option> getOptions() {
36 cananian 1.3             return Arrays.asList(new Option[] {
37 cananian 1.3                 new Option("T", "Transactions support (CSA)") {
38 cananian 1.3                     public void action() { DO_TRANSACTIONS = true; }
39 cananian 1.3                 }
40 salcianu 1.1             });
41 salcianu 1.1         }
42 salcianu 1.2 
43 salcianu 1.2         public boolean enabled() { return Transactions.enabled(); }
44 salcianu 1.1         
45 salcianu 1.1         public void real_action() {
46 salcianu 1.1             if(!DO_TRANSACTIONS) return;
47 salcianu 1.1             String resource = frame.getRuntime().resourcePath
48 cananian 1.3                 ("transact-root.properties");
49 salcianu 1.1             hcf = harpoon.IR.Quads.QuadSSI.codeFactory(hcf);
50 salcianu 1.1             hcf = new harpoon.Analysis.Transactions.ArrayCopyImplementer
51 salcianu 1.1                 (hcf, linker);
52 salcianu 1.1             hcf = new harpoon.Analysis.Transactions.CloneImplementer
53 salcianu 1.1                 (hcf, linker, classHierarchy.classes());
54 salcianu 1.1             hcf = new harpoon.ClassFile.CachingCodeFactory(hcf);
55 salcianu 1.1             classHierarchy = new QuadClassHierarchy(linker, roots, hcf);
56 salcianu 1.1             
57 salcianu 1.1             hcf = new harpoon.Analysis.Quads.ArrayInitRemover(hcf)
58 salcianu 1.1                 .codeFactory();
59 salcianu 1.1             hcf = new harpoon.ClassFile.CachingCodeFactory(hcf);
60 salcianu 1.1             
61 salcianu 1.1             syncTransformer = new SyncTransformer
62 salcianu 1.1                 (hcf, classHierarchy, linker, mainM, roots, resource);
63 cananian 1.3             roots.addAll(syncTransformer.transRoots());
64 salcianu 1.1             hcf = syncTransformer.codeFactory();
65 salcianu 1.1             hcf = harpoon.Analysis.Counters.CounterFactory
66 salcianu 1.1                 .codeFactory(hcf, linker, mainM);
67 salcianu 1.1             hcf = new harpoon.ClassFile.CachingCodeFactory(hcf);
68 salcianu 1.1             classHierarchy = new QuadClassHierarchy(linker, roots, hcf);
69 salcianu 1.1             // config checking
70 salcianu 1.1             frame.getRuntime().configurationSet.add
71 salcianu 1.1                 ("check_with_transactions_needed");   
72 salcianu 1.1         }
73 salcianu 1.1     }
74 salcianu 1.1 
75 salcianu 1.1 
76 salcianu 1.1     public static class TreePass extends CompilerStageEZ {
77 salcianu 1.1         public TreePass() { super("transactions.tree-pass"); }
78 salcianu 1.2         public boolean enabled() { return Transactions.enabled(); }
79 salcianu 1.1         
80 salcianu 1.1         public void real_action() {
81 salcianu 1.1             // just to be safe, we'll do the algebraic simplication before
82 salcianu 1.1             // the pattern-matching in SyncTransformer occurs.
83 salcianu 1.1             hcf = 
84 salcianu 1.1                 harpoon.Analysis.Tree.AlgebraicSimplification.codeFactory(hcf);
85 salcianu 1.1             hcf = syncTransformer.treeCodeFactory(frame, hcf);
86 salcianu 1.1         }
87 salcianu 1.1     }
88 cananian 1.3 
89 cananian 1.3     public static Iterator<HData> filterData(Frame f, Iterator<HData> it) {
90 cananian 1.3         return syncTransformer.filterData(f, it);
91 cananian 1.3     }
92 salcianu 1.1 }