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     }