1 cananian 1.1.2.1  // Runtime.java, created Wed Sep  8 14:24:18 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.Generic;
  5 cananian 1.1.2.1  
  6 cananian 1.1.2.14 import harpoon.Analysis.CallGraph;
  7 cananian 1.1.2.2  import harpoon.Analysis.ClassHierarchy;
  8 cananian 1.1.2.9  import harpoon.Analysis.Maps.AllocationInformation.AllocationProperties;
  9 cananian 1.1.2.1  import harpoon.Backend.Maps.NameMap;
 10 cananian 1.1.2.2  import harpoon.ClassFile.HClass;
 11 cananian 1.1.2.5  import harpoon.ClassFile.HCodeElement;
 12 cananian 1.1.2.6  import harpoon.ClassFile.HCodeFactory;
 13 cananian 1.3.2.2  import harpoon.ClassFile.HData;
 14 cananian 1.1.2.5  import harpoon.ClassFile.HField;
 15 cananian 1.1.2.5  import harpoon.ClassFile.HMethod;
 16 cananian 1.1.2.8  import harpoon.IR.Tree.DerivationGenerator;
 17 cananian 1.1.2.5  import harpoon.IR.Tree.Stm;
 18 cananian 1.1.2.5  import harpoon.IR.Tree.Translation.Exp;
 19 cananian 1.1.2.5  import harpoon.IR.Tree.TreeFactory;
 20 cananian 1.1.2.5  import harpoon.Temp.Label;
 21 cananian 1.1.2.6  import harpoon.Util.Util;
 22 cananian 1.1.2.1  
 23 cananian 1.1.2.14 import java.util.Collection;
 24 cananian 1.1.2.16 import java.util.HashSet;
 25 cananian 1.1.2.1  import java.util.List;
 26 cananian 1.1.2.16 import java.util.Set;
 27 salcianu 1.5      
 28 salcianu 1.5      import java.io.Serializable;
 29 salcianu 1.5      
 30 cananian 1.1.2.1  /**
 31 cananian 1.1.2.4   * A <code>Generic.Runtime</code> provides runtime-specific
 32 cananian 1.1.2.4   * information to the backend.  It should be largely-to-totally
 33 cananian 1.1.2.4   * independent of the particular architecture targetted; all
 34 cananian 1.1.2.4   * interfaces in Runtime interact with <code>IR.Tree</code> form,
 35 cananian 1.1.2.4   * not the architecture-specific <code>IR.Assem</code> form.<p>
 36 cananian 1.1.2.4   * Among other things, a <code>Generic.Runtime</code> provides
 37 cananian 1.1.2.4   * class data constructors to provide class information to the
 38 cananian 1.1.2.4   * runtime system.
 39 cananian 1.1.2.1   * 
 40 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 41 salcianu 1.5       * @version $Id: Runtime.java,v 1.5 2003/04/19 01:03:44 salcianu Exp $
 42 cananian 1.1.2.1   */
 43 salcianu 1.5      public abstract class Runtime implements Serializable {
 44 cananian 1.1.2.14     protected Runtime() { }
 45 cananian 1.1.2.14 
 46 cananian 1.1.2.14     /** Returns a <code>TreeBuilder</code> object for this
 47 cananian 1.1.2.4       *  <code>Generic.Runtime</code>. */
 48 cananian 1.1.2.14     public abstract TreeBuilder getTreeBuilder();
 49 cananian 1.1.2.14 
 50 cananian 1.1.2.14     /** Returns a <code>NameMap</code> valid for this
 51 cananian 1.1.2.14      *  <code>Generic.Runtime</code>. */
 52 cananian 1.1.2.14     public abstract NameMap getNameMap();
 53 cananian 1.1.2.14 
 54 cananian 1.1.2.14     /** Prefixes a runtime-specific path onto the specific resource name,
 55 cananian 1.1.2.14      *  so that transformations can refer to runtime-specific properties
 56 cananian 1.1.2.14      *  files in a uniform manner. */
 57 cananian 1.1.2.14     public abstract String resourcePath(String basename);
 58 cananian 1.1.2.14 
 59 cananian 1.1.2.14     // methods used during initialization
 60 cananian 1.1.2.14     /** Sets the <code>ClassHierarchy</code> to use for this
 61 cananian 1.1.2.14      *  <code>Generic.Runtime</code>.  This method must be called at least
 62 cananian 1.1.2.14      *  once before the <code>TreeBuilder</code> or <code>classData</code>
 63 cananian 1.1.2.14      *  are used to generate tree form.  It may be called multiple times
 64 cananian 1.1.2.14      *  if transformations cause the class hierarchy to change. */
 65 cananian 1.1.2.14     public void setClassHierarchy(ClassHierarchy ch) { }
 66 cananian 1.1.2.14 
 67 cananian 1.1.2.14     /** Sets the <code>CallGraph</code> to use for this
 68 cananian 1.1.2.14      *  <code>Generic.Runtime</code>.  Some runtime options do not
 69 cananian 1.1.2.14      *  require a call graph, and thus do not require that this method
 70 cananian 1.1.2.14      *  ever be called.  However, for those that do, this method must
 71 cananian 1.1.2.14      *  be called at least once before the <code>TreeBuilder</code> or
 72 cananian 1.1.2.14      *  <code>classData</code> are used to generate tree form.  It may
 73 cananian 1.1.2.14      *  be called multiple times if transformations cause the call
 74 cananian 1.1.2.14      *  graph to change. */
 75 cananian 1.1.2.14     public void setCallGraph(CallGraph cg) { }
 76 cananian 1.1.2.1  
 77 cananian 1.1.2.5      /** Returns a list of <code>HData</code>s which are needed for the
 78 cananian 1.1.2.1       *  given class. */
 79 cananian 1.3.2.2      public abstract List<HData> classData(HClass hc);
 80 cananian 1.1.2.6  
 81 cananian 1.1.2.6      /** This code factory hook allows the runtime to return
 82 cananian 1.1.2.6       *  runtime-specific stubs for native methods --- or any other
 83 cananian 1.1.2.6       *  method which the runtime wishes to reimplement.  The
 84 cananian 1.1.2.6       *  default implementation just passes the given code factory
 85 cananian 1.1.2.6       *  through without modification.<p>
 86 cananian 1.1.2.6       *  The code factory returned by this method should return
 87 cananian 1.1.2.6       *  a <code>null</code> for methods which the output routine
 88 cananian 1.1.2.6       *  should skip.  For example, if stubs are not needed for
 89 cananian 1.1.2.6       *  native methods, then the code factory should return
 90 cananian 1.1.2.6       *  <code>null</code> when <code>convert()</code> is called
 91 cananian 1.1.2.6       *  on a native method (just as the standard code factories do).
 92 cananian 1.1.2.6       *  <p>
 93 cananian 1.1.2.6       *  The code factory given should produce tree form.  The returned
 94 cananian 1.1.2.6       *  code factory should also produce tree form; the tree form need
 95 cananian 1.1.2.6       *  not be canonicalized or optimized.
 96 cananian 1.1.2.6       */
 97 cananian 1.1.2.6      public HCodeFactory nativeTreeCodeFactory(HCodeFactory hcf) {
 98 cananian 1.3.2.1          assert hcf!=null && hcf.getCodeName().endsWith("tree");
 99 cananian 1.1.2.6          return hcf;
100 cananian 1.1.2.6      }
101 cananian 1.1.2.14     /** Return a <code>Set</code> of <code>HMethod</code>s 
102 cananian 1.1.2.14      *  and <code>HClass</code>es which are referenced /
103 cananian 1.1.2.14      *  callable by code in the runtime implementation (and should
104 cananian 1.1.2.14      *  therefore be included in every class hierarchy). */
105 cananian 1.1.2.14     public abstract Collection runtimeCallableMethods();
106 cananian 1.1.2.16 
107 cananian 1.1.2.16     /** Return a <code>Set</code> of labels which specify configuration
108 cananian 1.1.2.16      *  dependencies.  A reference will be emitted by the FLEX component
109 cananian 1.1.2.16      *  of this <code>Generic.Runtime</code> for each string in
110 cananian 1.1.2.16      *  this set, which should match correspondingly-named labels in
111 cananian 1.1.2.16      *  a properly configured C runtime.  This allows us to check
112 cananian 1.1.2.16      *  at link time that the C runtime's configuration matches the
113 cananian 1.1.2.16      *  FLEX configuration. */
114 cananian 1.3.2.2      public final Set<String> configurationSet = new HashSet<String>();
115 cananian 1.1.2.5  
116 cananian 1.1.2.5      /** The <code>TreeBuilder</code> constructs bits of code in the
117 cananian 1.1.2.5       *  <code>IR.Tree</code> form to handle various runtime-dependent
118 cananian 1.1.2.5       *  tasks---primarily method and field access.
119 cananian 1.1.2.5       */
120 salcianu 1.5          public abstract static class TreeBuilder implements Serializable {
121 cananian 1.1.2.10         /** Utility method for external analyses that want to know the
122 cananian 1.1.2.12          *  exact size of an object. This returns the size in bytes
123 cananian 1.1.2.12          *  <strong>not including the header</strong>. */
124 cananian 1.1.2.10         public abstract int objectSize(HClass hc);
125 cananian 1.1.2.12         /** Utility method for external analyses that want to know the
126 cananian 1.1.2.12          *  size of an object header.  Returns the header size in bytes.
127 cananian 1.1.2.12          *  The total allocated memory for an object is
128 cananian 1.1.2.12          *  <code>objectSize(hc)+headerSize(hc)</code>. */
129 cananian 1.1.2.12         public abstract int headerSize(HClass hc);
130 cananian 1.1.2.10 
131 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> giving the length of the
132 cananian 1.1.2.5           *  array pointed to by the given expression. */
133 cananian 1.1.2.5          public abstract Exp arrayLength(TreeFactory tf, HCodeElement source,
134 cananian 1.1.2.8                                          DerivationGenerator dg,
135 cananian 1.1.2.5                                          Exp arrayRef);
136 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> which will create a
137 cananian 1.1.2.5           *  array of the given type, with length specified by the
138 cananian 1.1.2.15          *  given expression.  Only a single dimension of a multidimensional
139 cananian 1.1.2.15          *  array will be created. Elements of the array are only
140 cananian 1.1.2.15          *  initialized if the <code>initialize</code> parameter is
141 cananian 1.1.2.15          *  <code>true</code>; however the internal object header,
142 cananian 1.1.2.15          *  length, and any internal fields of the array inherited
143 cananian 1.1.2.15          *  from <code>java.lang.Object</code> are always initialized.
144 cananian 1.1.2.15          */
145 cananian 1.1.2.5          public abstract Exp arrayNew(TreeFactory tf, HCodeElement source,
146 cananian 1.1.2.8                                       DerivationGenerator dg,
147 cananian 1.1.2.9                                       AllocationProperties ap,
148 cananian 1.1.2.15                                      HClass arraytype, Exp length,
149 cananian 1.1.2.15                                      boolean initialize);
150 cananian 1.1.2.5  
151 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> which tests the
152 cananian 1.1.2.5           *  given object expression for membership in the component
153 cananian 1.1.2.5           *  type of the given array expression. */
154 cananian 1.1.2.5          public abstract Exp componentOf(TreeFactory tf, HCodeElement source,
155 cananian 1.1.2.8                                          DerivationGenerator dg,
156 cananian 1.1.2.5                                          Exp arrayref, Exp objectref);
157 cananian 1.1.2.5  
158 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> which tests the
159 cananian 1.1.2.5           *  given expression for membership in the given class or
160 cananian 1.1.2.5           *  interface. */
161 cananian 1.1.2.5          public abstract Exp instanceOf(TreeFactory tf, HCodeElement source,
162 cananian 1.1.2.8                                         DerivationGenerator dg,
163 cananian 1.1.2.5                                         Exp objectref, HClass classType);
164 cananian 1.1.2.5  
165 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> which acquires
166 cananian 1.1.2.5           *  the monitor lock of the object specified by the given
167 cananian 1.1.2.5           *  expression. */
168 cananian 1.1.2.5          public abstract Exp monitorEnter(TreeFactory tf, HCodeElement source,
169 cananian 1.1.2.8                                           DerivationGenerator dg,
170 cananian 1.1.2.5                                           Exp objectref);
171 cananian 1.1.2.5  
172 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> which releases
173 cananian 1.1.2.5           *  the monitor lock of the object specified by the given
174 cananian 1.1.2.5           *  expression. */
175 cananian 1.1.2.5          public abstract Exp monitorExit(TreeFactory tf, HCodeElement source,
176 cananian 1.1.2.8                                          DerivationGenerator dg,
177 cananian 1.1.2.5                                          Exp objectref);
178 cananian 1.1.2.5  
179 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> which will create a
180 cananian 1.1.2.5           *  object of the given type, with length specified by the
181 cananian 1.1.2.7           *  given expression.  Fields of the object are only initialized
182 cananian 1.1.2.7           *  if the <code>initialize</code> parameter is <code>true</code>;
183 cananian 1.1.2.7           *  however the internal object header is always created
184 cananian 1.1.2.5           *  and initialized. */
185 cananian 1.1.2.5          public abstract Exp objectNew(TreeFactory tf, HCodeElement source,
186 cananian 1.1.2.8                                        DerivationGenerator dg,
187 cananian 1.1.2.9                                        AllocationProperties ap,
188 cananian 1.1.2.7                                        HClass classType, boolean initialize);
189 cananian 1.1.2.11 
190 cananian 1.1.2.11         /** Return a <code>Translation.Exp</code> which represents a
191 cananian 1.1.2.11          *  reference to a <code>Class</code> constant.  The runtime
192 cananian 1.1.2.11          *  may implement this by a call to
193 cananian 1.1.2.11          *  <code>Class.forName(classname)</code> or other lookup
194 cananian 1.1.2.11          *  function, or may return a <code>NAME</code> if the class
195 cananian 1.1.2.11          *  objects are statically allocated. */
196 cananian 1.1.2.11         public abstract Exp classConst(TreeFactory tf, HCodeElement source,
197 cananian 1.1.2.11                                        DerivationGenerator dg,
198 cananian 1.1.2.11                                        HClass classData);
199 cananian 1.1.2.11         /** Return a <code>Translation.Exp</code> which represents a
200 cananian 1.1.2.11          *  reference to a <code>java.lang.reflect.Field</code>
201 cananian 1.1.2.11          *  constant.  The runtime may implement this by a call to
202 cananian 1.1.2.11          *  <code>Class.forName(classname).getDeclaredField(fieldname)</code>
203 cananian 1.1.2.11          *  or other lookup functions, or may return a
204 cananian 1.1.2.11          *  <code>NAME</code> if the <code>Field</code> objects are statically
205 cananian 1.1.2.11          *  allocated. */
206 cananian 1.1.2.11         public abstract Exp fieldConst(TreeFactory tf, HCodeElement source,
207 cananian 1.1.2.11                                        DerivationGenerator dg,
208 cananian 1.1.2.11                                        HField fieldData);
209 cananian 1.1.2.11         /** Return a <code>Translation.Exp</code> which represents a
210 cananian 1.1.2.11          *  reference to a <code>java.lang.reflect.Method</code>
211 cananian 1.1.2.11          *  constant.  The runtime may implement this by a call to
212 cananian 1.1.2.11          *  <code>Class.forName(classname).getDeclaredMethod(name,...)</code>
213 cananian 1.1.2.11          *  or other lookup functions, or may return a
214 cananian 1.1.2.11          *  <code>NAME</code> if the <code>Method</code> objects are statically
215 cananian 1.1.2.11          *  allocated. */
216 cananian 1.1.2.11         public abstract Exp methodConst(TreeFactory tf, HCodeElement source,
217 cananian 1.1.2.11                                         DerivationGenerator dg,
218 cananian 1.1.2.11                                         HMethod methodData);
219 cananian 1.1.2.5  
220 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> which represents
221 cananian 1.1.2.5           *  a reference to a string constant.  Note that invoking
222 cananian 1.1.2.5           *  <code>String.intern()</code> on the <code>String</code>
223 cananian 1.1.2.5           *  object reference returned must return a result identical to
224 cananian 1.1.2.5           *  the reference.  This may involve fix-up and/or addition
225 cananian 1.1.2.5           *  of objects to the class or global <code>HData</code>; these
226 cananian 1.1.2.5           *  tasks are the responsibility of the
227 cananian 1.1.2.5           *  <code>Generic.Runtime</code>, and it is anticipated that
228 cananian 1.1.2.5           *  the invocation of this method may have such side-effects
229 cananian 1.1.2.5           *  (although other implementations are certainly possible).
230 cananian 1.1.2.5           */
231 cananian 1.1.2.5          public abstract Exp stringConst(TreeFactory tf, HCodeElement source,
232 cananian 1.1.2.8                                          DerivationGenerator dg,
233 cananian 1.1.2.5                                          String stringData);
234 cananian 1.1.2.5  
235 cananian 1.1.2.5          // handle low-quad pointer manipulations.
236 cananian 1.1.2.5  
237 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> representing the
238 cananian 1.1.2.5           *  array-base of the object referenced by the given
239 cananian 1.1.2.5           *  <code>objectref</code> <code>Translation.Exp</code>.
240 cananian 1.1.2.5           *  This expression should point to the zero'th element of
241 cananian 1.1.2.5           *  the array object specified by <code>objectref</code>. */
242 cananian 1.1.2.5          public abstract Exp arrayBase(TreeFactory tf, HCodeElement source,
243 cananian 1.1.2.8                                        DerivationGenerator dg,
244 cananian 1.1.2.5                                        Exp objectref);
245 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> representing the
246 cananian 1.1.2.5           *  offset from the array base needed to access the array 
247 cananian 1.1.2.5           *  element specified by the <code>index</code> expression.
248 cananian 1.1.2.5           *  If <code>index</code> is zero, then the
249 cananian 1.1.2.5           *  <code>Translation.Exp</code> returned should also have
250 cananian 1.1.2.5           *  value zero. */
251 cananian 1.1.2.5          public abstract Exp arrayOffset(TreeFactory tf, HCodeElement source,
252 cananian 1.1.2.8                                          DerivationGenerator dg,
253 cananian 1.1.2.5                                          HClass arrayType, Exp index);
254 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> representing the
255 cananian 1.1.2.5           *  field base of the object referenced by the given
256 cananian 1.1.2.5           *  <code>objectref</code> expression.  This expression should
257 cananian 1.1.2.5           *  point to the first field in the object. */
258 cananian 1.1.2.5          public abstract Exp fieldBase(TreeFactory tf, HCodeElement source,
259 cananian 1.1.2.8                                        DerivationGenerator dg,
260 cananian 1.1.2.5                                        Exp objectref);
261 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> representing an
262 cananian 1.1.2.5           *  offset from the field base required to access the given
263 cananian 1.1.2.5           *  <code>field</code>.  If the given field is the first in
264 cananian 1.1.2.5           *  the object, then the <code>Translation.Exp</code> returned
265 cananian 1.1.2.5           *  should have value zero. */
266 cananian 1.1.2.5          public abstract Exp fieldOffset(TreeFactory tf, HCodeElement source,
267 cananian 1.1.2.8                                          DerivationGenerator dg,
268 cananian 1.1.2.5                                          HField field);
269 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> representing the
270 cananian 1.1.2.5           *  method base of the object referenced by the given
271 cananian 1.1.2.5           *  <code>objectref</code> expression.  This expression
272 cananian 1.1.2.5           *  should point a location containing a pointer to the
273 cananian 1.1.2.5           *  first method of the object. */
274 cananian 1.1.2.5          public abstract Exp methodBase(TreeFactory tf, HCodeElement source,
275 cananian 1.1.2.8                                         DerivationGenerator dg,
276 cananian 1.1.2.5                                         Exp objectref);
277 cananian 1.1.2.5          /** Return a <code>Translation.Exp</code> representing an
278 cananian 1.1.2.5           *  offset from the method base required to access the
279 cananian 1.1.2.5           *  given <code>method</code>.  If the given method is the
280 cananian 1.1.2.5           *  first of the object, then the <code>Translation.Exp</code>
281 cananian 1.1.2.5           *  returned should have value zero. */
282 cananian 1.1.2.5          public abstract Exp methodOffset(TreeFactory tf, HCodeElement source,
283 cananian 1.1.2.8                                           DerivationGenerator dg,
284 cananian 1.1.2.5                                           HMethod method);
285 cananian 1.1.2.13         /** Return a <code>Translation.Exp</code> representing an
286 cananian 1.1.2.13          *  comparison between expressions evaluating to two references,
287 cananian 1.1.2.13          *  <code>refLeft</code> and <code>refRight</code>.
288 cananian 1.1.2.13          *  Note that this is *reference* equality, not *POINTER* equality.
289 cananian 1.1.2.13          *  The <code>fieldBase</code> method, for example, is required
290 cananian 1.1.2.13          *  to return a POINTER expression (which is typically a bit-masked
291 cananian 1.1.2.13          *  and offset version of the reference value);  one valid 
292 cananian 1.1.2.13          *  implementation of <code>referenceEqual</code> would be to
293 cananian 1.1.2.13          *  compare the values returned by a call to <code>fieldBase()</code>
294 cananian 1.1.2.13          *  on the operands, but there is typically a more efficient means.
295 cananian 1.1.2.13          */
296 cananian 1.1.2.13         public abstract Exp referenceEqual(TreeFactory tf, HCodeElement source,
297 cananian 1.1.2.13                                            DerivationGenerator dg,
298 cananian 1.1.2.13                                            Exp refLeft, Exp refRight);
299 cananian 1.1.2.5      }
300 cananian 1.1.2.5      /** The <code>ObjectBuilder</code> constructs data tables in the
301 cananian 1.1.2.5       *  <code>IR.Tree</code> form to represent static objects which may
302 cananian 1.1.2.5       *  be needed by the runtime---primarily string constant objects.
303 cananian 1.1.2.5       *  Not every runtime need implement an <code>ObjectBuilder</code>.
304 cananian 1.1.2.5       */
305 salcianu 1.5          public abstract static class ObjectBuilder implements Serializable {
306 cananian 1.1.2.5          // bits of data about an object needed to build it.
307 cananian 1.1.2.5          /** General information about a built object's type and what label to
308 cananian 1.1.2.5           *  use to refer to it. */
309 cananian 1.1.2.5          public static interface Info {
310 cananian 1.1.2.5              HClass type();
311 cananian 1.1.2.5              Label  label();
312 cananian 1.1.2.5          }
313 cananian 1.1.2.5          /** Information needed to build an array object. */
314 cananian 1.1.2.5          public static interface ArrayInfo extends Info {
315 cananian 1.1.2.5              int length();
316 cananian 1.1.2.5              Object get(int i);
317 cananian 1.1.2.5          }
318 cananian 1.1.2.5          /** Information needed to build a non-array object. */
319 cananian 1.1.2.5          public static interface ObjectInfo extends Info {
320 cananian 1.1.2.5              Object get(HField hf);
321 cananian 1.1.2.5          }
322 cananian 1.1.2.5  
323 cananian 1.1.2.5          /** Build an array.
324 cananian 1.1.2.5           * @param info Information about the type, length and contents of
325 cananian 1.1.2.5           *             the array to build.
326 cananian 1.1.2.5           * @param segtype Segment in which to put the built array.
327 cananian 1.1.2.5           * @param exported <code>true</code> if this object's label
328 cananian 1.1.2.5           *             is to be exported outside its module.
329 cananian 1.1.2.5           */
330 cananian 1.1.2.5          public abstract Stm buildArray(TreeFactory tf, ArrayInfo info,
331 cananian 1.1.2.5                                         boolean exported);
332 cananian 1.1.2.5          /** Build an object.
333 cananian 1.1.2.5           * @param info Information about the type and contents of
334 cananian 1.1.2.5           *             the object to build.
335 cananian 1.1.2.5           * @param segtype Segment in which to put the built object.
336 cananian 1.1.2.5           * @param exported <code>true</code> if this object's label
337 cananian 1.1.2.5           *             is to be exported outside its module.
338 cananian 1.1.2.5           */
339 cananian 1.1.2.5          public abstract Stm buildObject(TreeFactory tf, ObjectInfo info,
340 cananian 1.1.2.5                                          boolean exported);
341 cananian 1.1.2.5      }
342 cananian 1.2      }