1 cananian 1.1.2.1 // DataInitializers.java, created Thu Oct 14 19:52:32 1999 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1999 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.Runtime1; 5 cananian 1.1.2.1 6 cananian 1.1.2.1 import harpoon.Backend.Generic.Frame; 7 cananian 1.1.2.1 import harpoon.Backend.Maps.NameMap; 8 cananian 1.1.2.1 import harpoon.ClassFile.HClass; 9 cananian 1.1.2.1 import harpoon.ClassFile.HDataElement; 10 cananian 1.1.2.1 import harpoon.ClassFile.HInitializer; 11 cananian 1.1.2.1 import harpoon.IR.Tree.Stm; 12 cananian 1.1.2.1 import harpoon.IR.Tree.TreeFactory; 13 cananian 1.1.2.3 import harpoon.IR.Tree.ALIGN; 14 cananian 1.1.2.2 import harpoon.IR.Tree.CONST; 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.Temp.Label; 18 cananian 1.1.2.1 19 cananian 1.1.2.1 import java.util.ArrayList; 20 cananian 1.1.2.1 import java.util.Iterator; 21 cananian 1.1.2.1 import java.util.List; 22 cananian 1.1.2.1 /** 23 cananian 1.1.2.1 * <code>DataInitializers</code> outputs a table listing the 24 cananian 1.1.2.1 * static initializers needed for the program, in the proper 25 cananian 1.1.2.1 * dependency order. 26 cananian 1.1.2.1 * 27 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 28 cananian 1.4 * @version $Id: DataInitializers.java,v 1.4 2004/02/08 03:20:58 cananian Exp $ 29 cananian 1.1.2.1 */ 30 cananian 1.1.2.1 public class DataInitializers extends Data { 31 cananian 1.1.2.1 final NameMap m_nm; 32 cananian 1.1.2.1 33 cananian 1.1.2.1 /** Creates a <code>DataInitializers</code>. */ 34 cananian 1.1.2.1 public DataInitializers(Frame f, HClass hc, List staticInitializers) { 35 cananian 1.1.2.1 super("static-initializers", hc, f); 36 cananian 1.1.2.8 this.m_nm = f.getRuntime().getNameMap(); 37 cananian 1.1.2.1 // only build one of these; wait until hc is java.lang.Object. 38 cananian 1.1.2.6 this.root = (hc==linker.forName("java.lang.Object")) ? 39 cananian 1.3 build(staticInitializers, f.pointersAreLong()) : null; 40 cananian 1.1.2.1 } 41 cananian 1.3 private HDataElement build(List initMethods, boolean pointersAreLong) { 42 cananian 1.1.2.4 List stmlist = new ArrayList(initMethods.size()+4); 43 cananian 1.1.2.1 stmlist.add(new SEGMENT(tf, null, SEGMENT.TEXT)); 44 cananian 1.3 stmlist.add(new ALIGN(tf, null, pointersAreLong ? 8 : 4));// word-align 45 cananian 1.1.2.7 stmlist.add(new LABEL(tf, null, new Label(m_nm.c_function_name 46 cananian 1.1.2.7 ("FNI_static_inits")),true)); 47 cananian 1.4 for (Object hmO : initMethods) { 48 cananian 1.4 HInitializer hm = (HInitializer) hmO; 49 cananian 1.1.2.5 stmlist.add(_DATUM(m_nm.label(hm.getDeclaringClass(), "namestr"))); 50 cananian 1.1.2.4 } 51 cananian 1.1.2.5 stmlist.add(_DATUM(new CONST(tf, null))); // null-terminate the list 52 cananian 1.1.2.1 return (HDataElement) Stm.toStm(stmlist); 53 cananian 1.1.2.1 } 54 cananian 1.2 }