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     }