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 }