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 }