1 salcianu 1.1 // Backend.java, created Fri Mar 28 13:18:46 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.Backend;
 5 salcianu 1.1 
 6 salcianu 1.1 import harpoon.Backend.Runtime1.AllocationStrategyFactory;
 7 salcianu 1.1 import harpoon.Backend.Generic.Frame;
 8 salcianu 1.1 import harpoon.ClassFile.HMethod;
 9 salcianu 1.1 
10 salcianu 1.1 /**
11 salcianu 1.2  * <code>Backend</code> is a convenient, top-level class for our many
12 salcianu 1.2  * backends.
13 salcianu 1.1  * 
14 salcianu 1.1  * @author  Alexandru Salcianu <salcianu@MIT.EDU>
15 salcianu 1.2  * @version $Id: Backend.java,v 1.2 2003/03/28 20:26:22 salcianu Exp $ */
16 salcianu 1.1 public abstract class Backend {
17 salcianu 1.1 
18 salcianu 1.1     /** StrongARM backend */
19 salcianu 1.1     public static final String STRONGARM = "strongarm".intern();
20 salcianu 1.1     /** MIPS backend */
21 salcianu 1.1     public static final String MIPS      = "mips".intern();
22 salcianu 1.1     /** SPARC backend */
23 salcianu 1.1     public static final String SPARC     = "sparc".intern();
24 salcianu 1.1     /** PreciseC backend.  In this case, the compiler generates C
25 salcianu 1.1         files, full of data layout information to support precise
26 salcianu 1.1         garbage collectors. */
27 salcianu 1.1     public static final String PRECISEC  = "precisec".intern();
28 salcianu 1.1     /** MIPS with support for last line accesses is tag unchecked */
29 salcianu 1.1     public static final String MIPSYP    = "mipsyp".intern();
30 salcianu 1.1     /** MIPS with support for direct address registers */
31 salcianu 1.1     public static final String MIPSDA    = "mipsda".intern();
32 salcianu 1.1 
33 salcianu 1.1 
34 salcianu 1.1     /** Create a frame object, given the name of a backend.
35 salcianu 1.1 
36 salcianu 1.1         @param backendName string name of the backend
37 salcianu 1.1 
38 salcianu 1.1         @param mainMethod  main method of the compiled program
39 salcianu 1.1 
40 salcianu 1.1         @param asFact factory that produces the
41 salcianu 1.1         <code>AllocationStrategy</code> for compiling allocation
42 salcianu 1.1         sites.  Currently, relevant only for the <code>PreciseC</code>
43 salcianu 1.1         backend.*/
44 salcianu 1.1     public static Frame getFrame(String backendName, HMethod mainMethod,
45 salcianu 1.1                                  AllocationStrategyFactory asFact)
46 salcianu 1.1     {
47 salcianu 1.1         backendName = backendName.intern();
48 salcianu 1.2 
49 salcianu 1.2         // TODO: use reflection
50 salcianu 1.1         if (backendName == STRONGARM)
51 salcianu 1.1             return new harpoon.Backend.StrongARM.Frame(mainMethod);
52 salcianu 1.1         if (backendName == SPARC)
53 salcianu 1.1             return new harpoon.Backend.Sparc.Frame(mainMethod);
54 salcianu 1.1         if (backendName == MIPS)
55 salcianu 1.1             return new harpoon.Backend.MIPS.Frame(mainMethod);
56 salcianu 1.1         if (backendName == MIPSYP)
57 salcianu 1.1             return new harpoon.Backend.MIPS.Frame(mainMethod, "yp");
58 salcianu 1.1         if (backendName == MIPSDA)
59 salcianu 1.1             return new harpoon.Backend.MIPS.Frame(mainMethod, "da");
60 salcianu 1.1         if (backendName == PRECISEC)
61 salcianu 1.1             return new harpoon.Backend.PreciseC.Frame(mainMethod, asFact);
62 salcianu 1.1         throw new Error("Unknown Backend: " + backendName);
63 salcianu 1.1     }
64 salcianu 1.1 
65 salcianu 1.1     /** Create a frame object, given the name of a backend. */
66 salcianu 1.1     public static Frame getFrame(String backendName, HMethod mainMethod)
67 salcianu 1.1     {
68 salcianu 1.1         return getFrame(backendName, mainMethod, null);
69 salcianu 1.1     }
70 salcianu 1.1 }