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 misspelled 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      public static final NormalMethod returnBarrierMethod = getMethod(org.jikesrvm.scheduler.RVMThread.class, "returnBarrier", "()V");
242    
243      public static final RVMField tracePrevAddressField =
244          getField(org.jikesrvm.objectmodel.MiscHeader.class, "prevAddress", org.vmmagic.unboxed.Word.class);
245      public static final RVMField traceOIDField =
246          getField(org.jikesrvm.objectmodel.MiscHeader.class, "oid", org.vmmagic.unboxed.Word.class);
247      /*
248      public static final RVMField dispenserField = getField(org.jikesrvm.mm.mmtk.Lock.class, "dispenser", int.class);
249      public static final RVMField servingField = getField(org.jikesrvm.mm.mmtk.Lock.class, "serving", int.class);
250      public static final RVMField lockThreadField =
251          getField(org.jikesrvm.mm.mmtk.Lock.class, "thread", org.jikesrvm.scheduler.RVMThread.class);
252      */
253      public static final RVMField lockStateField = getField(org.jikesrvm.mm.mmtk.Lock.class, "state", int.class);
254      public static final RVMField gcStatusField = getField(org.mmtk.plan.Plan.class, "gcStatus", int.class);
255      public static final RVMField SQCFField = getField(org.mmtk.utility.deque.SharedDeque.class, "completionFlag", int.class);
256      public static final RVMField SQNCField = getField(org.mmtk.utility.deque.SharedDeque.class, "numConsumers", int.class);
257      public static final RVMField SQNCWField =
258          getField(org.mmtk.utility.deque.SharedDeque.class, "numConsumersWaiting", int.class);
259      public static final RVMField SQheadField =
260          getField(org.mmtk.utility.deque.SharedDeque.class, "head", org.vmmagic.unboxed.Address.class);
261      public static final RVMField SQtailField =
262          getField(org.mmtk.utility.deque.SharedDeque.class, "tail", org.vmmagic.unboxed.Address.class);
263      public static final RVMField SQBEField = getField(org.mmtk.utility.deque.SharedDeque.class, "bufsenqueued", int.class);
264      public static final RVMField synchronizedCounterField =
265          getField(org.jikesrvm.mm.mmtk.SynchronizedCounter.class, "count", int.class);
266    
267      public static final NormalMethod booleanFieldWriteBarrierMethod =
268        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanFieldWrite", "(Ljava/lang/Object;ZLorg/vmmagic/unboxed/Offset;I)V");
269      public static final NormalMethod booleanArrayWriteBarrierMethod =
270        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanArrayWrite", "([ZIZ)V");
271      public static final NormalMethod booleanFieldReadBarrierMethod =
272        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Z");
273      public static final NormalMethod booleanArrayReadBarrierMethod =
274        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "booleanArrayRead", "([ZI)Z");
275    
276      public static final NormalMethod byteFieldWriteBarrierMethod =
277        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteFieldWrite", "(Ljava/lang/Object;BLorg/vmmagic/unboxed/Offset;I)V");
278      public static final NormalMethod byteArrayWriteBarrierMethod =
279        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteArrayWrite", "([BIB)V");
280      public static final NormalMethod byteFieldReadBarrierMethod =
281        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)B");
282      public static final NormalMethod byteArrayReadBarrierMethod =
283        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "byteArrayRead", "([BI)B");
284    
285      public static final NormalMethod charFieldWriteBarrierMethod =
286        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charFieldWrite", "(Ljava/lang/Object;CLorg/vmmagic/unboxed/Offset;I)V");
287      public static final NormalMethod charArrayWriteBarrierMethod =
288        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charArrayWrite", "([CIC)V");
289      public static final NormalMethod charFieldReadBarrierMethod =
290        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)C");
291      public static final NormalMethod charArrayReadBarrierMethod =
292        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "charArrayRead", "([CI)C");
293    
294      public static final NormalMethod shortFieldWriteBarrierMethod =
295        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortFieldWrite", "(Ljava/lang/Object;SLorg/vmmagic/unboxed/Offset;I)V");
296      public static final NormalMethod shortArrayWriteBarrierMethod =
297        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortArrayWrite", "([SIS)V");
298      public static final NormalMethod shortFieldReadBarrierMethod =
299        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)S");
300      public static final NormalMethod shortArrayReadBarrierMethod =
301        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "shortArrayRead", "([SI)S");
302    
303      public static final NormalMethod intFieldWriteBarrierMethod =
304        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intFieldWrite", "(Ljava/lang/Object;ILorg/vmmagic/unboxed/Offset;I)V");
305      public static final NormalMethod intArrayWriteBarrierMethod =
306        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intArrayWrite", "([III)V");
307      public static final NormalMethod intFieldReadBarrierMethod =
308        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)I");
309      public static final NormalMethod intArrayReadBarrierMethod =
310        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "intArrayRead", "([II)I");
311    
312      public static final NormalMethod longFieldWriteBarrierMethod =
313        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longFieldWrite", "(Ljava/lang/Object;JLorg/vmmagic/unboxed/Offset;I)V");
314      public static final NormalMethod longArrayWriteBarrierMethod =
315        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longArrayWrite", "([JIJ)V");
316      public static final NormalMethod longFieldReadBarrierMethod =
317        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)J");
318      public static final NormalMethod longArrayReadBarrierMethod =
319        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "longArrayRead", "([JI)J");
320    
321      public static final NormalMethod floatFieldWriteBarrierMethod =
322        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatFieldWrite", "(Ljava/lang/Object;FLorg/vmmagic/unboxed/Offset;I)V");
323      public static final NormalMethod floatArrayWriteBarrierMethod =
324        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatArrayWrite", "([FIF)V");
325      public static final NormalMethod floatFieldReadBarrierMethod =
326        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)F");
327      public static final NormalMethod floatArrayReadBarrierMethod =
328        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "floatArrayRead", "([FI)F");
329    
330      public static final NormalMethod doubleFieldWriteBarrierMethod =
331        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleFieldWrite", "(Ljava/lang/Object;DLorg/vmmagic/unboxed/Offset;I)V");
332      public static final NormalMethod doubleArrayWriteBarrierMethod =
333        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleArrayWrite", "([DID)V");
334      public static final NormalMethod doubleFieldReadBarrierMethod =
335        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)D");
336      public static final NormalMethod doubleArrayReadBarrierMethod =
337        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "doubleArrayRead", "([DI)D");
338    
339      public static final NormalMethod objectFieldWriteBarrierMethod =
340        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectFieldWrite", "(Ljava/lang/Object;Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)V");
341      public static final NormalMethod objectArrayWriteBarrierMethod =
342        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectArrayWrite", "([Ljava/lang/Object;ILjava/lang/Object;)V");
343      public static final NormalMethod objectFieldReadBarrierMethod =
344        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Ljava/lang/Object;");
345      public static final NormalMethod objectArrayReadBarrierMethod =
346        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectArrayRead", "([Ljava/lang/Object;I)Ljava/lang/Object;");
347    
348      public static final NormalMethod wordFieldWriteBarrierMethod =
349        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "wordFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Word;Lorg/vmmagic/unboxed/Offset;I)V");
350      public static final NormalMethod wordFieldReadBarrierMethod =
351        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "wordFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Word;");
352    
353      public static final NormalMethod addressFieldWriteBarrierMethod =
354        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "addressFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Offset;I)V");
355      public static final NormalMethod addressFieldReadBarrierMethod =
356        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "addressFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Address;");
357    
358      public static final NormalMethod offsetFieldWriteBarrierMethod =
359        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "offsetFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;Lorg/vmmagic/unboxed/Offset;I)V");
360      public static final NormalMethod offsetFieldReadBarrierMethod =
361        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "offsetFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Offset;");
362    
363      public static final NormalMethod extentFieldWriteBarrierMethod =
364        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "extentFieldWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Extent;Lorg/vmmagic/unboxed/Offset;I)V");
365      public static final NormalMethod extentFieldReadBarrierMethod =
366        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "extentFieldRead", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)Lorg/vmmagic/unboxed/Extent;");
367    
368      public static final NormalMethod objectStaticWriteBarrierMethod =
369        getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectStaticWrite", "(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;I)V");
370      public static final NormalMethod objectStaticReadBarrierMethod =
371          getMethod(org.jikesrvm.mm.mminterface.Barriers.class, "objectStaticRead", "(Lorg/vmmagic/unboxed/Offset;I)Ljava/lang/Object;");
372    
373      public static final NormalMethod modifyCheckMethod =
374          getMethod(org.jikesrvm.mm.mminterface.MemoryManager.class, "modifyCheck", "(Ljava/lang/Object;)V");
375    
376      // used in boot image writer
377      public static final RVMField debugRequestedField =
378          getField(org.jikesrvm.scheduler.RVMThread.class, "debugRequested", boolean.class);
379      public static final NormalMethod dumpStackAndDieMethod =
380          getMethod(org.jikesrvm.scheduler.RVMThread.class, "dumpStackAndDie", "(Lorg/vmmagic/unboxed/Address;)V");
381    
382      public static final RVMField latestContenderField =
383          getField(org.jikesrvm.scheduler.SpinLock.class, "latestContender", org.jikesrvm.scheduler.RVMThread.class);
384    
385      public static final RVMField depthField = getField(org.jikesrvm.classloader.RVMType.class, "depth", int.class);
386      public static final RVMField idField = getField(org.jikesrvm.classloader.RVMType.class, "id", int.class);
387      public static final RVMField dimensionField = getField(org.jikesrvm.classloader.RVMType.class, "dimension", int.class);
388    
389      public static final RVMField innermostElementTypeDimensionField =
390          getField(org.jikesrvm.classloader.RVMArray.class, "innermostElementTypeDimension", int.class);
391    
392      public static final RVMField JNIEnvSavedTRField =
393          getField(org.jikesrvm.jni.JNIEnvironment.class, "savedTRreg", org.jikesrvm.scheduler.RVMThread.class);
394      public static final RVMField JNIEnvBasePointerOnEntryToNative =
395          getField(org.jikesrvm.jni.JNIEnvironment.class, "basePointerOnEntryToNative", org.vmmagic.unboxed.Address.class);
396      public static final RVMField JNIGlobalRefsField =
397        getField(org.jikesrvm.jni.JNIGlobalRefTable.class, "JNIGlobalRefs", org.vmmagic.unboxed.AddressArray.class);
398      public static final RVMField JNIRefsField =
399          getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefs", org.vmmagic.unboxed.AddressArray.class);
400      public static final RVMField JNIRefsTopField = getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefsTop", int.class);
401      public static final RVMField JNIRefsMaxField = getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefsMax", int.class);
402      public static final RVMField JNIRefsSavedFPField =
403          getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefsSavedFP", int.class);
404      public static final RVMField JNITopJavaFPField =
405          getField(org.jikesrvm.jni.JNIEnvironment.class, "JNITopJavaFP", org.vmmagic.unboxed.Address.class);
406      public static final RVMField JNIHasPendingExceptionField =
407          getField(org.jikesrvm.jni.JNIEnvironment.class, "hasPendingException", int.class);
408      public static final RVMField JNIExternalFunctionsField =
409          getField(org.jikesrvm.jni.JNIEnvironment.class, "externalJNIFunctions", org.vmmagic.unboxed.Address.class);
410      public static final RVMField JNIEnvSavedJTOCField =
411          VM.BuildForPowerPC ? getField(org.jikesrvm.jni.JNIEnvironment.class,
412                                        "savedJTOC",
413                                        org.vmmagic.unboxed.Address.class) : null;
414      public static final RVMMethod jniEntry =
415          VM.BuildForIA32 ? getMethod(org.jikesrvm.jni.JNIEnvironment.class,
416                                      "entryToJNI",
417                                      "(I)V") : null;
418      public static final RVMMethod jniExit =
419          VM.BuildForIA32 ? getMethod(org.jikesrvm.jni.JNIEnvironment.class,
420                                      "exitFromJNI",
421                                      "(I)Ljava/lang/Object;") : null;
422          public static final RVMMethod jniThrowPendingException =
423            VM.BuildForPowerPC ? getMethod(org.jikesrvm.jni.JNIEnvironment.class,
424                                        "throwPendingException",
425                                        "()V") : null;
426    
427      public static final RVMField the_boot_recordField =
428          getField(org.jikesrvm.runtime.BootRecord.class, "the_boot_record", org.jikesrvm.runtime.BootRecord.class);
429      public static final RVMField externalSignalFlagField =
430          getField(org.jikesrvm.runtime.BootRecord.class, "externalSignalFlag", int.class);
431      public static final RVMField sysLongDivideIPField =
432          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongDivideIP", org.vmmagic.unboxed.Address.class);
433      public static final RVMField sysLongRemainderIPField =
434          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongRemainderIP", org.vmmagic.unboxed.Address.class);
435      public static final RVMField sysLongToFloatIPField =
436          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongToFloatIP", org.vmmagic.unboxed.Address.class);
437      public static final RVMField sysLongToDoubleIPField =
438          getField(org.jikesrvm.runtime.BootRecord.class, "sysLongToDoubleIP", org.vmmagic.unboxed.Address.class);
439      public static final RVMField sysFloatToIntIPField =
440          getField(org.jikesrvm.runtime.BootRecord.class, "sysFloatToIntIP", org.vmmagic.unboxed.Address.class);
441      public static final RVMField sysDoubleToIntIPField =
442          getField(org.jikesrvm.runtime.BootRecord.class, "sysDoubleToIntIP", org.vmmagic.unboxed.Address.class);
443      public static final RVMField sysFloatToLongIPField =
444          getField(org.jikesrvm.runtime.BootRecord.class, "sysFloatToLongIP", org.vmmagic.unboxed.Address.class);
445      public static final RVMField sysDoubleToLongIPField =
446          getField(org.jikesrvm.runtime.BootRecord.class, "sysDoubleToLongIP", org.vmmagic.unboxed.Address.class);
447      public static final RVMField sysDoubleRemainderIPField =
448          getField(org.jikesrvm.runtime.BootRecord.class, "sysDoubleRemainderIP", org.vmmagic.unboxed.Address.class);
449    
450      public static final RVMField edgeCountersField =
451          getField(org.jikesrvm.compilers.baseline.EdgeCounts.class, "data", int[][].class);
452    
453      //////////////////
454      // Entrypoints that are valid only when the opt compiler is included in the build
455      //////////////////
456      public static final RVMField specializedMethodsField;
457    
458      public static final NormalMethod optThreadSwitchFromOsrOptMethod;
459      public static final NormalMethod optThreadSwitchFromPrologueMethod;
460      public static final NormalMethod optThreadSwitchFromBackedgeMethod;
461      public static final NormalMethod optThreadSwitchFromEpilogueMethod;
462      public static final NormalMethod yieldpointFromNativePrologueMethod;
463      public static final NormalMethod yieldpointFromNativeEpilogueMethod;
464      public static final NormalMethod optResolveMethod;
465      public static final NormalMethod optNewArrayArrayMethod;
466      public static final NormalMethod optNew2DArrayMethod;
467      public static final NormalMethod sysArrayCopy;
468    
469      static {
470        if (VM.BuildForOptCompiler) {
471          specializedMethodsField =
472              getField(org.jikesrvm.compilers.opt.specialization.SpecializedMethodPool.class,
473                       "specializedMethods",
474                       org.jikesrvm.ArchitectureSpecific.CodeArray[].class);
475          optThreadSwitchFromOsrOptMethod =
476              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromOsrOpt", "()V");
477          optThreadSwitchFromPrologueMethod =
478              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromPrologue", "()V");
479          optThreadSwitchFromBackedgeMethod =
480              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromBackedge", "()V");
481          optThreadSwitchFromEpilogueMethod =
482              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromEpilogue", "()V");
483          yieldpointFromNativePrologueMethod =
484              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromNativePrologue", "()V");
485          yieldpointFromNativeEpilogueMethod =
486              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "yieldpointFromNativeEpilogue", "()V");
487          optResolveMethod = getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptSaveVolatile.class, "resolve", "()V");
488    
489          optNewArrayArrayMethod =
490              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptLinker.class, "newArrayArray", "(I[II)Ljava/lang/Object;");
491          optNew2DArrayMethod =
492              getMethod(org.jikesrvm.compilers.opt.runtimesupport.OptLinker.class, "new2DArray", "(IIII)Ljava/lang/Object;");
493          sysArrayCopy = getMethod("Ljava/lang/VMCommonLibrarySupport;", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V");
494          sysArrayCopy.setRuntimeServiceMethod(false);
495        } else {
496          specializedMethodsField = null;
497          optThreadSwitchFromOsrOptMethod = null;
498          optThreadSwitchFromPrologueMethod = null;
499          optThreadSwitchFromBackedgeMethod = null;
500          optThreadSwitchFromEpilogueMethod = null;
501          yieldpointFromNativePrologueMethod = null;
502          yieldpointFromNativeEpilogueMethod = null;
503          optResolveMethod = null;
504          optNewArrayArrayMethod = null;
505          optNew2DArrayMethod = null;
506          sysArrayCopy = null;
507        }
508      }
509    
510      public static final RVMField classLoaderDefinedPackages =
511        getField(java.lang.ClassLoader.class, "definedPackages", java.util.HashMap.class);
512    
513      public static final RVMField luni1;
514      public static final RVMField luni2;
515      public static final RVMField luni3;
516      public static final RVMField luni4;
517      public static final RVMField luni5;
518      public static final RVMField luni6;
519    
520      static {
521        if (VM.BuildForHarmony) {
522          luni1 = getField("Lorg/apache/harmony/luni/util/Msg;", "bundle", java.util.ResourceBundle.class);
523          luni2 = getField("Lorg/apache/harmony/archive/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
524          luni3 = getField("Lorg/apache/harmony/luni/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
525          luni4 = getField("Lorg/apache/harmony/nio/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
526          luni5 = getField("Lorg/apache/harmony/niochar/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class);
527          luni6 = getField(java.util.logging.LogManager.class, "manager", java.util.logging.LogManager.class);
528        } else {
529          luni1 = null;
530          luni2 = null;
531          luni3 = null;
532          luni4 = null;
533          luni5 = null;
534          luni6 = null;
535        }
536      }
537    }