1 cananian 1.1.2.1 // DataClazTable.java, created Sun Mar 10 05:16:36 2002 by cananian 2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Backend.RuntimeTiny; 5 cananian 1.1.2.1 6 cananian 1.1.2.1 import harpoon.Analysis.ClassHierarchy; 7 cananian 1.1.2.1 import harpoon.Backend.Generic.Frame; 8 cananian 1.1.2.1 import harpoon.Backend.Maps.NameMap; 9 cananian 1.1.2.1 import harpoon.Backend.Runtime1.Data; 10 cananian 1.1.2.1 import harpoon.ClassFile.HClass; 11 cananian 1.1.2.1 import harpoon.ClassFile.HDataElement; 12 cananian 1.1.2.1 import harpoon.IR.Tree.Stm; 13 cananian 1.1.2.1 import harpoon.IR.Tree.ALIGN; 14 cananian 1.1.2.1 import harpoon.IR.Tree.DATUM; 15 cananian 1.1.2.1 import harpoon.IR.Tree.LABEL; 16 cananian 1.1.2.1 import harpoon.IR.Tree.SEGMENT; 17 cananian 1.1.2.1 import harpoon.IR.Tree.Tree; 18 cananian 1.1.2.1 import harpoon.Temp.Label; 19 cananian 1.1.2.1 20 cananian 1.1.2.1 import java.util.ArrayList; 21 cananian 1.1.2.1 import java.util.Collections; 22 cananian 1.1.2.1 import java.util.Comparator; 23 cananian 1.1.2.1 import java.util.HashMap; 24 cananian 1.1.2.1 import java.util.Iterator; 25 cananian 1.1.2.1 import java.util.List; 26 cananian 1.1.2.1 import java.util.Map; 27 cananian 1.1.2.1 /** 28 cananian 1.1.2.1 * <code>DataClazTable</code> outputs an indirection table listing 29 cananian 1.1.2.1 * all the claz structures used in the program. This allows us 30 cananian 1.1.2.1 * to use a (short) index into this table to dereference the 31 cananian 1.1.2.1 * claz rather than a (long) direct pointer. Note that this 32 cananian 1.1.2.1 * table *only* contains *instantiated* types --- ie, claz 33 cananian 1.1.2.1 * descriptors which could actually appear in the claz field 34 cananian 1.1.2.1 * of an instantiated object. 35 cananian 1.1.2.1 * 36 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 37 cananian 1.4 * @version $Id: DataClazTable.java,v 1.4 2004/02/08 03:21:01 cananian Exp $ 38 cananian 1.1.2.1 */ 39 cananian 1.1.2.1 public class DataClazTable extends Data { 40 cananian 1.1.2.1 final NameMap m_nm; 41 cananian 1.1.2.1 42 cananian 1.1.2.1 /** Creates a <code>DataClazTable</code>. */ 43 cananian 1.1.2.1 public DataClazTable(Frame f, HClass hc, 44 cananian 1.1.2.1 ClassHierarchy ch, ClazNumbering cn) { 45 cananian 1.1.2.1 super("claz-table", hc, f); 46 cananian 1.1.2.1 this.m_nm = f.getRuntime().getNameMap(); 47 cananian 1.1.2.1 // only build one of these; wait until hc is java.lang.Object. 48 cananian 1.1.2.1 this.root = (hc==f.getLinker().forName("java.lang.Object")) ? 49 cananian 1.3 build(cn, ch, f.pointersAreLong()) : null; 50 cananian 1.1.2.1 } 51 cananian 1.3 private HDataElement build(final ClazNumbering cn, ClassHierarchy ch, 52 cananian 1.3 boolean pointersAreLong) { 53 cananian 1.1.2.1 List<Stm> stmlist = new ArrayList<Stm> 54 cananian 1.1.2.1 (ch.instantiatedClasses().size()+3); 55 cananian 1.1.2.1 stmlist.add(new SEGMENT(tf, null, SEGMENT.TEXT)); 56 cananian 1.3 stmlist.add(new ALIGN(tf, null, pointersAreLong?8:4));// pointer-align. 57 cananian 1.1.2.1 stmlist.add(new LABEL(tf, null, new Label(m_nm.c_function_name 58 cananian 1.1.2.1 ("FNI_claz_table")),true)); 59 cananian 1.1.2.1 // make a list of all instantiated classes. 60 cananian 1.1.2.1 List<HClass> all = new ArrayList<HClass>(ch.instantiatedClasses()); 61 cananian 1.4 for (HClass hc : all) { 62 cananian 1.1.2.2 assert !hc.isInterface(); 63 cananian 1.1.2.2 } 64 cananian 1.1.2.1 // sort these by clazNumber 65 cananian 1.1.2.1 Collections.sort(all, new Comparator<HClass>() { 66 cananian 1.1.2.1 public int compare(HClass a, HClass b) { 67 cananian 1.1.2.1 return cn.clazNumber(a) - cn.clazNumber(b); 68 cananian 1.1.2.1 } 69 cananian 1.1.2.1 }); 70 cananian 1.1.2.1 int n=0; 71 cananian 1.1.2.1 for (Iterator<HClass> it=all.iterator(); it.hasNext(); n++) { 72 cananian 1.1.2.1 HClass hc = it.next(); 73 cananian 1.1.2.1 assert cn.clazNumber(hc)==n; 74 cananian 1.1.2.1 stmlist.add(_DATUM(m_nm.label(hc))); 75 cananian 1.1.2.1 } 76 cananian 1.1.2.1 // done. 77 cananian 1.1.2.1 return (HDataElement) Stm.toStm(stmlist); 78 cananian 1.1.2.1 } 79 cananian 1.2 }