1 cananian 1.1.2.1 // ObjectBuilder.java, created Sun Mar 10 23:40:59 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.Backend.Generic.Runtime.ObjectBuilder.Info;
 7 cananian 1.1.2.1 import harpoon.Backend.Generic.Runtime.ObjectBuilder.ArrayInfo;
 8 cananian 1.1.2.1 import harpoon.Backend.Generic.Runtime.ObjectBuilder.ObjectInfo;
 9 cananian 1.1.2.1 import harpoon.Backend.Maps.FieldMap;
10 cananian 1.1.2.1 import harpoon.Backend.Maps.NameMap;
11 cananian 1.1.2.1 import harpoon.ClassFile.HClass;
12 cananian 1.1.2.1 import harpoon.ClassFile.HField;
13 cananian 1.1.2.1 import harpoon.IR.Tree.Exp;
14 cananian 1.1.2.1 import harpoon.IR.Tree.Stm;
15 cananian 1.1.2.1 import harpoon.IR.Tree.TreeFactory;
16 cananian 1.1.2.1 import harpoon.IR.Tree.ALIGN;
17 cananian 1.1.2.1 import harpoon.IR.Tree.CONST;
18 cananian 1.1.2.1 import harpoon.IR.Tree.DATUM;
19 cananian 1.1.2.1 import harpoon.IR.Tree.LABEL;
20 cananian 1.1.2.1 import harpoon.IR.Tree.NAME;
21 cananian 1.1.2.1 import harpoon.IR.Tree.SEGMENT;
22 cananian 1.1.2.1 import harpoon.Temp.Label;
23 cananian 1.1.2.1 import harpoon.Util.ArrayIterator;
24 cananian 1.1.2.1 import harpoon.Util.Util;
25 cananian 1.1.2.1 
26 cananian 1.1.2.1 import java.util.ArrayList;
27 cananian 1.1.2.1 import java.util.Iterator;
28 cananian 1.1.2.1 import java.util.List;
29 cananian 1.1.2.1 import java.util.Random;
30 cananian 1.1.2.1 /**
31 cananian 1.1.2.1  * <code>ObjectBuilder</code>
32 cananian 1.1.2.1  * 
33 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
34 cananian 1.3      * @version $Id: ObjectBuilder.java,v 1.3 2003/10/21 02:11:18 cananian Exp $
35 cananian 1.1.2.1  */
36 cananian 1.1.2.1 public class ObjectBuilder extends harpoon.Backend.Runtime1.ObjectBuilder {
37 cananian 1.1.2.1     Runtime runtime;
38 cananian 1.1.2.1     
39 cananian 1.1.2.1     /** Creates a <code>ObjectBuilder</code>. */
40 cananian 1.1.2.1     public ObjectBuilder(Runtime runtime) {
41 cananian 1.1.2.1         super(runtime);
42 cananian 1.1.2.1         this.runtime=runtime;
43 cananian 1.1.2.1     }
44 cananian 1.1.2.1     public ObjectBuilder(Runtime runtime, RootOracle ro) {
45 cananian 1.1.2.1         super(runtime, ro);
46 cananian 1.1.2.1         this.runtime=runtime;
47 cananian 1.1.2.1     }
48 cananian 1.1.2.1     protected Stm makeHeader(TreeFactory tf, Info info, boolean exported)
49 cananian 1.1.2.1     {
50 cananian 1.1.2.1         List stmlist = new ArrayList(4);
51 cananian 1.1.2.1         // align to word boundary.
52 cananian 1.3             stmlist.add(new ALIGN(tf, null, pointersAreLong ? 8 : 4));
53 cananian 1.1.2.1         // label:
54 cananian 1.1.2.1         stmlist.add(new LABEL(tf, null, info.label(), exported));
55 cananian 1.1.2.1         // claz *index* XXX this is the unique part for RuntimeTiny.
56 cananian 1.1.2.3         FieldMap cfm = ((TreeBuilder) runtime.getTreeBuilder())
57 cananian 1.1.2.3             .getClassFieldMap();
58 cananian 1.1.2.3         int clazEnd;
59 cananian 1.1.2.1         if (runtime.clazShrink) {
60 cananian 1.1.2.1             int num = runtime.cn.clazNumber(info.type());
61 cananian 1.1.2.2             int bitwidth = runtime.clazBytes*8;
62 cananian 1.1.2.2             stmlist.add(new DATUM(tf, null, new CONST
63 cananian 1.1.2.2                                   (tf, null, bitwidth, false, num)));
64 cananian 1.1.2.3             clazEnd = (runtime.hashlockShrink ? -4 : -8) + (bitwidth/8);
65 cananian 1.1.2.1         } else {
66 cananian 1.1.2.1             // boring, same as superclass
67 cananian 1.1.2.1             stmlist.add(new DATUM(tf, null, new NAME(tf, null,
68 cananian 1.1.2.1                                   runtime.getNameMap().label(info.type()))));
69 cananian 1.1.2.3             clazEnd = (runtime.hashlockShrink) ? 0 : -4;
70 cananian 1.1.2.1         }
71 cananian 1.1.2.3         // sometimes omit the hashlock XXX this is unique for RuntimeTiny, too
72 cananian 1.1.2.3         if (!runtime.hashlockShrink) {
73 cananian 1.1.2.3         int hashStart = clazEnd;
74 cananian 1.1.2.3         while (0 != (hashStart%4)) hashStart++;
75 cananian 1.1.2.3         Stm s = makeFields(tf, info, cfm.fieldList(info.type()),
76 cananian 1.1.2.3                            clazEnd, hashStart);
77 cananian 1.1.2.3         if (s!=null) stmlist.add(s);
78 cananian 1.1.2.1         // hash code.
79 cananian 1.1.2.1         // this is of pointer size, and must have the low bit set.  we *could*
80 cananian 1.1.2.1         // emit a symbolic reference to info.label()+1 or some such, but
81 cananian 1.1.2.1         // this would complicate the pattern-matching instruction selector.
82 cananian 1.1.2.1         // so instead we'll just select a random number of the right length
83 cananian 1.1.2.1         // and set the low bit.
84 cananian 1.1.2.1         stmlist.add(pointersAreLong ?
85 cananian 1.1.2.1                     new DATUM(tf, null, new CONST(tf, null, 1|rnd.nextLong())):
86 cananian 1.1.2.1                     new DATUM(tf, null, new CONST(tf, null, 1|rnd.nextInt())));
87 cananian 1.1.2.3         }
88 cananian 1.1.2.1         // okay, done with header.
89 cananian 1.1.2.1         return Stm.toStm(stmlist);
90 cananian 1.1.2.3     }
91 cananian 1.1.2.3     protected int headerFinalOffset(Info info) {
92 cananian 1.1.2.3         if (!runtime.hashlockShrink) return 0;
93 cananian 1.1.2.3         if (!runtime.clazShrink) return 0;
94 cananian 1.1.2.3         return -4+runtime.clazBytes;
95 cananian 1.1.2.1     }
96 cananian 1.2     }