changeset 11430:a7dd2d728500

made all public, non-static fields in HotSpotVMConfig final
author Doug Simon <doug.simon@oracle.com>
date Mon, 26 Aug 2013 20:16:43 +0200
parents 496cf245f023
children ca53d08b8ef9
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java
diffstat 2 files changed, 220 insertions(+), 187 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Mon Aug 26 18:06:06 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Mon Aug 26 20:16:43 2013 +0200
@@ -194,9 +194,7 @@
         compilerToVm = toVM;
         compilerToGpu = toGPU;
         vmToCompiler = toCompiler;
-        config = new HotSpotVMConfig();
-        compilerToVm.initializeConfiguration(config);
-        config.check();
+        config = new HotSpotVMConfig(compilerToVm);
 
         // Set some global options:
         if (config.compileTheWorld) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Mon Aug 26 18:06:06 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Mon Aug 26 20:16:43 2013 +0200
@@ -22,11 +22,17 @@
  */
 package com.oracle.graal.hotspot;
 
+import java.lang.reflect.*;
+
+import com.oracle.graal.hotspot.bridge.*;
 import com.sun.management.HotSpotDiagnosticMXBean;
+
 import sun.management.ManagementFactoryHelper;
 
 /**
- * Used to communicate configuration details, runtime offsets, etc. to Graal upon compileMethod.
+ * Used to access native configuration details.
+ * 
+ * All non-static, public fields in this class are final so that they can be compiled as constants.
  */
 public final class HotSpotVMConfig extends CompilerObject {
 
@@ -34,7 +40,9 @@
 
     private final HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
 
-    HotSpotVMConfig() {
+    HotSpotVMConfig(CompilerToVM c2vm) {
+        c2vm.initializeConfiguration(this);
+        assert check();
     }
 
     /**
@@ -91,10 +99,28 @@
         }
     }
 
+    // Using systenm properties ensures the Java source compilers can never
+    // optimize away an access to a config field
+    private static final boolean UNINITIALIZED_BOOLEAN = Boolean.getBoolean("graal.config.uninitializedBoolean");
+    private static final long UNINITIALIZED_LONG = Long.getLong("graal.config.uninitializedLong", 0L);
+    private static final int UNINITIALIZED_INT = Integer.getInteger("graal.config.uninitializedInt", 0);
+
+    private static int getUninitializedInt() {
+        return UNINITIALIZED_INT;
+    }
+
+    private static long getUninitializedLong() {
+        return UNINITIALIZED_LONG;
+    }
+
+    private static boolean getUninitializedBoolean() {
+        return UNINITIALIZED_BOOLEAN;
+    }
+
     // os information, register layout, code generation, ...
-    public boolean cAssertions;
+    public final boolean cAssertions = getUninitializedBoolean();
     public final boolean windowsOs = System.getProperty("os.name", "").startsWith("Windows");
-    public int codeEntryAlignment;
+    public final int codeEntryAlignment = getUninitializedInt();
     public final boolean verifyOops = getVMOption("VerifyOops", false);
     public final boolean ciTime = getVMOption("CITime");
     public final int compileThreshold = getVMOptionInt("CompileThreshold");
@@ -110,17 +136,17 @@
     public final boolean useAESIntrinsics = getVMOption("UseAESIntrinsics");
     public final boolean useCRC32Intrinsics = getVMOption("UseCRC32Intrinsics");
     public final boolean useG1GC = getVMOption("UseG1GC");
-    public long gcTotalCollectionsAddress;
+    public final long gcTotalCollectionsAddress = getUninitializedLong();
 
     // Compressed Oops related values.
-    public boolean useCompressedOops = getVMOption("UseCompressedOops");
-    public boolean useCompressedKlassPointers = getVMOption("UseCompressedKlassPointers");
-    public long narrowOopBase;
-    public int narrowOopShift;
+    public final boolean useCompressedOops = getVMOption("UseCompressedOops");
+    public final boolean useCompressedKlassPointers = getVMOption("UseCompressedKlassPointers");
+    public final long narrowOopBase = getUninitializedLong();
+    public final int narrowOopShift = getUninitializedInt();
     public final int logMinObjAlignment = (int) (Math.log(getVMOptionInt("ObjectAlignmentInBytes")) / Math.log(2));
-    public long narrowKlassBase;
-    public int narrowKlassShift;
-    public int logKlassAlignment;
+    public final long narrowKlassBase = getUninitializedLong();
+    public final int narrowKlassShift = getUninitializedInt();
+    public final int logKlassAlignment = getUninitializedInt();
 
     // CPU capabilities
     public final int useSSE = getVMOptionInt("UseSSE");
@@ -132,127 +158,127 @@
     /**
      * The offset of the mark word in an object's header.
      */
-    public int markOffset;
+    public final int markOffset = getUninitializedInt();
 
     /**
      * The offset of the hub (i.e. Klass*) in an object's header.
      */
-    public int hubOffset;
+    public final int hubOffset = getUninitializedInt();
 
     /**
      * The offset of the _prototype_header field in a Klass.
      */
-    public int prototypeMarkWordOffset;
+    public final int prototypeMarkWordOffset = getUninitializedInt();
 
     /**
      * The offset of the _subklass field in a Klass.
      */
-    public int subklassOffset;
+    public final int subklassOffset = getUninitializedInt();
 
     /**
      * The offset of the _next_sibling field in a Klass.
      */
-    public int nextSiblingOffset;
+    public final int nextSiblingOffset = getUninitializedInt();
 
     /**
      * The offset of the array length word in an array object's header.
      */
-    public int arrayLengthOffset;
+    public final int arrayLengthOffset = getUninitializedInt();
 
     /**
      * The offset of the _length field in an Array metaspace object (see array.hpp).
      */
-    public int metaspaceArrayLengthOffset;
+    public final int metaspaceArrayLengthOffset = getUninitializedInt();
 
     /**
      * The offset of the _data field in an Array metaspace object (see array.hpp).
      */
-    public int metaspaceArrayBaseOffset;
+    public final int metaspaceArrayBaseOffset = getUninitializedInt();
 
     /**
      * The offset of the _super_check_offset field in a Klass.
      */
-    public int superCheckOffsetOffset;
+    public final int superCheckOffsetOffset = getUninitializedInt();
 
     /**
      * The offset of the _secondary_super_cache field in a Klass.
      */
-    public int secondarySuperCacheOffset;
+    public final int secondarySuperCacheOffset = getUninitializedInt();
 
     /**
      * The offset of the _secondary_supers field in a Klass.
      */
-    public int secondarySupersOffset;
+    public final int secondarySupersOffset = getUninitializedInt();
 
     /**
      * The offset of the _init_state field in an instanceKlass.
      */
-    public int klassStateOffset;
+    public final int klassStateOffset = getUninitializedInt();
 
     /**
      * The value of instanceKlass::fully_initialized.
      */
-    public int klassStateFullyInitialized;
+    public final int klassStateFullyInitialized = getUninitializedInt();
 
     /**
      * The value of objArrayKlass::element_klass_offset().
      */
-    public int arrayClassElementOffset;
+    public final int arrayClassElementOffset = getUninitializedInt();
 
     /**
      * The value of JavaThread::tlab_top_offset().
      */
-    public int threadTlabTopOffset;
+    public final int threadTlabTopOffset = getUninitializedInt();
 
     /**
      * The value of JavaThread::tlab_end_offset().
      */
-    public int threadTlabEndOffset;
+    public final int threadTlabEndOffset = getUninitializedInt();
 
     /**
      * The value of JavaThread::threadObj_offset().
      */
-    public int threadObjectOffset;
+    public final int threadObjectOffset = getUninitializedInt();
 
     /**
      * The value of JavaThread::osthread_offset().
      */
-    public int osThreadOffset;
+    public final int osThreadOffset = getUninitializedInt();
 
     /**
      * The value of OSThread::interrupted_offset().
      */
-    public int osThreadInterruptedOffset;
+    public final int osThreadInterruptedOffset = getUninitializedInt();
 
     /**
      * The value of markOopDesc::unlocked_value.
      */
-    public int unlockedMask;
+    public final int unlockedMask = getUninitializedInt();
 
     /**
      * The value of markOopDesc::biased_lock_mask_in_place.
      */
-    public int biasedLockMaskInPlace;
+    public final int biasedLockMaskInPlace = getUninitializedInt();
 
     /**
      * The value of markOopDesc::age_mask_in_place.
      */
-    public int ageMaskInPlace;
+    public final int ageMaskInPlace = getUninitializedInt();
 
     /**
      * The value of markOopDesc::epoch_mask_in_place.
      */
-    public int epochMaskInPlace;
+    public final int epochMaskInPlace = getUninitializedInt();
 
     /**
      * The value of markOopDesc::biased_lock_pattern.
      */
-    public int biasedLockPattern;
+    public final int biasedLockPattern = getUninitializedInt();
 
     /**
      * Identity hash code value when uninitialized.
      */
-    public int uninitializedIdentityHashCodeValue;
+    public final int uninitializedIdentityHashCodeValue = getUninitializedInt();
 
     /**
      * Offset of the _pending_exception field in ThreadShadow (defined in exceptions.hpp). This
@@ -260,83 +286,83 @@
      * <p>
      * <b>NOTE: This is not the same as {@link #threadExceptionOopOffset}.</b>
      */
-    public int pendingExceptionOffset;
+    public final int pendingExceptionOffset = getUninitializedInt();
 
     /**
      * Offset of the pending deoptimization field.
      */
-    public int pendingDeoptimizationOffset;
+    public final int pendingDeoptimizationOffset = getUninitializedInt();
 
     /**
      * Mark word right shift to get identity hash code.
      */
-    public int identityHashCodeShift;
+    public final int identityHashCodeShift = getUninitializedInt();
 
     /**
      * Offset of _access_flags in a metaspace Method object.
      */
-    public int methodAccessFlagsOffset;
+    public final int methodAccessFlagsOffset = getUninitializedInt();
 
     /**
      * JVM_ACC_QUEUED defined in accessFlags.hpp and used for marking a Method object as queued for
      * compilation.
      */
-    public int methodQueuedForCompilationBit;
+    public final int methodQueuedForCompilationBit = getUninitializedInt();
 
     /**
      * Offset of _intrinsic_id in a metaspace Method object.
      */
-    public int methodIntrinsicIdOffset;
+    public final int methodIntrinsicIdOffset = getUninitializedInt();
 
     /**
      * Offset of _max_locals in a metaspace Method object.
      */
-    public int methodMaxLocalsOffset;
+    public final int methodMaxLocalsOffset = getUninitializedInt();
 
     /**
      * Offset of _constMethod in a metaspace Method object.
      */
-    public int methodConstMethodOffset;
+    public final int methodConstMethodOffset = getUninitializedInt();
 
     /**
      * Offset of _max_stack in a metaspace ConstMethod object.
      */
-    public int constMethodMaxStackOffset;
+    public final int constMethodMaxStackOffset = getUninitializedInt();
 
     /**
      * Offset of _constants in a metaspace ConstMethod object.
      */
-    public int constMethodConstantsOffset;
+    public final int constMethodConstantsOffset = getUninitializedInt();
 
     /**
      * Offset of _pool_holder in a metaspace ConstantPool object.
      */
-    public int constantPoolHolderOffset;
+    public final int constantPoolHolderOffset = getUninitializedInt();
 
     /**
      * Value of extra_stack_entries() in method.hpp.
      */
-    public int extraStackEntries;
+    public final int extraStackEntries = getUninitializedInt();
 
     /**
      * Value of JVM_ACC_HAS_FINALIZER in accessFlags.hpp.
      */
-    public int klassHasFinalizerFlag;
+    public final int klassHasFinalizerFlag = getUninitializedInt();
 
     /**
      * The value of JavaThread::is_method_handle_return_offset().
      */
-    public int threadIsMethodHandleReturnOffset;
+    public final int threadIsMethodHandleReturnOffset = getUninitializedInt();
 
     /**
      * Bit pattern that represents a non-oop. Neither the high bits nor the low bits of this value
      * are allowed to look like (respectively) the high or low bits of a real oop.
      */
-    public long nonOopBits;
+    public final long nonOopBits = getUninitializedLong();
 
-    public long verifyOopCounterAddress;
-    public long verifyOopMask;
-    public long verifyOopBits;
+    public final long verifyOopCounterAddress = getUninitializedLong();
+    public final long verifyOopMask = getUninitializedLong();
+    public final long verifyOopBits = getUninitializedLong();
 
     /**
      * Offset of the _exception_oop field in Thread (defined in thread.hpp). This field is used to
@@ -345,207 +371,216 @@
      * <p>
      * <b>NOTE: This is not the same as {@link #pendingExceptionOffset}.</b>
      */
-    public int threadExceptionOopOffset;
+    public final int threadExceptionOopOffset = getUninitializedInt();
 
-    public int threadExceptionPcOffset;
-    public long cardtableStartAddress;
-    public int cardtableShift;
-    public long safepointPollingAddress;
-    public boolean isPollingPageFar;
+    public final int threadExceptionPcOffset = getUninitializedInt();
+    public final long cardtableStartAddress = getUninitializedLong();
+    public final int cardtableShift = getUninitializedInt();
+    public final long safepointPollingAddress = getUninitializedLong();
+    public final boolean isPollingPageFar = getUninitializedBoolean();
 
     /**
      * G1 Collector Related Values.
      */
-    public int g1CardQueueIndexOffset;
-    public int g1CardQueueBufferOffset;
-    public int logOfHRGrainBytes;
-    public int g1SATBQueueMarkingOffset;
-    public int g1SATBQueueIndexOffset;
-    public int g1SATBQueueBufferOffset;
+    public final int g1CardQueueIndexOffset = getUninitializedInt();
+    public final int g1CardQueueBufferOffset = getUninitializedInt();
+    public final int logOfHRGrainBytes = getUninitializedInt();
+    public final int g1SATBQueueMarkingOffset = getUninitializedInt();
+    public final int g1SATBQueueIndexOffset = getUninitializedInt();
+    public final int g1SATBQueueBufferOffset = getUninitializedInt();
 
     /**
      * The offset of the _java_mirror field (of type {@link Class}) in a Klass.
      */
-    public int classMirrorOffset;
+    public final int classMirrorOffset = getUninitializedInt();
 
-    public int runtimeCallStackSize;
+    public final int runtimeCallStackSize = getUninitializedInt();
 
     /**
      * The offset of the _modifier_flags field in a Klass.
      */
-    public int klassModifierFlagsOffset;
+    public final int klassModifierFlagsOffset = getUninitializedInt();
 
     /**
      * The offset of the _access_flags field in a Klass.
      */
-    public int klassAccessFlagsOffset;
+    public final int klassAccessFlagsOffset = getUninitializedInt();
 
     /**
      * The offset of the _layout_helper field in a Klass.
      */
-    public int klassLayoutHelperOffset;
+    public final int klassLayoutHelperOffset = getUninitializedInt();
 
     /**
      * Bit pattern in the klass layout helper that can be used to identify arrays.
      */
-    public int arrayKlassLayoutHelperIdentifier;
+    public final int arrayKlassLayoutHelperIdentifier = getUninitializedInt();
 
     /**
      * The offset of the _componentMirror field in an ArrayKlass.
      */
-    public int arrayKlassComponentMirrorOffset;
+    public final int arrayKlassComponentMirrorOffset = getUninitializedInt();
 
     /**
      * The offset of the _super field in a Klass.
      */
-    public int klassSuperKlassOffset;
+    public final int klassSuperKlassOffset = getUninitializedInt();
 
     /**
      * The offset of the injected klass field in a {@link Class}.
      */
-    public int klassOffset;
+    public final int klassOffset = getUninitializedInt();
 
     /**
      * The offset of the injected array klass field in a {@link Class}.
      */
-    public int arrayKlassOffset;
+    public final int arrayKlassOffset = getUninitializedInt();
 
     /**
      * The offset of the injected graal_mirror field in a {@link Class}.
      */
-    public int graalMirrorInClassOffset;
+    public final int graalMirrorInClassOffset = getUninitializedInt();
 
     /**
      * The offset of the _method_data field in a metaspace Method.
      */
-    public int methodDataOffset;
+    public final int methodDataOffset = getUninitializedInt();
 
-    public int nmethodEntryOffset;
-    public int methodCompiledEntryOffset;
-    public int basicLockSize;
-    public int basicLockDisplacedHeaderOffset;
-    public long tlabIntArrayMarkWord;
-    public long heapEndAddress;
-    public long heapTopAddress;
-    public int threadTlabStartOffset;
-    public int threadTlabSizeOffset;
-    public int threadAllocatedBytesOffset;
-    public int threadLastJavaSpOffset;
-    public int threadLastJavaPcOffset;
+    public final int nmethodEntryOffset = getUninitializedInt();
+    public final int methodCompiledEntryOffset = getUninitializedInt();
+    public final int basicLockSize = getUninitializedInt();
+    public final int basicLockDisplacedHeaderOffset = getUninitializedInt();
+    public final long tlabIntArrayMarkWord = getUninitializedLong();
+    public final long heapEndAddress = getUninitializedLong();
+    public final long heapTopAddress = getUninitializedLong();
+    public final int threadTlabStartOffset = getUninitializedInt();
+    public final int threadTlabSizeOffset = getUninitializedInt();
+    public final int threadAllocatedBytesOffset = getUninitializedInt();
+    public final int threadLastJavaSpOffset = getUninitializedInt();
+    public final int threadLastJavaPcOffset = getUninitializedInt();
 
     /**
      * This value is only valid on AMD64.
      */
-    public int threadLastJavaFpOffset;
+    public final int threadLastJavaFpOffset = getUninitializedInt();
 
     /**
      * This value is only valid on SPARC.
      */
-    public int threadJavaFrameAnchorFlagsOffset;
+    public final int threadJavaFrameAnchorFlagsOffset = getUninitializedInt();
 
-    public int threadObjectResultOffset;
-    public int tlabRefillWasteLimitOffset;
-    public int tlabRefillWasteIncrement;
-    public int tlabAlignmentReserve;
-    public int tlabSlowAllocationsOffset;
-    public int tlabFastRefillWasteOffset;
-    public int tlabNumberOfRefillsOffset;
+    public final int threadObjectResultOffset = getUninitializedInt();
+    public final int tlabRefillWasteLimitOffset = getUninitializedInt();
+    public final int tlabRefillWasteIncrement = getUninitializedInt();
+    public final int tlabAlignmentReserve = getUninitializedInt();
+    public final int tlabSlowAllocationsOffset = getUninitializedInt();
+    public final int tlabFastRefillWasteOffset = getUninitializedInt();
+    public final int tlabNumberOfRefillsOffset = getUninitializedInt();
     public final boolean tlabStats = getVMOption("TLABStats");
-    public int klassInstanceSizeOffset;
-    public boolean inlineContiguousAllocationSupported;
-    public long arrayPrototypeMarkWord;
-    public int layoutHelperLog2ElementSizeShift;
-    public int layoutHelperLog2ElementSizeMask;
-    public int layoutHelperElementTypeShift;
-    public int layoutHelperElementTypeMask;
-    public int layoutHelperElementTypePrimitiveInPlace;
-    public int layoutHelperHeaderSizeShift;
-    public int layoutHelperHeaderSizeMask;
-    public int layoutHelperOffset;
+    public final int klassInstanceSizeOffset = getUninitializedInt();
+    public final boolean inlineContiguousAllocationSupported = getUninitializedBoolean();
+    public final long arrayPrototypeMarkWord = getUninitializedLong();
+    public final int layoutHelperLog2ElementSizeShift = getUninitializedInt();
+    public final int layoutHelperLog2ElementSizeMask = getUninitializedInt();
+    public final int layoutHelperElementTypeShift = getUninitializedInt();
+    public final int layoutHelperElementTypeMask = getUninitializedInt();
+    public final int layoutHelperElementTypePrimitiveInPlace = getUninitializedInt();
+    public final int layoutHelperHeaderSizeShift = getUninitializedInt();
+    public final int layoutHelperHeaderSizeMask = getUninitializedInt();
+    public final int layoutHelperOffset = getUninitializedInt();
 
     // methodData information
-    public int methodDataOopDataOffset;
-    public int methodDataOopTrapHistoryOffset;
-    public int dataLayoutHeaderSize;
-    public int dataLayoutTagOffset;
-    public int dataLayoutFlagsOffset;
-    public int dataLayoutBCIOffset;
-    public int dataLayoutCellsOffset;
-    public int dataLayoutCellSize;
-    public final int bciProfileWidth = getVMOption("BciProfileWidth", 2);  // develop flag; might
-// change
+    public final int methodDataOopDataOffset = getUninitializedInt();
+    public final int methodDataOopTrapHistoryOffset = getUninitializedInt();
+    public final int dataLayoutHeaderSize = getUninitializedInt();
+    public final int dataLayoutTagOffset = getUninitializedInt();
+    public final int dataLayoutFlagsOffset = getUninitializedInt();
+    public final int dataLayoutBCIOffset = getUninitializedInt();
+    public final int dataLayoutCellsOffset = getUninitializedInt();
+    public final int dataLayoutCellSize = getUninitializedInt();
+
+    // develop flag; might change
+    public final int bciProfileWidth = getVMOption("BciProfileWidth", 2);
+
     public final int typeProfileWidth = getVMOptionInt("TypeProfileWidth");
     public final int methodProfileWidth = getVMOptionInt("MethodProfileWidth");
 
-    public long inlineCacheMissStub;
-    public long handleDeoptStub;
-    public long uncommonTrapStub;
+    public final long inlineCacheMissStub = getUninitializedLong();
+    public final long handleDeoptStub = getUninitializedLong();
+    public final long uncommonTrapStub = getUninitializedLong();
 
-    public long aescryptEncryptBlockStub;
-    public long aescryptDecryptBlockStub;
-    public long cipherBlockChainingEncryptAESCryptStub;
-    public long cipherBlockChainingDecryptAESCryptStub;
-    public long updateBytesCRC32Stub;
+    public final long aescryptEncryptBlockStub = getUninitializedLong();
+    public final long aescryptDecryptBlockStub = getUninitializedLong();
+    public final long cipherBlockChainingEncryptAESCryptStub = getUninitializedLong();
+    public final long cipherBlockChainingDecryptAESCryptStub = getUninitializedLong();
+    public final long updateBytesCRC32Stub = getUninitializedLong();
 
-    public long newInstanceAddress;
-    public long newArrayAddress;
-    public long newMultiArrayAddress;
-    public long dynamicNewArrayAddress;
-    public long registerFinalizerAddress;
-    public long threadIsInterruptedAddress;
-    public long vmMessageAddress;
-    public long identityHashCodeAddress;
-    public long exceptionHandlerForPcAddress;
-    public long exceptionHandlerForReturnAddressAddress;
-    public long osrMigrationEndAddress;
-    public long monitorenterAddress;
-    public long monitorexitAddress;
-    public long createNullPointerExceptionAddress;
-    public long createOutOfBoundsExceptionAddress;
-    public long logPrimitiveAddress;
-    public long logObjectAddress;
-    public long logPrintfAddress;
-    public long vmErrorAddress;
-    public long writeBarrierPreAddress;
-    public long writeBarrierPostAddress;
-    public long validateObject;
-    public long javaTimeMillisAddress;
-    public long javaTimeNanosAddress;
-    public long arithmeticSinAddress;
-    public long arithmeticCosAddress;
-    public long arithmeticTanAddress;
-    public long loadAndClearExceptionAddress;
-    public long crcTableAddress;
+    public final long newInstanceAddress = getUninitializedLong();
+    public final long newArrayAddress = getUninitializedLong();
+    public final long newMultiArrayAddress = getUninitializedLong();
+    public final long dynamicNewArrayAddress = getUninitializedLong();
+    public final long registerFinalizerAddress = getUninitializedLong();
+    public final long threadIsInterruptedAddress = getUninitializedLong();
+    public final long vmMessageAddress = getUninitializedLong();
+    public final long identityHashCodeAddress = getUninitializedLong();
+    public final long exceptionHandlerForPcAddress = getUninitializedLong();
+    public final long exceptionHandlerForReturnAddressAddress = getUninitializedLong();
+    public final long osrMigrationEndAddress = getUninitializedLong();
+    public final long monitorenterAddress = getUninitializedLong();
+    public final long monitorexitAddress = getUninitializedLong();
+    public final long createNullPointerExceptionAddress = getUninitializedLong();
+    public final long createOutOfBoundsExceptionAddress = getUninitializedLong();
+    public final long logPrimitiveAddress = getUninitializedLong();
+    public final long logObjectAddress = getUninitializedLong();
+    public final long logPrintfAddress = getUninitializedLong();
+    public final long vmErrorAddress = getUninitializedLong();
+    public final long writeBarrierPreAddress = getUninitializedLong();
+    public final long writeBarrierPostAddress = getUninitializedLong();
+    public final long validateObject = getUninitializedLong();
+    public final long javaTimeMillisAddress = getUninitializedLong();
+    public final long javaTimeNanosAddress = getUninitializedLong();
+    public final long arithmeticSinAddress = getUninitializedLong();
+    public final long arithmeticCosAddress = getUninitializedLong();
+    public final long arithmeticTanAddress = getUninitializedLong();
+    public final long loadAndClearExceptionAddress = getUninitializedLong();
+    public final long crcTableAddress = getUninitializedLong();
 
-    public int deoptReasonNone;
-    public int deoptReasonNullCheck;
-    public int deoptReasonRangeCheck;
-    public int deoptReasonClassCheck;
-    public int deoptReasonArrayCheck;
-    public int deoptReasonUnreached0;
-    public int deoptReasonTypeCheckInlining;
-    public int deoptReasonOptimizedTypeCheck;
-    public int deoptReasonNotCompiledExceptionHandler;
-    public int deoptReasonUnresolved;
-    public int deoptReasonJsrMismatch;
-    public int deoptReasonDiv0Check;
-    public int deoptReasonConstraint;
-    public int deoptReasonLoopLimitCheck;
+    public final int deoptReasonNone = getUninitializedInt();
+    public final int deoptReasonNullCheck = getUninitializedInt();
+    public final int deoptReasonRangeCheck = getUninitializedInt();
+    public final int deoptReasonClassCheck = getUninitializedInt();
+    public final int deoptReasonArrayCheck = getUninitializedInt();
+    public final int deoptReasonUnreached0 = getUninitializedInt();
+    public final int deoptReasonTypeCheckInlining = getUninitializedInt();
+    public final int deoptReasonOptimizedTypeCheck = getUninitializedInt();
+    public final int deoptReasonNotCompiledExceptionHandler = getUninitializedInt();
+    public final int deoptReasonUnresolved = getUninitializedInt();
+    public final int deoptReasonJsrMismatch = getUninitializedInt();
+    public final int deoptReasonDiv0Check = getUninitializedInt();
+    public final int deoptReasonConstraint = getUninitializedInt();
+    public final int deoptReasonLoopLimitCheck = getUninitializedInt();
 
-    public int deoptActionNone;
-    public int deoptActionMaybeRecompile;
-    public int deoptActionReinterpret;
-    public int deoptActionMakeNotEntrant;
-    public int deoptActionMakeNotCompilable;
+    public final int deoptActionNone = getUninitializedInt();
+    public final int deoptActionMaybeRecompile = getUninitializedInt();
+    public final int deoptActionReinterpret = getUninitializedInt();
+    public final int deoptActionMakeNotEntrant = getUninitializedInt();
+    public final int deoptActionMakeNotCompilable = getUninitializedInt();
 
-    public int vmIntrinsicInvokeBasic;
-    public int vmIntrinsicLinkToVirtual;
-    public int vmIntrinsicLinkToStatic;
-    public int vmIntrinsicLinkToSpecial;
-    public int vmIntrinsicLinkToInterface;
+    public final int vmIntrinsicInvokeBasic = getUninitializedInt();
+    public final int vmIntrinsicLinkToVirtual = getUninitializedInt();
+    public final int vmIntrinsicLinkToStatic = getUninitializedInt();
+    public final int vmIntrinsicLinkToSpecial = getUninitializedInt();
+    public final int vmIntrinsicLinkToInterface = getUninitializedInt();
 
-    public void check() {
-        assert codeEntryAlignment > 0;
+    public boolean check() {
+        assert codeEntryAlignment > 0 : codeEntryAlignment;
         assert stackShadowPages > 0;
+        for (Field f : getClass().getDeclaredFields()) {
+            int modifiers = f.getModifiers();
+            if (Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers)) {
+                assert Modifier.isFinal(modifiers) : "field should be final: " + f;
+            }
+        }
+        return true;
     }
 }