001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.runtime;
014    
015    import static org.jikesrvm.runtime.EntrypointHelper.getField;
016    import static org.jikesrvm.runtime.EntrypointHelper.getMethod;
017    
018    import org.jikesrvm.VM;
019    import org.jikesrvm.classloader.RVMField;
020    import org.jikesrvm.classloader.RVMMethod;
021    import org.jikesrvm.classloader.NormalMethod;
022    
023    /**
024     * Fields and methods of the virtual machine that are needed by
025     * compiler-generated machine code or C runtime code.
026     */
027    public class Entrypoints {
028      // The usual causes for getField/Method() to fail are:
029      //  1. you mispelled the class name, member name, or member signature
030      //  2. the class containing the specified member didn't get compiled
031      //
032    
033      public static final NormalMethod bootMethod = EntrypointHelper.getMethod(org.jikesrvm.VM.class, "boot", "()V");
034    
035      public static final RVMMethod java_lang_reflect_Method_invokeMethod =
036          getMethod(java.lang.reflect.Method.class, "invoke",
037              "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
038      public static final RVMMethod getClassFromStackFrame =
039        getMethod(org.jikesrvm.classloader.RVMClass.class, "getClassFromStackFrame", "(I)Lorg/jikesrvm/classloader/RVMClass;");
040      public static final RVMMethod getClassLoaderFromStackFrame =
041        getMethod(org.jikesrvm.classloader.RVMClass.class, "getClassLoaderFromStackFrame", "(I)Ljava/lang/ClassLoader;");
042    
043      public static final RVMField magicObjectRemapperField =
044          getField(org.jikesrvm.runtime.Magic.class,
045                   "objectAddressRemapper",
046                   org.jikesrvm.runtime.ObjectAddressRemapper.class);
047    
048      public static final NormalMethod instanceOfMethod =
049          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "instanceOf", "(Ljava/lang/Object;I)Z");
050      public static final NormalMethod checkcastMethod =
051          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "checkcast", "(Ljava/lang/Object;I)V");
052      public static final NormalMethod checkstoreMethod =
053          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "checkstore", "(Ljava/lang/Object;Ljava/lang/Object;)V");
054      public static final NormalMethod aastoreMethod =
055          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "aastore", "([Ljava/lang/Object;ILjava/lang/Object;)V");
056      public static final NormalMethod aastoreUninterruptibleMethod =
057          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "aastoreUninterruptible", "([Ljava/lang/Object;ILjava/lang/Object;)V");
058      public static final NormalMethod athrowMethod =
059          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "athrow", "(Ljava/lang/Throwable;)V");
060    
061      // Allocation-related entry points
062      //
063      public static final NormalMethod resolvedNewScalarMethod =
064          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class,
065                    "resolvedNewScalar",
066                    "(ILorg/jikesrvm/objectmodel/TIB;ZIIII)Ljava/lang/Object;");
067      public static final NormalMethod unresolvedNewScalarMethod =
068          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "unresolvedNewScalar", "(II)Ljava/lang/Object;");
069      public static final NormalMethod unresolvedNewArrayMethod =
070          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "unresolvedNewArray", "(III)Ljava/lang/Object;");
071      public static final NormalMethod resolvedNewArrayMethod =
072          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class,
073                    "resolvedNewArray",
074                    "(IIILorg/jikesrvm/objectmodel/TIB;IIII)Ljava/lang/Object;");
075    
076      public static final RVMField sysWriteLockField = getField(org.jikesrvm.VM.class, "sysWriteLock", int.class);
077      public static final RVMField intBufferLockField =
078          getField(org.jikesrvm.Services.class, "intBufferLock", int.class);
079      public static final RVMField dumpBufferLockField =
080          getField(org.jikesrvm.Services.class, "dumpBufferLock", int.class);
081    
082      public static final NormalMethod unexpectedAbstractMethodCallMethod =
083          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "unexpectedAbstractMethodCall", "()V");
084      public static final NormalMethod raiseNullPointerException =
085          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "raiseNullPointerException", "()V");
086      public static final NormalMethod raiseArrayBoundsException =
087          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "raiseArrayIndexOutOfBoundsException", "(I)V");
088      public static final NormalMethod raiseArithmeticException =
089          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "raiseArithmeticException", "()V");
090      public static final NormalMethod raiseAbstractMethodError =
091          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "raiseAbstractMethodError", "()V");
092      public static final NormalMethod raiseIllegalAccessError =
093          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "raiseIllegalAccessError", "()V");
094      public static final NormalMethod deliverHardwareExceptionMethod =
095          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "deliverHardwareException", "(II)V");
096      public static final NormalMethod unlockAndThrowMethod =
097          getMethod(org.jikesrvm.runtime.RuntimeEntrypoints.class, "unlockAndThrow", "(Ljava/lang/Object;Ljava/lang/Throwable;)V");
098    
099      public static final RVMField gcLockField = getField("Ljava/lang/VMCommonLibrarySupport$GCLock;", "gcLock", int.class);
100    
101      public static final NormalMethod invokeInterfaceMethod =
102          getMethod(org.jikesrvm.classloader.InterfaceInvocation.class,
103                    "invokeInterface",
104                    "(Ljava/lang/Object;I)Lorg/jikesrvm/ArchitectureSpecific$CodeArray;");
105      public static final NormalMethod findItableMethod =
106          getMethod(org.jikesrvm.classloader.InterfaceInvocation.class,
107                    "findITable",
108                    "(Lorg/jikesrvm/objectmodel/TIB;I)Lorg/jikesrvm/objectmodel/ITable;");
109      public static final NormalMethod unresolvedInvokeinterfaceImplementsTestMethod =
110          getMethod(org.jikesrvm.classloader.InterfaceInvocation.class,
111                    "unresolvedInvokeinterfaceImplementsTest",
112                    "(ILjava/lang/Object;)V");
113    
114      public static final NormalMethod lockMethod =
115          getMethod(org.jikesrvm.objectmodel.ObjectModel.class, "genericLock", "(Ljava/lang/Object;)V");
116      public static final NormalMethod unlockMethod =
117          getMethod(org.jikesrvm.objectmodel.ObjectModel.class, "genericUnlock", "(Ljava/lang/Object;)V");
118    
119      public static final NormalMethod inlineLockMethod =
120          getMethod(org.jikesrvm.scheduler.ThinLock.class,
121                    "inlineLock",
122                    "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;)V");
123      public static final NormalMethod inlineUnlockMethod =
124          getMethod(org.jikesrvm.scheduler.ThinLock.class,
125                    "inlineUnlock",
126                    "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;)V");
127    
128      public static final NormalMethod lazyMethodInvokerMethod =
129          getMethod(org.jikesrvm.runtime.DynamicLinker.class, "lazyMethodInvoker", "()V");
130      public static final NormalMethod unimplementedNativeMethodMethod =
131          getMethod(org.jikesrvm.runtime.DynamicLinker.class, "unimplementedNativeMethod", "()V");
132      public static final NormalMethod sysCallMethod =
133          getMethod(org.jikesrvm.runtime.DynamicLinker.class, "sysCallMethod", "()V");
134    
135      public static final NormalMethod resolveMemberMethod =
136          getMethod(org.jikesrvm.classloader.TableBasedDynamicLinker.class, "resolveMember", "(I)I");
137      public static final RVMField memberOffsetsField =
138          getField(org.jikesrvm.classloader.TableBasedDynamicLinker.class, "memberOffsets", int[].class);
139    
140      /** 1L */
141      public static final RVMField longOneField = getField(org.jikesrvm.runtime.MathConstants.class, "longOne", long.class);
142      /** -1.0F */
143      public static final RVMField minusOneField = getField(org.jikesrvm.runtime.MathConstants.class, "minusOne", float.class);
144      /** 0.0F */
145      public static final RVMField zeroFloatField = getField(org.jikesrvm.runtime.MathConstants.class, "zero", float.class);
146      /**0.5F */
147      public static final RVMField halfFloatField = getField(org.jikesrvm.runtime.MathConstants.class, "half", float.class);
148      /** 1.0F */
149      public static final RVMField oneFloatField = getField(org.jikesrvm.runtime.MathConstants.class, "one", float.class);
150      /** 2.0F */
151      public static final RVMField twoFloatField = getField(org.jikesrvm.runtime.MathConstants.class, "two", float.class);
152      /** 2.0F^32 */
153      public static final RVMField two32Field = getField(org.jikesrvm.runtime.MathConstants.class, "two32", float.class);
154      /** 0.5F^32 */
155      public static final RVMField half32Field = getField(org.jikesrvm.runtime.MathConstants.class, "half32", float.class);
156      /** 1e-9 */
157      public static final RVMField billionthField = getField(org.jikesrvm.runtime.MathConstants.class, "billionth", double.class);
158      /** 0.0 */
159      public static final RVMField zeroDoubleField = getField(org.jikesrvm.runtime.MathConstants.class, "zeroD", double.class);
160      /** 1.0 */
161      public static final RVMField oneDoubleField = getField(org.jikesrvm.runtime.MathConstants.class, "oneD", double.class);
162      /** largest double that can be rounded to an int */
163      public static final RVMField maxintField =
164          getField(org.jikesrvm.runtime.MathConstants.class, "maxint", double.class);
165      /** largest double that can be rounded to a long */
166      public static final RVMField maxlongField =
167        getField(org.jikesrvm.runtime.MathConstants.class, "maxlong", double.class);
168      /** smallest double that can be rounded to an int */
169      public static final RVMField minintField =
170          getField(org.jikesrvm.runtime.MathConstants.class, "minint", double.class);
171      /** largest float that can be rounded to an int */
172      public static final RVMField maxintFloatField =
173        getField(org.jikesrvm.runtime.MathConstants.class, "maxintF", float.class);
174      /** largest float that can be rounded to a long */
175      public static final RVMField maxlongFloatField =
176        getField(org.jikesrvm.runtime.MathConstants.class, "maxlongF", float.class);
177      /** IEEEmagic constant */
178      public static final RVMField IEEEmagicField =
179          getField(org.jikesrvm.runtime.MathConstants.class, "IEEEmagic", double.class);
180      /** special double value for use in int <--> double conversions */
181      public static final RVMField I2DconstantField =
182          getField(org.jikesrvm.runtime.MathConstants.class,
183                   "I2Dconstant",
184                   double.class);
185    
186      public static final RVMField bootThreadField =
187        getField(org.jikesrvm.scheduler.RVMThread.class, "bootThread",
188                 org.jikesrvm.scheduler.RVMThread.class);
189    
190      public static final RVMField scratchStorageField =
191          getField(org.jikesrvm.scheduler.RVMThread.class, "scratchStorage", double.class);
192      public static final RVMField takeYieldpointField =
193          getField(org.jikesrvm.scheduler.RVMThread.class, "takeYieldpoint", int.class);
194    
195      public static final RVMField execStatusField = getField(org.jikesrvm.scheduler.RVMThread.class, "execStatus", int.class);
196    
197      public static final RVMField referenceReferentField =
198          getField(java.lang.ref.Reference.class, "_referent", org.vmmagic.unboxed.Address.class);
199    
200      /** Used in deciding which stack frames we can elide when printing. */
201      public static final NormalMethod mainThreadRunMethod =
202          getMethod(org.jikesrvm.scheduler.MainThread.class, "run", "()V");
203    
204      public static final NormalMethod yieldpointFromPrologueMethod =
205          getMethod(org.jikesrvm.scheduler.RVMThread.class, "yieldpointFromPrologue", "()V");
206      public static final NormalMethod yieldpointFromBackedgeMethod =
207          getMethod(org.jikesrvm.scheduler.RVMThread.class, "yieldpointFromBackedge", "()V");
208      public static final NormalMethod yieldpointFromEpilogueMethod =
209          getMethod(org.jikesrvm.scheduler.RVMThread.class, "yieldpointFromEpilogue", "()V");
210      public static final NormalMethod enterJNIBlockedFromJNIFunctionCallMethod =
211          getMethod(org.jikesrvm.scheduler.RVMThread.class, "enterJNIBlockedFromJNIFunctionCall", "()V");
212      public static final NormalMethod enterJNIBlockedFromCallIntoNativeMethod =
213          getMethod(org.jikesrvm.scheduler.RVMThread.class, "enterJNIBlockedFromCallIntoNative", "()V");
214      public static final NormalMethod leaveJNIBlockedFromJNIFunctionCallMethod =
215          getMethod(org.jikesrvm.scheduler.RVMThread.class, "leaveJNIBlockedFromJNIFunctionCall", "()V");
216      public static final NormalMethod leaveJNIBlockedFromCallIntoNativeMethod =
217          getMethod(org.jikesrvm.scheduler.RVMThread.class, "leaveJNIBlockedFromCallIntoNative", "()V");
218    
219      public static final NormalMethod threadRunMethod = getMethod(org.jikesrvm.scheduler.RVMThread.class, "run", "()V");
220      public static final NormalMethod threadStartoffMethod =
221          getMethod(org.jikesrvm.scheduler.RVMThread.class, "startoff", "()V");
222      public static final RVMField threadStackField = getField(org.jikesrvm.scheduler.RVMThread.class, "stack", byte[].class);
223      public static final RVMField stackLimitField =
224          getField(org.jikesrvm.scheduler.RVMThread.class, "stackLimit", org.vmmagic.unboxed.Address.class);
225    
226      public static final RVMField threadSlotField = getField(org.jikesrvm.scheduler.RVMThread.class, "threadSlot", int.class);
227      public static final RVMField jniEnvField =
228          getField(org.jikesrvm.scheduler.RVMThread.class, "jniEnv", org.jikesrvm.jni.JNIEnvironment.class);
229      public static final RVMField threadContextRegistersField =
230          getField(org.jikesrvm.scheduler.RVMThread.class,
231                   "contextRegisters",
232                   org.jikesrvm.ArchitectureSpecific.Registers.class);
233      public static final RVMField threadContextRegistersSaveField =
234          getField(org.jikesrvm.scheduler.RVMThread.class,
235                   "contextRegistersSave",
236                   org.jikesrvm.ArchitectureSpecific.Registers.class);
237      public static final RVMField threadExceptionRegistersField =
238          getField(org.jikesrvm.scheduler.RVMThread.class,
239                   "exceptionRegisters",
240                   org.jikesrvm.ArchitectureSpecific.Registers.class);
241    
242      public static final RVMField tracePrevAddressField =
243          getField(org.jikesrvm.objectmodel.MiscHeader.class, "prevAddress", org.vmmagic.unboxed.Word.class);
244      public static final RVMField traceOIDField =
245          getField(org.jikesrvm.objectmodel.MiscHeader.class, "oid", org.vmmagic.unboxed.Word.class);
246      /*
247      public static final RVMField dispenserField = getField(org.jikesrvm.mm.mmtk.Lock.class, "dispenser", int.class);
248      public static final RVMField servingField = getField(org.jikesrvm.mm.mmtk.Lock.class, "serving", int.class);
249      public static final RVMField lockThreadField =
250          getField(org.jikesrvm.mm.mmtk.Lock.class, "thread", org.jikesrvm.scheduler.RVMThread.class);
251      */
252      public static final RVMField lockStateField = getField(org.jikesrvm.mm.mmtk.Lock.class, "state", int.class);
253      public static final RVMField gcStatusField = getField(org.mmtk.plan.Plan.class, "gcStatus", int.class);
254      public static final RVMField SQCFField = getField(org.mmtk.utility.deque.SharedDeque.class, "completionFlag", int.class);
255      public static final RVMField SQNCField = getField(org.mmtk.utility.deque.SharedDeque.class, "numConsumers", int.class);
256      public static final RVMField SQNCWField =
257          getField(org.mmtk.utility.deque.SharedDeque.class, "numConsumersWaiting", int.class);
258      public static final RVMField SQheadField =
259          getField(org.mmtk.utility.deque.SharedDeque.class, "head", org.vmmagic.unboxed.Address.class);
260      public static final RVMField SQtailField =
261          getField(org.mmtk.utility.deque.SharedDeque.class, "tail", org.vmmagic.unboxed.Address.class);
262      public static final RVMField SQBEField = getField(org.mmtk.utility.deque.SharedDeque.class, "bufsenqueued", int.class);
263      public static final RVMField synchronizedCounterField =
264          getField(org.jikesrvm.mm.mmtk.SynchronizedCounter.class, "count", int.class);
265    
266      public static final NormalMethod booleanFieldWriteBarrierMethod =
267        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanFieldWrite", "(Ljava/lang/Object;ZLorg/vmmagic/unboxed/Offset;I)V");
268      public static final NormalMethod booleanArrayWriteBarrierMethod =
269        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanArrayWrite", "([ZIZ)V");
270      public static final NormalMethod booleanFieldReadBarrierMethod =
271        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Z");
272      public static final NormalMethod booleanArrayReadBarrierMethod =
273        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanArrayRead", "([ZI)Z");
274    
275      public static final NormalMethod byteFieldWriteBarrierMethod =
276        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteFieldWrite", "(Ljava/lang/Object;BLorg/vmmagic/unboxed/Offset;I)V");
277      public static final NormalMethod byteArrayWriteBarrierMethod =
278        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteArrayWrite", "([BIB)V");
279      public static final NormalMethod byteFieldReadBarrierMethod =
280        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)B");
281      public static final NormalMethod byteArrayReadBarrierMethod =
282        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteArrayRead", "([BI)B");
283    
284      public static final NormalMethod charFieldWriteBarrierMethod =
285        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charFieldWrite", "(Ljava/lang/Object;CLorg/vmmagic/unboxed/Offset;I)V");
286      public static final NormalMethod charArrayWriteBarrierMethod =
287        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charArrayWrite", "([CIC)V");
288      public static final NormalMethod charFieldReadBarrierMethod =
289        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)C");
290      public static final NormalMethod charArrayReadBarrierMethod =
291        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charArrayRead", "([CI)C");
292    
293      public static final NormalMethod shortFieldWriteBarrierMethod =
294        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortFieldWrite", "(Ljava/lang/Object;SLorg/vmmagic/unboxed/Offset;I)V");
295      public static final NormalMethod shortArrayWriteBarrierMethod =
296        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortArrayWrite", "([SIS)V");
297      public static final NormalMethod shortFieldReadBarrierMethod =
298        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)S");
299      public static final NormalMethod shortArrayReadBarrierMethod =
300        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortArrayRead", "([SI)S");
301    
302      public static final NormalMethod intFieldWriteBarrierMethod =
303        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intFieldWrite", "(Ljava/lang/Object;ILorg/vmmagic/unboxed/Offset;I)V");
304      public static final NormalMethod intArrayWriteBarrierMethod =
305        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intArrayWrite", "([III)V");
306      public static final NormalMethod intFieldReadBarrierMethod =
307        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)I");
308      public static final NormalMethod intArrayReadBarrierMethod =
309        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intArrayRead", "([II)I");
310    
311      public static final NormalMethod longFieldWriteBarrierMethod =
312        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longFieldWrite", "(Ljava/lang/Object;JLorg/vmmagic/unboxed/Offset;I)V");
313      public static final NormalMethod longArrayWriteBarrierMethod =
314        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longArrayWrite", "([JIJ)V");
315      public static final NormalMethod longFieldReadBarrierMethod =
316        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)J");
317      public static final NormalMethod longArrayReadBarrierMethod =
318        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longArrayRead", "([JI)J");
319    
320      public static final NormalMethod floatFieldWriteBarrierMethod =
321        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatFieldWrite", "(Ljava/lang/Object;FLorg/vmmagic/unboxed/Offset;I)V");
322      public static final NormalMethod floatArrayWriteBarrierMethod =
323        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatArrayWrite", "([FIF)V");
324      public static final NormalMethod floatFieldReadBarrierMethod =
325        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)F");
326      public static final NormalMethod floatArrayReadBarrierMethod =
327        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatArrayRead", "([FI)F");
328    
329      public static final NormalMethod doubleFieldWriteBarrierMethod =
330        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleFieldWrite", "(Ljava/lang/Object;DLorg/vmmagic/unboxed/Offset;I)V");
331      public static final NormalMethod doubleArrayWriteBarrierMethod =
332        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleArrayWrite", "([DID)V");
333      public static final NormalMethod doubleFieldReadBarrierMethod =
334        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)D");
335      public static final NormalMethod doubleArrayReadBarrierMethod =
336        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleArrayRead", "([DI)D");
337    
338      public static final NormalMethod objectFieldWriteBarrierMethod =
339        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectFieldWrite", "(Ljava/lang/Object;Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)V");
340      public static final NormalMethod objectArrayWriteBarrierMethod =
341        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectArrayWrite", "([Ljava/lang/Object;ILjava/lang/Object;)V");
342      public static final NormalMethod objectFieldReadBarrierMethod =
343        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Ljava/lang/Object;");
344      public static final NormalMethod objectArrayReadBarrierMethod =
345        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectArrayRead", "([Ljava/lang/Object;I)Ljava/lang/Object;");
346    
347      public static final NormalMethod wordFieldWriteBarrierMethod =
348        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "wordFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Word;Lorg/vmmagic/unboxed/Offset;I)V");
349      public static final NormalMethod wordFieldReadBarrierMethod =
350        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "wordFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Word;");
351    
352      public static final NormalMethod addressFieldWriteBarrierMethod =
353        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "addressFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Offset;I)V");
354      public static final NormalMethod addressFieldReadBarrierMethod =
355        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "addressFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Address;");
356    
357      public static final NormalMethod offsetFieldWriteBarrierMethod =
358        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "offsetFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;Lorg/vmmagic/unboxed/Offset;I)V");
359      public static final NormalMethod offsetFieldReadBarrierMethod =
360        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "offsetFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Offset;");
361    
362      public static final NormalMethod extentFieldWriteBarrierMethod =
363        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "extentFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Extent;Lorg/vmmagic/unboxed/Offset;I)V");
364      public static final NormalMethod extentFieldReadBarrierMethod =
365        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "extentFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Extent;");
366    
367      public static final NormalMethod objectStaticWriteBarrierMethod =
368        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectStaticWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)V");
369      public static final NormalMethod objectStaticReadBarrierMethod =
370          getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectStaticRead", "(Lorg/vmmagic/unboxed/Offset;I)Ljava/lang/Object;");
371    
372      public static final NormalMethod modifyCheckMethod =
373          getMethod(org.jikesrvm.mm.mminterface.MemoryManager.class, "modifyCheck", "(Ljava/lang/Object;)V");
374    
375      // used in boot image writer
376      public static final RVMField debugRequestedField =
377          getField(org.jikesrvm.scheduler.RVMThread.class, "debugRequested", boolean.class);
378      public static final NormalMethod dumpStackAndDieMethod =
379          getMethod(org.jikesrvm.scheduler.RVMThread.class, "dumpStackAndDie", "(Lorg/vmmagic/unboxed/Address;)V");
380    
381      public static final RVMField latestContenderField =
382          getField(org.jikesrvm.scheduler.SpinLock.class, "latestContender", org.jikesrvm.scheduler.RVMThread.class);
383    
384      public static final RVMField depthField = getField(org.jikesrvm.classloader.RVMType.class, "depth", int.class);
385      public static final RVMField idField = getField(org.jikesrvm.classloader.RVMType.class, "id", int.class);
386      public static final RVMField dimensionField = getField(org.jikesrvm.classloader.RVMType.class, "dimension", int.class);
387    
388      public static final RVMField innermostElementTypeDimensionField =
389          getField(org.jikesrvm.classloader.RVMArray.class, "innermostElementTypeDimension", int.class);
390    
391      public static final RVMField JNIEnvSavedTRField =
392          getField(org.jikesrvm.jni.JNIEnvironment.class, "savedTRreg", org.jikesrvm.scheduler.RVMThread.class);
393      public static final RVMField JNIEnvBasePointerOnEntryToNative =
394          getField(org.jikesrvm.jni.JNIEnvironment.class, "basePointerOnEntryToNative", org.vmmagic.unboxed.Address.class);
395      public static final RVMField JNIGlobalRefsField =
396        getField(org.jikesrvm.jni.JNIGlobalRefTable.class, "JNIGlobalRefs", org.vmmagic.unboxed.AddressArray.class);
397      public static final RVMField JNIRefsField =
398          getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefs", org.vmmagic.unboxed.AddressArray.class);
399      public static final RVMField JNIRefsTopField = getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefsTop", int.class);
400      public static final RVMField JNIRefsMaxField = getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefsMax", int.class);
401      public static final RVMField JNIRefsSavedFPField =
402          getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefsSavedFP", int.class);
403      public static final RVMField JNITopJavaFPField =
404          getField(org.jikesrvm.jni.JNIEnvironment.class, "JNITopJavaFP", org.vmmagic.unboxed.Address.class);
405      public static final RVMField JNIPendingExceptionField =
406          getField(org.jikesrvm.jni.JNIEnvironment.class, "pendingException", java.lang.Throwable.class);
407      public static final RVMField JNIExternalFunctionsField =
408          getField(org.jikesrvm.jni.JNIEnvironment.class, "externalJNIFunctions", org.vmmagic.unboxed.Address.class);
409      public static final RVMField JNIEnvSavedJTOCField =
410          VM.BuildForPowerPC ? getField(org.jikesrvm.jni.JNIEnvironment.class,
411                                        "savedJTOC",
412                                        org.vmmagic.unboxed.Address.class) : null;
413      public static final RVMMethod jniEntry =
414          VM.BuildForIA32 ? getMethod(org.jikesrvm.jni.JNIEnvironment.class,
415                                      "entryToJNI",
416                                      "(I)V") : null;
417      public static final RVMMethod jniExit =
418          VM.BuildForIA32 ? getMethod(org.jikesrvm.jni.JNIEnvironment.class,
419                                      "exitFromJNI",
420                                      "(I)Ljava/lang/Object;") : null;
421    
422      public static final RVMField the_boot_recordField =
423          getField(org.jikesrvm.runtime.BootRecord.class, "the_boot_record", org.jikesrvm.runtime.BootRecord.class);
424      public static final RVMField externalSignalFlagField =
425          getField(org.jikesrvm.runtime.BootRecord.class, "externalSignalFlag", int.class);
426      public static final RVMField sysLongDivideIPField =
427          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongDivideIP", org.vmmagic.unboxed.Address.class);
428      public static final RVMField sysLongRemainderIPField =
429          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongRemainderIP", org.vmmagic.unboxed.Address.class);
430      public static final RVMField sysLongToFloatIPField =
431          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongToFloatIP", org.vmmagic.unboxed.Address.class);
432      public static final RVMField sysLongToDoubleIPField =
433          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongToDoubleIP", org.vmmagic.unboxed.Address.class);
434      public static final RVMField sysFloatToIntIPField =
435          getField(org.jikesrvm.runtime.BootRecord.class, "sysFloatToIntIP", org.vmmagic.unboxed.Address.class);
436      public static final RVMField sysDoubleToIntIPField =
437          getField(org.jikesrvm.runtime.BootRecord.class, "sysDoubleToIntIP", org.vmmagic.unboxed.Address.class);
438      public static final RVMField sysFloatToLongIPField =
439          getField(org.jikesrvm.runtime.BootRecord.class, "sysFloatToLongIP", org.vmmagic.unboxed.Address.class);
440      public static final RVMField sysDoubleToLongIPField =
441          getField(org.jikesrvm.runtime.BootRecord.class, "sysDoubleToLongIP", org.vmmagic.unboxed.Address.class);
442      public static final RVMField sysDoubleRemainderIPField =
443          getField(org.jikesrvm.runtime.BootRecord.class, "sysDoubleRemainderIP", org.vmmagic.unboxed.Address.class);
444    
445      public static final RVMField edgeCountersField =
446          getField(org.jikesrvm.compilers.baseline.EdgeCounts.class, "data", int[][].class);
447    
448      //////////////////
449      // Entrypoints that are valid only when the opt compiler is included in the build
450      //////////////////
451      public static final RVMField specializedMethodsField;
452    
453      public static final NormalMethod optThreadSwitchFromOsrOptMethod;
454      public static final NormalMethod optThreadSwitchFromPrologueMethod;
455      public static final NormalMethod optThreadSwitchFromBackedgeMethod;
456      public static final NormalMethod optThreadSwitchFromEpilogueMethod;
457      public static final NormalMethod yieldpointFromNativePrologueMethod;
458      public static final NormalMethod yieldpointFromNativeEpilogueMethod;
459      public static final NormalMethod optResolveMethod;
460      public static final NormalMethod optNewArrayArrayMethod;
461      public static final NormalMethod optNew2DArrayMethod;
462      public static final NormalMethod sysArrayCopy;
463    
464      static {
465        if (VM.BuildForOptCompiler) {
466          specializedMethodsField =
467              getField(org.jikesrvm.compilers.opt.specialization.SpecializedMethodPool.class,
468                       "specializedMethods",
469                       org.jikesrvm.ArchitectureSpecific.CodeArray[].class);
470          optThreadSwitchFromOsrOptMethod =
471              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromOsrOpt", "()V");
472          optThreadSwitchFromPrologueMethod =
473              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromPrologue", "()V");
474          optThreadSwitchFromBackedgeMethod =
475              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromBackedge", "()V");
476          optThreadSwitchFromEpilogueMethod =
477              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromEpilogue", "()V");
478          yieldpointFromNativePrologueMethod =
479              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromNativePrologue", "()V");
480          yieldpointFromNativeEpilogueMethod =
481              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromNativeEpilogue", "()V");
482          optResolveMethod = getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "resolve", "()V");
483    
484          optNewArrayArrayMethod =
485              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptLinker.class, "newArrayArray", "(I[II)Ljava/lang/Object;");
486          optNew2DArrayMethod =
487              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptLinker.class, "new2DArray", "(IIII)Ljava/lang/Object;");
488          sysArrayCopy = getMethod("Ljava/lang/VMCommonLibrarySupport;", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V");
489          sysArrayCopy.setRuntimeServiceMethod(false);
490        } else {
491          specializedMethodsField = null;
492          optThreadSwitchFromOsrOptMethod = null;
493          optThreadSwitchFromPrologueMethod = null;
494          optThreadSwitchFromBackedgeMethod = null;
495          optThreadSwitchFromEpilogueMethod = null;
496          yieldpointFromNativePrologueMethod = null;
497          yieldpointFromNativeEpilogueMethod = null;
498          optResolveMethod = null;
499          optNewArrayArrayMethod = null;
500          optNew2DArrayMethod = null;
501          sysArrayCopy = null;
502        }
503      }
504    
505      public static final RVMField classLoaderDefinedPackages =
506        getField(java.lang.ClassLoader.class, "definedPackages", java.util.HashMap.class);
507    
508      public static final RVMField luni1;
509      public static final RVMField luni2;
510      public static final RVMField luni3;
511      public static final RVMField luni4;
512      public static final RVMField luni5;
513      public static final RVMField luni6;
514    
515      static {
516        if (VM.BuildForHarmony) {
517          luni1 = getField("Lorg/apache/harmony/luni/util/Msg;", "bundle", java.util.ResourceBundle.class);
518          luni2 = getField("Lorg/apache/harmony/archive/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
519          luni3 = getField("Lorg/apache/harmony/luni/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
520          luni4 = getField("Lorg/apache/harmony/nio/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
521          luni5 = getField("Lorg/apache/harmony/niochar/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
522          luni6 = getField(java.util.logging.LogManager.class, "manager", java.util.logging.LogManager.class);
523        } else {
524          luni1 = null;
525          luni2 = null;
526          luni3 = null;
527          luni4 = null;
528          luni5 = null;
529          luni6 = null;
530        }
531      }
532    }