1 /*
  2  * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 package jdk.vm.ci.hotspot;
 24 
 25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
 26 import static jdk.vm.ci.hotspot.UnsafeAccess.UNSAFE;
 27 
 28 import jdk.vm.ci.common.JVMCIError;
 29 import jdk.vm.ci.services.Services;
 30 import jdk.internal.misc.Unsafe;
 31 
 32 /**
 33  * Used to access native configuration details.
 34  *
 35  * All non-static, public fields in this class are so that they can be compiled as constants.
 36  */
 37 class HotSpotVMConfig extends HotSpotVMConfigAccess {
 38 
 39     /**
 40      * Gets the configuration associated with the singleton {@link HotSpotJVMCIRuntime}.
 41      */
 42     static HotSpotVMConfig config() {
 43         return runtime().getConfig();
 44     }
 45 
 46     private final String osArch = getHostArchitectureName();
 47 
 48     HotSpotVMConfig(HotSpotVMConfigStore store) {
 49         super(store);
 50 
 51         int speculationLengthBits = getConstant("JVMCINMethodData::SPECULATION_LENGTH_BITS", Integer.class);
 52         JVMCIError.guarantee(HotSpotSpeculationEncoding.LENGTH_BITS == speculationLengthBits, "%d != %d", HotSpotSpeculationEncoding.LENGTH_BITS, speculationLengthBits);
 53     }
 54 
 55     /**
 56      * Gets the host architecture name for the purpose of finding the corresponding
 57      * {@linkplain HotSpotJVMCIBackendFactory backend}.
 58      */
 59     String getHostArchitectureName() {
 60         String arch = Services.getSavedProperty("os.arch");
 61         switch (arch) {
 62             case "x86_64":
 63                 return "amd64";
 64 
 65             default:
 66                 return arch;
 67         }
 68     }
 69 
 70     final boolean useDeferredInitBarriers = getFlag("ReduceInitialCardMarks", Boolean.class);
 71 
 72     final boolean useCompressedOops = getFlag("UseCompressedOops", Boolean.class);
 73 
 74     final int objectAlignment = getFlag("ObjectAlignmentInBytes", Integer.class);
 75 
 76     final int hubOffset = getFieldOffset("oopDesc::_metadata._klass", Integer.class, "Klass*");
 77 
 78     final int subklassOffset = getFieldOffset("Klass::_subklass", Integer.class, "Klass*");
 79     final int superOffset = getFieldOffset("Klass::_super", Integer.class, "Klass*");
 80     final int nextSiblingOffset = getFieldOffset("Klass::_next_sibling", Integer.class, "Klass*");
 81     final int superCheckOffsetOffset = getFieldOffset("Klass::_super_check_offset", Integer.class, "juint");
 82     final int secondarySuperCacheOffset = getFieldOffset("Klass::_secondary_super_cache", Integer.class, "Klass*");
 83 
 84     final int classLoaderDataOffset = getFieldOffset("Klass::_class_loader_data", Integer.class, "ClassLoaderData*");
 85 
 86     /**
 87      * The offset of the _java_mirror field (of type {@link Class}) in a Klass.
 88      */
 89     final int javaMirrorOffset = getFieldOffset("Klass::_java_mirror", Integer.class, "OopHandle");
 90 
 91     final int klassAccessFlagsOffset = getFieldOffset("Klass::_access_flags", Integer.class, "AccessFlags");
 92     final int klassLayoutHelperOffset = getFieldOffset("Klass::_layout_helper", Integer.class, "jint");
 93 
 94     final int klassLayoutHelperNeutralValue = getConstant("Klass::_lh_neutral_value", Integer.class);
 95     final int klassLayoutHelperInstanceSlowPathBit = getConstant("Klass::_lh_instance_slow_path_bit", Integer.class);
 96 
 97     final int vtableEntrySize = getFieldValue("CompilerToVM::Data::sizeof_vtableEntry", Integer.class, "int");
 98     final int vtableEntryMethodOffset = getFieldOffset("vtableEntry::_method", Integer.class, "Method*");
 99 
100     final int instanceKlassInitStateOffset = getFieldOffset("InstanceKlass::_init_state", Integer.class, "InstanceKlass::ClassState");
101     final int instanceKlassConstantsOffset = getFieldOffset("InstanceKlass::_constants", Integer.class, "ConstantPool*");
102     final int instanceKlassFieldInfoStreamOffset = getFieldOffset("InstanceKlass::_fieldinfo_stream", Integer.class, "Array<u1>*");
103     final int instanceKlassAnnotationsOffset = getFieldOffset("InstanceKlass::_annotations", Integer.class, "Annotations*");
104     final int instanceKlassMiscFlagsOffset = getFieldOffset("InstanceKlass::_misc_flags._flags", Integer.class, "u2");
105     final int klassVtableStartOffset = getFieldValue("CompilerToVM::Data::Klass_vtable_start_offset", Integer.class, "int");
106     final int klassVtableLengthOffset = getFieldValue("CompilerToVM::Data::Klass_vtable_length_offset", Integer.class, "int");
107 
108     final int instanceKlassStateLinked = getConstant("InstanceKlass::linked", Integer.class);
109     final int instanceKlassStateFullyInitialized = getConstant("InstanceKlass::fully_initialized", Integer.class);
110     final int instanceKlassStateBeingInitialized = getConstant("InstanceKlass::being_initialized", Integer.class);
111 
112     final int annotationsFieldAnnotationsOffset = getFieldOffset("Annotations::_fields_annotations", Integer.class, "Array<AnnotationArray*>*");
113     final int annotationsClassAnnotationsOffset = getFieldOffset("Annotations::_class_annotations", Integer.class, "AnnotationArray*");
114     final int fieldsAnnotationsBaseOffset = getFieldValue("CompilerToVM::Data::_fields_annotations_base_offset", Integer.class, "int");
115 
116     final int arrayU1LengthOffset = getFieldOffset("Array<int>::_length", Integer.class, "int");
117     final int arrayU1DataOffset = getFieldOffset("Array<u1>::_data", Integer.class);
118     final int arrayU2DataOffset = getFieldOffset("Array<u2>::_data", Integer.class);
119 
120     final int jvmAccHasFinalizer = getConstant("JVM_ACC_HAS_FINALIZER", Integer.class);
121     final int jvmFieldFlagInternalShift = getConstant("FieldInfo::FieldFlags::_ff_injected", Integer.class);
122     final int jvmFieldFlagStableShift = getConstant("FieldInfo::FieldFlags::_ff_stable", Integer.class);
123     final int jvmAccIsCloneableFast = getConstant("JVM_ACC_IS_CLONEABLE_FAST", Integer.class);
124 
125     // These modifiers are not public in Modifier so we get them via vmStructs.
126     final int jvmAccSynthetic = getConstant("JVM_ACC_SYNTHETIC", Integer.class);
127     final int jvmAccAnnotation = getConstant("JVM_ACC_ANNOTATION", Integer.class);
128     final int jvmAccBridge = getConstant("JVM_ACC_BRIDGE", Integer.class);
129     final int jvmAccVarargs = getConstant("JVM_ACC_VARARGS", Integer.class);
130     final int jvmAccEnum = getConstant("JVM_ACC_ENUM", Integer.class);
131     final int jvmAccInterface = getConstant("JVM_ACC_INTERFACE", Integer.class);
132 
133     final int jvmMiscFlagsHasDefaultMethods = getConstant("InstanceKlassFlags::_misc_has_nonstatic_concrete_methods", Integer.class);
134     final int jvmMiscFlagsDeclaresDefaultMethods = getConstant("InstanceKlassFlags::_misc_declares_nonstatic_concrete_methods", Integer.class);
135 
136     // This is only valid on AMD64.
137     final int runtimeCallStackSize = getConstant("frame::arg_reg_save_area_bytes", Integer.class, osArch.equals("amd64") ? null : 0);
138 
139     private final int markWordNoHashInPlace = getConstant("markWord::no_hash_in_place", Integer.class);
140     private final int markWordNoLockInPlace = getConstant("markWord::no_lock_in_place", Integer.class);
141 
142     /**
143      * See {@code markWord::prototype()}.
144      */
145     long prototypeMarkWord() {
146         return markWordNoHashInPlace | markWordNoLockInPlace;
147     }
148 
149     final int methodAccessFlagsOffset = getFieldOffset("Method::_access_flags", Integer.class, "AccessFlags");
150     final int methodConstMethodOffset = getFieldOffset("Method::_constMethod", Integer.class, "ConstMethod*");
151     final int methodIntrinsicIdOffset = getFieldOffset("Method::_intrinsic_id", Integer.class, "u2");
152     final int methodFlagsOffset = getFieldOffset("Method::_flags._status", Integer.class, "u4");
153     final int methodVtableIndexOffset = getFieldOffset("Method::_vtable_index", Integer.class, "int");
154 
155     final int methodDataOffset = getFieldOffset("Method::_method_data", Integer.class, "MethodData*");
156     final int methodCodeOffset = getFieldOffset("Method::_code", Integer.class, "CompiledMethod*");
157 
158     final int methodFlagsForceInline = getConstant("MethodFlags::_misc_force_inline", Integer.class);
159     final int methodFlagsDontInline = getConstant("MethodFlags::_misc_dont_inline", Integer.class);
160     final int nonvirtualVtableIndex = getConstant("Method::nonvirtual_vtable_index", Integer.class);
161     final int invalidVtableIndex = getConstant("Method::invalid_vtable_index", Integer.class);
162 
163     final int methodDataSize = getFieldOffset("MethodData::_size", Integer.class, "int");
164     final int methodDataDataSize = getFieldOffset("MethodData::_data_size", Integer.class, "int");
165     final int methodDataOopDataOffset = getFieldOffset("MethodData::_data[0]", Integer.class, "intptr_t");
166     final int methodDataOopTrapHistoryOffset = getFieldOffset("MethodData::_compiler_counters._trap_hist._array[0]", Integer.class, "u1");
167     final int methodDataIRSizeOffset = getFieldOffset("MethodData::_jvmci_ir_size", Integer.class, "int");
168 
169     final int methodDataDecompiles = getFieldOffset("MethodData::_compiler_counters._nof_decompiles", Integer.class, "uint");
170     final int methodDataOverflowRecompiles = getFieldOffset("MethodData::_compiler_counters._nof_overflow_recompiles", Integer.class, "uint");
171     final int methodDataOverflowTraps = getFieldOffset("MethodData::_compiler_counters._nof_overflow_traps", Integer.class, "uint");
172 
173     final int nmethodCompLevelOffset = getFieldOffset("nmethod::_comp_level", Integer.class, "CompLevel");
174 
175     final int compilationLevelNone = getConstant("CompLevel_none", Integer.class);
176     final int compilationLevelSimple = getConstant("CompLevel_simple", Integer.class);
177     final int compilationLevelLimitedProfile = getConstant("CompLevel_limited_profile", Integer.class);
178     final int compilationLevelFullProfile = getConstant("CompLevel_full_profile", Integer.class);
179     final int compilationLevelFullOptimization = getConstant("CompLevel_full_optimization", Integer.class);
180 
181     final int compLevelAdjustmentNone = getConstant("JVMCIRuntime::none", Integer.class);
182     final int compLevelAdjustmentByHolder = getConstant("JVMCIRuntime::by_holder", Integer.class);
183     final int compLevelAdjustmentByFullSignature = getConstant("JVMCIRuntime::by_full_signature", Integer.class);
184 
185     final int invocationEntryBci = getConstant("InvocationEntryBci", Integer.class);
186 
187     final int extraStackEntries = getFieldValue("CompilerToVM::Data::Method_extra_stack_entries", Integer.class, "int");
188 
189     final int constMethodConstantsOffset = getFieldOffset("ConstMethod::_constants", Integer.class, "ConstantPool*");
190     final int constMethodFlagsOffset = getFieldOffset("ConstMethod::_flags._flags", Integer.class, "u4");
191     final int constMethodCodeSizeOffset = getFieldOffset("ConstMethod::_code_size", Integer.class, "u2");
192     final int constMethodNameIndexOffset = getFieldOffset("ConstMethod::_name_index", Integer.class, "u2");
193     final int constMethodSignatureIndexOffset = getFieldOffset("ConstMethod::_signature_index", Integer.class, "u2");
194     final int constMethodMethodIdnumOffset = getFieldOffset("ConstMethod::_method_idnum", Integer.class, "u2");
195     final int constMethodMaxStackOffset = getFieldOffset("ConstMethod::_max_stack", Integer.class, "u2");
196     final int methodMaxLocalsOffset = getFieldOffset("ConstMethod::_max_locals", Integer.class, "u2");
197 
198     final int constMethodFlagsReservedStackAccess = getConstant("ConstMethodFlags::_misc_reserved_stack_access", Integer.class);
199     final int constMethodFlagsCallerSensitive = getConstant("ConstMethodFlags::_misc_caller_sensitive", Integer.class);
200     final int constMethodFlagsIntrinsicCandidate = getConstant("ConstMethodFlags::_misc_intrinsic_candidate", Integer.class);
201     final int constMethodHasLineNumberTable = getConstant("ConstMethodFlags::_misc_has_linenumber_table", Integer.class);
202     final int constMethodHasLocalVariableTable = getConstant("ConstMethodFlags::_misc_has_localvariable_table", Integer.class);
203     final int constMethodHasMethodAnnotations = getConstant("ConstMethodFlags::_misc_has_method_annotations", Integer.class);
204     final int constMethodHasParameterAnnotations = getConstant("ConstMethodFlags::_misc_has_parameter_annotations", Integer.class);
205     final int constMethodHasExceptionTable = getConstant("ConstMethodFlags::_misc_has_exception_table", Integer.class);
206 
207     final int exceptionTableElementSize = getFieldValue("CompilerToVM::Data::sizeof_ExceptionTableElement", Integer.class, "int");
208     final int exceptionTableElementStartPcOffset = getFieldOffset("ExceptionTableElement::start_pc", Integer.class, "u2");
209     final int exceptionTableElementEndPcOffset = getFieldOffset("ExceptionTableElement::end_pc", Integer.class, "u2");
210     final int exceptionTableElementHandlerPcOffset = getFieldOffset("ExceptionTableElement::handler_pc", Integer.class, "u2");
211     final int exceptionTableElementCatchTypeIndexOffset = getFieldOffset("ExceptionTableElement::catch_type_index", Integer.class, "u2");
212 
213     final int localVariableTableElementSize = getFieldValue("CompilerToVM::Data::sizeof_LocalVariableTableElement", Integer.class, "int");
214     final int localVariableTableElementStartBciOffset = getFieldOffset("LocalVariableTableElement::start_bci", Integer.class, "u2");
215     final int localVariableTableElementLengthOffset = getFieldOffset("LocalVariableTableElement::length", Integer.class, "u2");
216     final int localVariableTableElementNameCpIndexOffset = getFieldOffset("LocalVariableTableElement::name_cp_index", Integer.class, "u2");
217     final int localVariableTableElementDescriptorCpIndexOffset = getFieldOffset("LocalVariableTableElement::descriptor_cp_index", Integer.class, "u2");
218     final int localVariableTableElementSlotOffset = getFieldOffset("LocalVariableTableElement::slot", Integer.class, "u2");
219 
220     final int constantPoolSize = getFieldValue("CompilerToVM::Data::sizeof_ConstantPool", Integer.class, "int");
221     final int constantPoolTagsOffset = getFieldOffset("ConstantPool::_tags", Integer.class, "Array<u1>*");
222     final int constantPoolHolderOffset = getFieldOffset("ConstantPool::_pool_holder", Integer.class, "InstanceKlass*");
223     final int constantPoolLengthOffset = getFieldOffset("ConstantPool::_length", Integer.class, "int");
224     final int constantPoolFlagsOffset = getFieldOffset("ConstantPool::_flags", Integer.class, "u2");
225 
226     final int constantPoolCpCacheIndexTag = getConstant("ConstantPool::CPCACHE_INDEX_TAG", Integer.class);
227     final int constantPoolHasDynamicConstant = getConstant("ConstantPool::_has_dynamic_constant", Integer.class);
228     final int constantPoolSourceFileNameIndexOffset = getFieldOffset("ConstantPool::_source_file_name_index", Integer.class, "u2");
229 
230     final int jvmConstantUtf8 = getConstant("JVM_CONSTANT_Utf8", Integer.class);
231     final int jvmConstantInteger = getConstant("JVM_CONSTANT_Integer", Integer.class);
232     final int jvmConstantLong = getConstant("JVM_CONSTANT_Long", Integer.class);
233     final int jvmConstantFloat = getConstant("JVM_CONSTANT_Float", Integer.class);
234     final int jvmConstantDouble = getConstant("JVM_CONSTANT_Double", Integer.class);
235     final int jvmConstantClass = getConstant("JVM_CONSTANT_Class", Integer.class);
236     final int jvmConstantUnresolvedClass = getConstant("JVM_CONSTANT_UnresolvedClass", Integer.class);
237     final int jvmConstantUnresolvedClassInError = getConstant("JVM_CONSTANT_UnresolvedClassInError", Integer.class);
238     final int jvmConstantString = getConstant("JVM_CONSTANT_String", Integer.class);
239     final int jvmConstantFieldref = getConstant("JVM_CONSTANT_Fieldref", Integer.class);
240     final int jvmConstantMethodref = getConstant("JVM_CONSTANT_Methodref", Integer.class);
241     final int jvmConstantInterfaceMethodref = getConstant("JVM_CONSTANT_InterfaceMethodref", Integer.class);
242     final int jvmConstantNameAndType = getConstant("JVM_CONSTANT_NameAndType", Integer.class);
243     final int jvmConstantMethodHandle = getConstant("JVM_CONSTANT_MethodHandle", Integer.class);
244     final int jvmConstantMethodHandleInError = getConstant("JVM_CONSTANT_MethodHandleInError", Integer.class);
245     final int jvmConstantMethodType = getConstant("JVM_CONSTANT_MethodType", Integer.class);
246     final int jvmConstantMethodTypeInError = getConstant("JVM_CONSTANT_MethodTypeInError", Integer.class);
247     final int jvmConstantDynamic = getConstant("JVM_CONSTANT_Dynamic", Integer.class);
248     final int jvmConstantDynamicInError = getConstant("JVM_CONSTANT_DynamicInError", Integer.class);
249     final int jvmConstantInvokeDynamic = getConstant("JVM_CONSTANT_InvokeDynamic", Integer.class);
250 
251     final int jvmConstantExternalMax = getConstant("JVM_CONSTANT_ExternalMax", Integer.class);
252     final int jvmConstantInternalMin = getConstant("JVM_CONSTANT_InternalMin", Integer.class);
253     final int jvmConstantInternalMax = getConstant("JVM_CONSTANT_InternalMax", Integer.class);
254 
255     final int heapWordSize = getConstant("HeapWordSize", Integer.class);
256 
257     final long symbolVmSymbols = getFieldAddress("Symbol::_vm_symbols[0]", "Symbol*");
258     final int vmSymbolsFirstSID = getConstant("vmSymbols::FIRST_SID", Integer.class);
259     final int vmSymbolsSIDLimit = getConstant("vmSymbols::SID_LIMIT", Integer.class);
260 
261     final long symbolInit = getFieldValue("CompilerToVM::Data::symbol_init", Long.class);
262     final long symbolClinit = getFieldValue("CompilerToVM::Data::symbol_clinit", Long.class);
263 
264     /**
265      * Returns the symbol in the {@code vmSymbols} table at position {@code index} as a
266      * {@link String}.
267      *
268      * @param index position in the symbol table
269      * @return the symbol at position id
270      */
271     String symbolAt(int index) {
272         HotSpotJVMCIRuntime runtime = runtime();
273         assert vmSymbolsFirstSID <= index && index < vmSymbolsSIDLimit : "index " + index + " is out of bounds";
274         int offset = index * Unsafe.ADDRESS_SIZE;
275         return runtime.getCompilerToVM().getSymbol(UNSAFE.getAddress(symbolVmSymbols + offset));
276     }
277 
278     final int universeBaseVtableSize = getFieldValue("CompilerToVM::Data::Universe_base_vtable_size", Integer.class, "int");
279 
280     final int baseVtableLength() {
281         return universeBaseVtableSize / (vtableEntrySize / heapWordSize);
282     }
283 
284     final int klassOffset = getFieldValue("java_lang_Class::_klass_offset", Integer.class, "int");
285 
286     /**
287      * The DataLayout header size is the same as the cell size.
288      */
289     final int dataLayoutHeaderSize = getConstant("DataLayout::cell_size", Integer.class);
290     final int dataLayoutTagOffset = getFieldOffset("DataLayout::_header._struct._tag", Integer.class, "u1");
291     final int dataLayoutFlagsOffset = getFieldOffset("DataLayout::_header._struct._flags", Integer.class, "u1");
292     final int dataLayoutBCIOffset = getFieldOffset("DataLayout::_header._struct._bci", Integer.class, "u2");
293     final int dataLayoutCellSize = getConstant("DataLayout::cell_size", Integer.class);
294 
295     final int dataLayoutNoTag = getConstant("DataLayout::no_tag", Integer.class);
296     final int dataLayoutBitDataTag = getConstant("DataLayout::bit_data_tag", Integer.class);
297     final int dataLayoutCounterDataTag = getConstant("DataLayout::counter_data_tag", Integer.class);
298     final int dataLayoutJumpDataTag = getConstant("DataLayout::jump_data_tag", Integer.class);
299     final int dataLayoutReceiverTypeDataTag = getConstant("DataLayout::receiver_type_data_tag", Integer.class);
300     final int dataLayoutVirtualCallDataTag = getConstant("DataLayout::virtual_call_data_tag", Integer.class);
301     final int dataLayoutRetDataTag = getConstant("DataLayout::ret_data_tag", Integer.class);
302     final int dataLayoutBranchDataTag = getConstant("DataLayout::branch_data_tag", Integer.class);
303     final int dataLayoutMultiBranchDataTag = getConstant("DataLayout::multi_branch_data_tag", Integer.class);
304     final int dataLayoutArgInfoDataTag = getConstant("DataLayout::arg_info_data_tag", Integer.class);
305     final int dataLayoutCallTypeDataTag = getConstant("DataLayout::call_type_data_tag", Integer.class);
306     final int dataLayoutVirtualCallTypeDataTag = getConstant("DataLayout::virtual_call_type_data_tag", Integer.class);
307     final int dataLayoutParametersTypeDataTag = getConstant("DataLayout::parameters_type_data_tag", Integer.class);
308     final int dataLayoutSpeculativeTrapDataTag = getConstant("DataLayout::speculative_trap_data_tag", Integer.class);
309 
310     final int bciProfileWidth = getFlag("BciProfileWidth", Integer.class);
311     final int typeProfileWidth = getFlag("TypeProfileWidth", Integer.class);
312     final int methodProfileWidth = getFlag("MethodProfileWidth", Integer.class, 0);
313 
314     final int deoptReasonNone = getConstant("Deoptimization::Reason_none", Integer.class);
315     final int deoptReasonNullCheck = getConstant("Deoptimization::Reason_null_check", Integer.class);
316     final int deoptReasonRangeCheck = getConstant("Deoptimization::Reason_range_check", Integer.class);
317     final int deoptReasonClassCheck = getConstant("Deoptimization::Reason_class_check", Integer.class);
318     final int deoptReasonArrayCheck = getConstant("Deoptimization::Reason_array_check", Integer.class);
319     final int deoptReasonUnreached0 = getConstant("Deoptimization::Reason_unreached0", Integer.class);
320     final int deoptReasonTypeCheckInlining = getConstant("Deoptimization::Reason_type_checked_inlining", Integer.class);
321     final int deoptReasonOptimizedTypeCheck = getConstant("Deoptimization::Reason_optimized_type_check", Integer.class);
322     final int deoptReasonNotCompiledExceptionHandler = getConstant("Deoptimization::Reason_not_compiled_exception_handler", Integer.class);
323     final int deoptReasonUnresolved = getConstant("Deoptimization::Reason_unresolved", Integer.class);
324     final int deoptReasonJsrMismatch = getConstant("Deoptimization::Reason_jsr_mismatch", Integer.class);
325     final int deoptReasonDiv0Check = getConstant("Deoptimization::Reason_div0_check", Integer.class);
326     final int deoptReasonConstraint = getConstant("Deoptimization::Reason_constraint", Integer.class);
327     final int deoptReasonLoopLimitCheck = getConstant("Deoptimization::Reason_loop_limit_check", Integer.class);
328     final int deoptReasonAliasing = getConstant("Deoptimization::Reason_aliasing", Integer.class);
329     final int deoptReasonTransferToInterpreter = getConstant("Deoptimization::Reason_transfer_to_interpreter", Integer.class);
330     final int deoptReasonOSROffset = getConstant("Deoptimization::Reason_TRAP_HISTORY_LENGTH", Integer.class);
331 
332     final int deoptActionNone = getConstant("Deoptimization::Action_none", Integer.class);
333     final int deoptActionMaybeRecompile = getConstant("Deoptimization::Action_maybe_recompile", Integer.class);
334     final int deoptActionReinterpret = getConstant("Deoptimization::Action_reinterpret", Integer.class);
335     final int deoptActionMakeNotEntrant = getConstant("Deoptimization::Action_make_not_entrant", Integer.class);
336     final int deoptActionMakeNotCompilable = getConstant("Deoptimization::Action_make_not_compilable", Integer.class);
337 
338     final int deoptimizationActionBits = getConstant("Deoptimization::_action_bits", Integer.class);
339     final int deoptimizationReasonBits = getConstant("Deoptimization::_reason_bits", Integer.class);
340     final int deoptimizationDebugIdBits = getConstant("Deoptimization::_debug_id_bits", Integer.class);
341     final int deoptimizationActionShift = getConstant("Deoptimization::_action_shift", Integer.class);
342     final int deoptimizationReasonShift = getConstant("Deoptimization::_reason_shift", Integer.class);
343     final int deoptimizationDebugIdShift = getConstant("Deoptimization::_debug_id_shift", Integer.class);
344 
345     final int vmIntrinsicInvokeBasic = getConstant("vmIntrinsics::_invokeBasic", Integer.class);
346     final int vmIntrinsicLinkToVirtual = getConstant("vmIntrinsics::_linkToVirtual", Integer.class);
347     final int vmIntrinsicLinkToStatic = getConstant("vmIntrinsics::_linkToStatic", Integer.class);
348     final int vmIntrinsicLinkToSpecial = getConstant("vmIntrinsics::_linkToSpecial", Integer.class);
349     final int vmIntrinsicLinkToInterface = getConstant("vmIntrinsics::_linkToInterface", Integer.class);
350 
351     final int codeInstallResultOk = getConstant("JVMCI::ok", Integer.class);
352     final int codeInstallResultDependenciesFailed = getConstant("JVMCI::dependencies_failed", Integer.class);
353     final int codeInstallResultCacheFull = getConstant("JVMCI::cache_full", Integer.class);
354     final int codeInstallResultCodeTooLarge = getConstant("JVMCI::code_too_large", Integer.class);
355     final int codeInstallResultNMethodReclaimed = getConstant("JVMCI::nmethod_reclaimed", Integer.class);
356     final int codeInstallResultFirstPermanentBailout = getConstant("JVMCI::first_permanent_bailout", Integer.class);
357 
358     String getCodeInstallResultDescription(int codeInstallResult) {
359         if (codeInstallResult == codeInstallResultOk) {
360             return "ok";
361         }
362         if (codeInstallResult == codeInstallResultDependenciesFailed) {
363             return "dependencies failed";
364         }
365         if (codeInstallResult == codeInstallResultCacheFull) {
366             return "code cache is full";
367         }
368         if (codeInstallResult == codeInstallResultCodeTooLarge) {
369             return "code is too large";
370         }
371         if (codeInstallResult == codeInstallResultNMethodReclaimed) {
372             return "nmethod reclaimed";
373         }
374         assert false : codeInstallResult;
375         return "unknown";
376     }
377 
378     final int bitDataExceptionSeenFlag = getConstant("BitData::exception_seen_flag", Integer.class);
379     final int bitDataNullSeenFlag = getConstant("BitData::null_seen_flag", Integer.class);
380     final int methodDataCountOffset = getConstant("CounterData::count_off", Integer.class);
381     final int jumpDataTakenOffset = getConstant("JumpData::taken_off_set", Integer.class);
382     final int jumpDataDisplacementOffset = getConstant("JumpData::displacement_off_set", Integer.class);
383     final int receiverTypeDataNonprofiledCountOffset = getConstant("ReceiverTypeData::nonprofiled_count_off_set", Integer.class);
384     final int receiverTypeDataReceiverTypeRowCellCount = getConstant("ReceiverTypeData::receiver_type_row_cell_count", Integer.class);
385     final int receiverTypeDataReceiver0Offset = getConstant("ReceiverTypeData::receiver0_offset", Integer.class);
386     final int receiverTypeDataCount0Offset = getConstant("ReceiverTypeData::count0_offset", Integer.class);
387     final int branchDataNotTakenOffset = getConstant("BranchData::not_taken_off_set", Integer.class);
388     final int arrayDataArrayLenOffset = getConstant("ArrayData::array_len_off_set", Integer.class);
389     final int arrayDataArrayStartOffset = getConstant("ArrayData::array_start_off_set", Integer.class);
390     final int multiBranchDataPerCaseCellCount = getConstant("MultiBranchData::per_case_cell_count", Integer.class);
391 }