37 import jdk.vm.ci.meta.ResolvedJavaMethod;
38
39 /**
40 * Used to access native configuration details.
41 */
42 public class GraalHotSpotVMConfig extends GraalHotSpotVMConfigBase {
43
44 GraalHotSpotVMConfig(HotSpotVMConfigStore store) {
45 super(store);
46
47 assert narrowKlassShift <= logKlassAlignment;
48 assert narrowOopShift <= logMinObjAlignment();
49 oopEncoding = new CompressEncoding(narrowOopBase, narrowOopShift);
50 klassEncoding = new CompressEncoding(narrowKlassBase, narrowKlassShift);
51
52 assert check();
53 }
54
55 private final CompressEncoding oopEncoding;
56 private final CompressEncoding klassEncoding;
57
58 public CompressEncoding getOopEncoding() {
59 return oopEncoding;
60 }
61
62 public CompressEncoding getKlassEncoding() {
63 return klassEncoding;
64 }
65
66 public final boolean cAssertions = getConstant("ASSERT", Boolean.class);
67
68 public final int codeEntryAlignment = getFlag("CodeEntryAlignment", Integer.class);
69 public final boolean enableContended = getFlag("EnableContended", Boolean.class);
70 public final boolean restrictContended = getFlag("RestrictContended", Boolean.class);
71 public final int contendedPaddingWidth = getFlag("ContendedPaddingWidth", Integer.class);
72 public final int fieldsAllocationStyle = getFlag("FieldsAllocationStyle", Integer.class);
73 public final boolean compactFields = getFlag("CompactFields", Boolean.class);
74 public final boolean verifyOops = getFlag("VerifyOops", Boolean.class);
75 public final boolean ciTime = getFlag("CITime", Boolean.class);
76 public final boolean ciTimeEach = getFlag("CITimeEach", Boolean.class);
191
192 public final int minObjAlignment() {
193 return objectAlignment / heapWordSize;
194 }
195
196 public final int logMinObjAlignment() {
197 return (int) (Math.log(objectAlignment) / Math.log(2));
198 }
199
200 public final int narrowKlassSize = getFieldValue("CompilerToVM::Data::sizeof_narrowKlass", Integer.class, "int");
201 public final long narrowKlassBase = getFieldValue("CompilerToVM::Data::Universe_narrow_klass_base", Long.class, "address");
202 public final int narrowKlassShift = getFieldValue("CompilerToVM::Data::Universe_narrow_klass_shift", Integer.class, "int");
203 public final int logKlassAlignment = getConstant("LogKlassAlignmentInBytes", Integer.class);
204
205 public final int stackShadowPages = getFlag("StackShadowPages", Integer.class);
206 public final int stackReservedPages = getFlag("StackReservedPages", Integer.class, 0);
207 public final boolean useStackBanging = getFlag("UseStackBanging", Boolean.class);
208 public final int stackBias = getConstant("STACK_BIAS", Integer.class);
209 public final int vmPageSize = getFieldValue("CompilerToVM::Data::vm_page_size", Integer.class, "int");
210
211 public final int markOffset = getFieldOffset("oopDesc::_mark", Integer.class, "markWord");
212 public final int hubOffset = getFieldOffset("oopDesc::_metadata._klass", Integer.class, "Klass*");
213
214 public final int prototypeMarkWordOffset = getFieldOffset("Klass::_prototype_header", Integer.class, "markWord");
215 public final int subklassOffset = getFieldOffset("Klass::_subklass", Integer.class, "Klass*");
216 public final int nextSiblingOffset = getFieldOffset("Klass::_next_sibling", Integer.class, "Klass*");
217 public final int superCheckOffsetOffset = getFieldOffset("Klass::_super_check_offset", Integer.class, "juint");
218 public final int secondarySuperCacheOffset = getFieldOffset("Klass::_secondary_super_cache", Integer.class, "Klass*");
219 public final int secondarySupersOffset = getFieldOffset("Klass::_secondary_supers", Integer.class, "Array<Klass*>*");
220
221 public final boolean classMirrorIsHandle;
222 public final int classMirrorOffset;
223 {
224 String name = "Klass::_java_mirror";
225 int offset = -1;
226 boolean isHandle = false;
227 try {
228 offset = getFieldOffset(name, Integer.class, "oop");
229 } catch (JVMCIError e) {
230
231 }
232 if (offset == -1) {
233 try {
234 offset = getFieldOffset(name, Integer.class, "jobject");
235 isHandle = true;
236 } catch (JVMCIError e) {
237 try {
238 // JDK-8186777
239 offset = getFieldOffset(name, Integer.class, "OopHandle");
240 isHandle = true;
241 } catch (JVMCIError e2) {
242 }
243 }
244 }
245 if (offset == -1) {
246 throw new JVMCIError("cannot get offset of field " + name + " with type oop, jobject or OopHandle");
247 }
248 classMirrorOffset = offset;
249 classMirrorIsHandle = isHandle;
250 }
251
252 public final int klassSuperKlassOffset = getFieldOffset("Klass::_super", Integer.class, "Klass*");
253 public final int klassModifierFlagsOffset = getFieldOffset("Klass::_modifier_flags", Integer.class, "jint");
254 public final int klassAccessFlagsOffset = getFieldOffset("Klass::_access_flags", Integer.class, "AccessFlags");
255 public final int klassLayoutHelperOffset = getFieldOffset("Klass::_layout_helper", Integer.class, "jint");
256
257 public final int klassLayoutHelperNeutralValue = getConstant("Klass::_lh_neutral_value", Integer.class);
258 public final int layoutHelperLog2ElementSizeShift = getConstant("Klass::_lh_log2_element_size_shift", Integer.class);
259 public final int layoutHelperLog2ElementSizeMask = getConstant("Klass::_lh_log2_element_size_mask", Integer.class);
260 public final int layoutHelperElementTypeShift = getConstant("Klass::_lh_element_type_shift", Integer.class);
261 public final int layoutHelperElementTypeMask = getConstant("Klass::_lh_element_type_mask", Integer.class);
262 public final int layoutHelperHeaderSizeShift = getConstant("Klass::_lh_header_size_shift", Integer.class);
263 public final int layoutHelperHeaderSizeMask = getConstant("Klass::_lh_header_size_mask", Integer.class);
264 public final int layoutHelperArrayTagShift = getConstant("Klass::_lh_array_tag_shift", Integer.class);
265 public final int layoutHelperArrayTagTypeValue = getConstant("Klass::_lh_array_tag_type_value", Integer.class);
266 public final int layoutHelperArrayTagObjectValue = getConstant("Klass::_lh_array_tag_obj_value", Integer.class);
267
268 /**
269 * This filters out the bit that differentiates a type array from an object array.
270 */
271 public int layoutHelperElementTypePrimitiveInPlace() {
272 return (layoutHelperArrayTagTypeValue & ~layoutHelperArrayTagObjectValue) << layoutHelperArrayTagShift;
273 }
274
275 public final int vtableEntrySize = getFieldValue("CompilerToVM::Data::sizeof_vtableEntry", Integer.class, "int");
276 public final int vtableEntryMethodOffset = getFieldOffset("vtableEntry::_method", Integer.class, "Method*");
277
278 public final int instanceKlassInitStateOffset = getFieldOffset("InstanceKlass::_init_state", Integer.class, "u1");
279 public final int instanceKlassConstantsOffset = getFieldOffset("InstanceKlass::_constants", Integer.class, "ConstantPool*");
280 public final int instanceKlassFieldsOffset = getFieldOffset("InstanceKlass::_fields", Integer.class, "Array<u2>*");
281 public final int klassVtableStartOffset = getFieldValue("CompilerToVM::Data::Klass_vtable_start_offset", Integer.class, "int");
282 public final int klassVtableLengthOffset = getFieldValue("CompilerToVM::Data::Klass_vtable_length_offset", Integer.class, "int");
283
284 public final int instanceKlassStateLinked = getConstant("InstanceKlass::linked", Integer.class);
285 public final int instanceKlassStateFullyInitialized = getConstant("InstanceKlass::fully_initialized", Integer.class);
286
287 public final int arrayOopDescSize = getFieldValue("CompilerToVM::Data::sizeof_arrayOopDesc", Integer.class, "int");
288
289 /**
290 * The offset of the array length word in an array object's header.
291 *
292 * See {@code arrayOopDesc::length_offset_in_bytes()}.
293 */
294 public final int arrayOopDescLengthOffset() {
295 return useCompressedClassPointers ? hubOffset + narrowKlassSize : arrayOopDescSize;
296 }
297
298 public final int arrayU1LengthOffset = getFieldOffset("Array<int>::_length", Integer.class, "int");
299 public final int arrayU1DataOffset = getFieldOffset("Array<u1>::_data", Integer.class);
300 public final int arrayU2DataOffset = getFieldOffset("Array<u2>::_data", Integer.class);
301 public final int metaspaceArrayLengthOffset = getFieldOffset("Array<Klass*>::_length", Integer.class, "int");
302 public final int metaspaceArrayBaseOffset = getFieldOffset("Array<Klass*>::_data[0]", Integer.class, "Klass*");
303
304 public final int arrayClassElementOffset = getFieldOffset("ObjArrayKlass::_element_klass", Integer.class, "Klass*");
428 public int threadLastJavaPcOffset() {
429 return javaThreadAnchorOffset + javaFrameAnchorLastJavaPcOffset;
430 }
431
432 public int threadLastJavaFpOffset() {
433 assert osArch.equals("aarch64") || osArch.equals("amd64");
434 return javaThreadAnchorOffset + getFieldOffset("JavaFrameAnchor::_last_Java_fp", Integer.class, "intptr_t*");
435 }
436
437 public int threadJavaFrameAnchorFlagsOffset() {
438 assert osArch.equals("sparc");
439 return javaThreadAnchorOffset + getFieldOffset("JavaFrameAnchor::_flags", Integer.class, "int");
440 }
441
442 public final int runtimeCallStackSize = getConstant("frame::arg_reg_save_area_bytes", Integer.class, intRequiredOnAMD64);
443 public final int frameInterpreterFrameSenderSpOffset = getConstant("frame::interpreter_frame_sender_sp_offset", Integer.class, intRequiredOnAMD64);
444 public final int frameInterpreterFrameLastSpOffset = getConstant("frame::interpreter_frame_last_sp_offset", Integer.class, intRequiredOnAMD64);
445
446 public final int osThreadInterruptedOffset = getFieldOffset("OSThread::_interrupted", Integer.class, "jint");
447
448 public final long markWordHashShift = getConstant("markWord::hash_shift", Long.class);
449
450 public final int biasedLockMaskInPlace = getConstant("markWord::biased_lock_mask_in_place", Integer.class);
451 public final int ageMaskInPlace = getConstant("markWord::age_mask_in_place", Integer.class);
452 public final int epochMaskInPlace = getConstant("markWord::epoch_mask_in_place", Integer.class);
453 public final long markWordHashMask = getConstant("markWord::hash_mask", Long.class);
454 public final long markWordHashMaskInPlace = getConstant("markWord::hash_mask_in_place", Long.class);
455
456 public final int unlockedMask = getConstant("markWord::unlocked_value", Integer.class);
457 public final int monitorMask = getConstant("markWord::monitor_value", Integer.class, -1);
458 public final int biasedLockPattern = getConstant("markWord::biased_lock_pattern", Integer.class);
459
460 // This field has no type in vmStructs.cpp
461 public final int objectMonitorOwner = getFieldOffset("ObjectMonitor::_owner", Integer.class, null, -1);
462 public final int objectMonitorRecursions = getFieldOffset("ObjectMonitor::_recursions", Integer.class, "intptr_t", -1);
463 public final int objectMonitorCxq = getFieldOffset("ObjectMonitor::_cxq", Integer.class, "ObjectWaiter*", -1);
464 public final int objectMonitorEntryList = getFieldOffset("ObjectMonitor::_EntryList", Integer.class, "ObjectWaiter*", -1);
465 public final int objectMonitorSucc = getFieldOffset("ObjectMonitor::_succ", Integer.class, "Thread*", -1);
466
467 public final int markWordNoHashInPlace = getConstant("markWord::no_hash_in_place", Integer.class);
468 public final int markWordNoLockInPlace = getConstant("markWord::no_lock_in_place", Integer.class);
469
470 /**
471 * See {@code markWord::prototype()}.
472 */
473 public long arrayPrototypeMarkWord() {
474 return markWordNoHashInPlace | markWordNoLockInPlace;
475 }
476
477 /**
478 * See {@code markWord::copy_set_hash()}.
479 */
480 public long tlabIntArrayMarkWord() {
481 long tmp = arrayPrototypeMarkWord() & (~markWordHashMaskInPlace);
482 tmp |= ((0x2 & markWordHashMask) << markWordHashShift);
483 return tmp;
484 }
485
486 /**
487 * Mark word right shift to get identity hash code.
488 */
489 public final int identityHashCodeShift = getConstant("markWord::hash_shift", Integer.class);
490
491 /**
492 * Identity hash code value when uninitialized.
493 */
494 public final int uninitializedIdentityHashCodeValue = getConstant("markWord::no_hash", Integer.class);
495
496 public final int methodAccessFlagsOffset = getFieldOffset("Method::_access_flags", Integer.class, "AccessFlags");
497 public final int methodConstMethodOffset = getFieldOffset("Method::_constMethod", Integer.class, "ConstMethod*");
498 public final int methodIntrinsicIdOffset = versioned.methodIntrinsicIdOffset;
499 public final int methodFlagsOffset = versioned.methodFlagsOffset;
500 public final int methodVtableIndexOffset = getFieldOffset("Method::_vtable_index", Integer.class, "int");
501
502 public final int methodCountersOffset = getFieldOffset("Method::_method_counters", Integer.class, "MethodCounters*");
503 public final int methodDataOffset = getFieldOffset("Method::_method_data", Integer.class, "MethodData*");
504 public final int methodCompiledEntryOffset = getFieldOffset("Method::_from_compiled_entry", Integer.class, "address");
505 public final int methodCodeOffset = versioned.methodCodeOffset;
506
507 public final int methodFlagsCallerSensitive = getConstant("Method::_caller_sensitive", Integer.class);
508 public final int methodFlagsForceInline = getConstant("Method::_force_inline", Integer.class);
509 public final int methodFlagsDontInline = getConstant("Method::_dont_inline", Integer.class);
510 public final int methodFlagsHidden = getConstant("Method::_hidden", Integer.class);
511 public final int nonvirtualVtableIndex = getConstant("Method::nonvirtual_vtable_index", Integer.class);
512 public final int invalidVtableIndex = getConstant("Method::invalid_vtable_index", Integer.class);
513
514 public final int invocationCounterOffset = getFieldOffset("MethodCounters::_invocation_counter", Integer.class, "InvocationCounter");
548 */
549 public final int maxOopMapStackOffset = getFieldValue("CompilerToVM::Data::_max_oop_map_stack_offset", Integer.class, "int");
550
551 public final long safepointPollingAddress = getFieldValue("os::_polling_page", Long.class, "address");
552
553 // G1 Collector Related Values.
554
555 public final byte dirtyCardValue = versioned.dirtyCardValue;
556 public final byte g1YoungCardValue = versioned.g1YoungCardValue;
557
558 public final int g1SATBQueueMarkingOffset = versioned.g1SATBQueueMarkingOffset;
559 public final int g1SATBQueueIndexOffset = versioned.g1SATBQueueIndexOffset;
560 public final int g1SATBQueueBufferOffset = versioned.g1SATBQueueBufferOffset;
561 public final int g1CardQueueIndexOffset = versioned.g1CardQueueIndexOffset;
562 public final int g1CardQueueBufferOffset = versioned.g1CardQueueBufferOffset;
563
564 public final int klassOffset = getFieldValue("java_lang_Class::_klass_offset", Integer.class, "int");
565 public final int arrayKlassOffset = getFieldValue("java_lang_Class::_array_klass_offset", Integer.class, "int");
566
567 public final int basicLockSize = getFieldValue("CompilerToVM::Data::sizeof_BasicLock", Integer.class, "int");
568 public final int basicLockDisplacedHeaderOffset = getFieldOffset("BasicLock::_displaced_header", Integer.class, "markWord");
569
570 public final int threadPollingPageOffset = getFieldOffset("Thread::_polling_page", Integer.class, "address", -1);
571 public final int threadAllocatedBytesOffset = getFieldOffset("Thread::_allocated_bytes", Integer.class, "jlong");
572
573 public final int tlabRefillWasteIncrement = getFlag("TLABWasteIncrement", Integer.class);
574
575 private final int threadLocalAllocBufferStartOffset = getFieldOffset("ThreadLocalAllocBuffer::_start", Integer.class, "HeapWord*");
576 private final int threadLocalAllocBufferEndOffset = getFieldOffset("ThreadLocalAllocBuffer::_end", Integer.class, "HeapWord*");
577 private final int threadLocalAllocBufferTopOffset = getFieldOffset("ThreadLocalAllocBuffer::_top", Integer.class, "HeapWord*");
578 private final int threadLocalAllocBufferPfTopOffset = getFieldOffset("ThreadLocalAllocBuffer::_pf_top", Integer.class, "HeapWord*");
579 private final int threadLocalAllocBufferSlowAllocationsOffset = getFieldOffset("ThreadLocalAllocBuffer::_slow_allocations", Integer.class, "unsigned");
580 private final int threadLocalAllocBufferFastRefillWasteOffset = getFieldOffset("ThreadLocalAllocBuffer::_fast_refill_waste", Integer.class, "unsigned");
581 private final int threadLocalAllocBufferNumberOfRefillsOffset = getFieldOffset("ThreadLocalAllocBuffer::_number_of_refills", Integer.class, "unsigned");
582 private final int threadLocalAllocBufferRefillWasteLimitOffset = getFieldOffset("ThreadLocalAllocBuffer::_refill_waste_limit", Integer.class, "size_t");
583 private final int threadLocalAllocBufferDesiredSizeOffset = getFieldOffset("ThreadLocalAllocBuffer::_desired_size", Integer.class, "size_t");
584
585 public int tlabSlowAllocationsOffset() {
586 return threadTlabOffset + threadLocalAllocBufferSlowAllocationsOffset;
587 }
588
604
605 public int threadTlabStartOffset() {
606 return threadTlabOffset + threadLocalAllocBufferStartOffset;
607 }
608
609 public int threadTlabEndOffset() {
610 return threadTlabOffset + threadLocalAllocBufferEndOffset;
611 }
612
613 public int threadTlabTopOffset() {
614 return threadTlabOffset + threadLocalAllocBufferTopOffset;
615 }
616
617 public int threadTlabPfTopOffset() {
618 return threadTlabOffset + threadLocalAllocBufferPfTopOffset;
619 }
620
621 public final int tlabAlignmentReserve = getFieldValue("CompilerToVM::Data::ThreadLocalAllocBuffer_alignment_reserve", Integer.class, "size_t");
622
623 public final boolean tlabStats = getFlag("TLABStats", Boolean.class);
624
625 // FIXME This is only temporary until the GC code is changed.
626 public final boolean inlineContiguousAllocationSupported = getFieldValue("CompilerToVM::Data::_supports_inline_contig_alloc", Boolean.class);
627 public final long heapEndAddress = getFieldValue("CompilerToVM::Data::_heap_end_addr", Long.class, "HeapWord**");
628 public final long heapTopAddress = versioned.heapTopAddress;
629
630 public final boolean cmsIncrementalMode = getFlag("CMSIncrementalMode", Boolean.class, false);
631
632 public final long inlineCacheMissStub = getFieldValue("CompilerToVM::Data::SharedRuntime_ic_miss_stub", Long.class, "address");
633 public final long handleWrongMethodStub = getFieldValue("CompilerToVM::Data::SharedRuntime_handle_wrong_method_stub", Long.class, "address");
634
635 public final long handleDeoptStub = getFieldValue("CompilerToVM::Data::SharedRuntime_deopt_blob_unpack", Long.class, "address");
636 public final long uncommonTrapStub = getFieldValue("CompilerToVM::Data::SharedRuntime_deopt_blob_uncommon_trap", Long.class, "address");
637
638 public final long codeCacheLowBound = versioned.codeCacheLowBound;
639 public final long codeCacheHighBound = versioned.codeCacheHighBound;
640
641 public final long aescryptEncryptBlockStub = getFieldValue("StubRoutines::_aescrypt_encryptBlock", Long.class, "address");
642 public final long aescryptDecryptBlockStub = getFieldValue("StubRoutines::_aescrypt_decryptBlock", Long.class, "address");
643 public final long cipherBlockChainingEncryptAESCryptStub = getFieldValue("StubRoutines::_cipherBlockChaining_encryptAESCrypt", Long.class, "address");
|
37 import jdk.vm.ci.meta.ResolvedJavaMethod;
38
39 /**
40 * Used to access native configuration details.
41 */
42 public class GraalHotSpotVMConfig extends GraalHotSpotVMConfigBase {
43
44 GraalHotSpotVMConfig(HotSpotVMConfigStore store) {
45 super(store);
46
47 assert narrowKlassShift <= logKlassAlignment;
48 assert narrowOopShift <= logMinObjAlignment();
49 oopEncoding = new CompressEncoding(narrowOopBase, narrowOopShift);
50 klassEncoding = new CompressEncoding(narrowKlassBase, narrowKlassShift);
51
52 assert check();
53 }
54
55 private final CompressEncoding oopEncoding;
56 private final CompressEncoding klassEncoding;
57 private final String markWord = versioned.markWordFieldType;
58
59 public CompressEncoding getOopEncoding() {
60 return oopEncoding;
61 }
62
63 public CompressEncoding getKlassEncoding() {
64 return klassEncoding;
65 }
66
67 public final boolean cAssertions = getConstant("ASSERT", Boolean.class);
68
69 public final int codeEntryAlignment = getFlag("CodeEntryAlignment", Integer.class);
70 public final boolean enableContended = getFlag("EnableContended", Boolean.class);
71 public final boolean restrictContended = getFlag("RestrictContended", Boolean.class);
72 public final int contendedPaddingWidth = getFlag("ContendedPaddingWidth", Integer.class);
73 public final int fieldsAllocationStyle = getFlag("FieldsAllocationStyle", Integer.class);
74 public final boolean compactFields = getFlag("CompactFields", Boolean.class);
75 public final boolean verifyOops = getFlag("VerifyOops", Boolean.class);
76 public final boolean ciTime = getFlag("CITime", Boolean.class);
77 public final boolean ciTimeEach = getFlag("CITimeEach", Boolean.class);
192
193 public final int minObjAlignment() {
194 return objectAlignment / heapWordSize;
195 }
196
197 public final int logMinObjAlignment() {
198 return (int) (Math.log(objectAlignment) / Math.log(2));
199 }
200
201 public final int narrowKlassSize = getFieldValue("CompilerToVM::Data::sizeof_narrowKlass", Integer.class, "int");
202 public final long narrowKlassBase = getFieldValue("CompilerToVM::Data::Universe_narrow_klass_base", Long.class, "address");
203 public final int narrowKlassShift = getFieldValue("CompilerToVM::Data::Universe_narrow_klass_shift", Integer.class, "int");
204 public final int logKlassAlignment = getConstant("LogKlassAlignmentInBytes", Integer.class);
205
206 public final int stackShadowPages = getFlag("StackShadowPages", Integer.class);
207 public final int stackReservedPages = getFlag("StackReservedPages", Integer.class, 0);
208 public final boolean useStackBanging = getFlag("UseStackBanging", Boolean.class);
209 public final int stackBias = getConstant("STACK_BIAS", Integer.class);
210 public final int vmPageSize = getFieldValue("CompilerToVM::Data::vm_page_size", Integer.class, "int");
211
212 public final int markOffset = getFieldOffset("oopDesc::_mark", Integer.class, markWord);
213 public final int hubOffset = getFieldOffset("oopDesc::_metadata._klass", Integer.class, "Klass*");
214
215 public final int prototypeMarkWordOffset = getFieldOffset("Klass::_prototype_header", Integer.class, markWord);
216 public final int subklassOffset = getFieldOffset("Klass::_subklass", Integer.class, "Klass*");
217 public final int nextSiblingOffset = getFieldOffset("Klass::_next_sibling", Integer.class, "Klass*");
218 public final int superCheckOffsetOffset = getFieldOffset("Klass::_super_check_offset", Integer.class, "juint");
219 public final int secondarySuperCacheOffset = getFieldOffset("Klass::_secondary_super_cache", Integer.class, "Klass*");
220 public final int secondarySupersOffset = getFieldOffset("Klass::_secondary_supers", Integer.class, "Array<Klass*>*");
221
222 public final boolean classMirrorIsHandle = versioned.classMirrorIsHandle;
223 public final int classMirrorOffset = versioned.classMirrorOffset;
224
225 public final int klassSuperKlassOffset = getFieldOffset("Klass::_super", Integer.class, "Klass*");
226 public final int klassModifierFlagsOffset = getFieldOffset("Klass::_modifier_flags", Integer.class, "jint");
227 public final int klassAccessFlagsOffset = getFieldOffset("Klass::_access_flags", Integer.class, "AccessFlags");
228 public final int klassLayoutHelperOffset = getFieldOffset("Klass::_layout_helper", Integer.class, "jint");
229
230 public final int klassLayoutHelperNeutralValue = getConstant("Klass::_lh_neutral_value", Integer.class);
231 public final int layoutHelperLog2ElementSizeShift = getConstant("Klass::_lh_log2_element_size_shift", Integer.class);
232 public final int layoutHelperLog2ElementSizeMask = getConstant("Klass::_lh_log2_element_size_mask", Integer.class);
233 public final int layoutHelperElementTypeShift = getConstant("Klass::_lh_element_type_shift", Integer.class);
234 public final int layoutHelperElementTypeMask = getConstant("Klass::_lh_element_type_mask", Integer.class);
235 public final int layoutHelperHeaderSizeShift = getConstant("Klass::_lh_header_size_shift", Integer.class);
236 public final int layoutHelperHeaderSizeMask = getConstant("Klass::_lh_header_size_mask", Integer.class);
237 public final int layoutHelperArrayTagShift = getConstant("Klass::_lh_array_tag_shift", Integer.class);
238 public final int layoutHelperArrayTagTypeValue = getConstant("Klass::_lh_array_tag_type_value", Integer.class);
239 public final int layoutHelperArrayTagObjectValue = getConstant("Klass::_lh_array_tag_obj_value", Integer.class);
240
241 /**
242 * This filters out the bit that differentiates a type array from an object array.
243 */
244 public int layoutHelperElementTypePrimitiveInPlace() {
245 return (layoutHelperArrayTagTypeValue & ~layoutHelperArrayTagObjectValue) << layoutHelperArrayTagShift;
246 }
247
248 public final int vtableEntrySize = getFieldValue("CompilerToVM::Data::sizeof_vtableEntry", Integer.class, "int");
249 public final int vtableEntryMethodOffset = getFieldOffset("vtableEntry::_method", Integer.class, "Method*");
250
251 public final int instanceKlassInitStateOffset = getFieldOffset("InstanceKlass::_init_state", Integer.class, "u1");
252 public final int instanceKlassInitThreadOffset = getFieldOffset("InstanceKlass::_init_thread", Integer.class, "Thread*", -1);
253 public final int instanceKlassConstantsOffset = getFieldOffset("InstanceKlass::_constants", Integer.class, "ConstantPool*");
254 public final int instanceKlassFieldsOffset = getFieldOffset("InstanceKlass::_fields", Integer.class, "Array<u2>*");
255 public final int klassVtableStartOffset = getFieldValue("CompilerToVM::Data::Klass_vtable_start_offset", Integer.class, "int");
256 public final int klassVtableLengthOffset = getFieldValue("CompilerToVM::Data::Klass_vtable_length_offset", Integer.class, "int");
257
258 public final int instanceKlassStateLinked = getConstant("InstanceKlass::linked", Integer.class);
259 public final int instanceKlassStateBeingInitialized = getConstant("InstanceKlass::being_initialized", Integer.class, -1);
260 public final int instanceKlassStateFullyInitialized = getConstant("InstanceKlass::fully_initialized", Integer.class);
261
262 public final int arrayOopDescSize = getFieldValue("CompilerToVM::Data::sizeof_arrayOopDesc", Integer.class, "int");
263
264 /**
265 * The offset of the array length word in an array object's header.
266 *
267 * See {@code arrayOopDesc::length_offset_in_bytes()}.
268 */
269 public final int arrayOopDescLengthOffset() {
270 return useCompressedClassPointers ? hubOffset + narrowKlassSize : arrayOopDescSize;
271 }
272
273 public final int arrayU1LengthOffset = getFieldOffset("Array<int>::_length", Integer.class, "int");
274 public final int arrayU1DataOffset = getFieldOffset("Array<u1>::_data", Integer.class);
275 public final int arrayU2DataOffset = getFieldOffset("Array<u2>::_data", Integer.class);
276 public final int metaspaceArrayLengthOffset = getFieldOffset("Array<Klass*>::_length", Integer.class, "int");
277 public final int metaspaceArrayBaseOffset = getFieldOffset("Array<Klass*>::_data[0]", Integer.class, "Klass*");
278
279 public final int arrayClassElementOffset = getFieldOffset("ObjArrayKlass::_element_klass", Integer.class, "Klass*");
403 public int threadLastJavaPcOffset() {
404 return javaThreadAnchorOffset + javaFrameAnchorLastJavaPcOffset;
405 }
406
407 public int threadLastJavaFpOffset() {
408 assert osArch.equals("aarch64") || osArch.equals("amd64");
409 return javaThreadAnchorOffset + getFieldOffset("JavaFrameAnchor::_last_Java_fp", Integer.class, "intptr_t*");
410 }
411
412 public int threadJavaFrameAnchorFlagsOffset() {
413 assert osArch.equals("sparc");
414 return javaThreadAnchorOffset + getFieldOffset("JavaFrameAnchor::_flags", Integer.class, "int");
415 }
416
417 public final int runtimeCallStackSize = getConstant("frame::arg_reg_save_area_bytes", Integer.class, intRequiredOnAMD64);
418 public final int frameInterpreterFrameSenderSpOffset = getConstant("frame::interpreter_frame_sender_sp_offset", Integer.class, intRequiredOnAMD64);
419 public final int frameInterpreterFrameLastSpOffset = getConstant("frame::interpreter_frame_last_sp_offset", Integer.class, intRequiredOnAMD64);
420
421 public final int osThreadInterruptedOffset = getFieldOffset("OSThread::_interrupted", Integer.class, "jint");
422
423 public final long markWordHashShift = getConstant(markWordField("hash_shift"), Long.class);
424
425 public final int biasedLockMaskInPlace = getConstant(markWordField("biased_lock_mask_in_place"), Integer.class);
426 public final int ageMaskInPlace = getConstant(markWordField("age_mask_in_place"), Integer.class);
427 public final int epochMaskInPlace = getConstant(markWordField("epoch_mask_in_place"), Integer.class);
428 public final long markWordHashMask = getConstant(markWordField("hash_mask"), Long.class);
429 public final long markWordHashMaskInPlace = getConstant(markWordField("hash_mask_in_place"), Long.class);
430
431 public final int unlockedMask = getConstant(markWordField("unlocked_value"), Integer.class);
432 public final int monitorMask = getConstant(markWordField("monitor_value"), Integer.class, -1);
433 public final int biasedLockPattern = getConstant(markWordField("biased_lock_pattern"), Integer.class);
434
435 // This field has no type in vmStructs.cpp
436 public final int objectMonitorOwner = getFieldOffset("ObjectMonitor::_owner", Integer.class, null, -1);
437 public final int objectMonitorRecursions = getFieldOffset("ObjectMonitor::_recursions", Integer.class, "intptr_t", -1);
438 public final int objectMonitorCxq = getFieldOffset("ObjectMonitor::_cxq", Integer.class, "ObjectWaiter*", -1);
439 public final int objectMonitorEntryList = getFieldOffset("ObjectMonitor::_EntryList", Integer.class, "ObjectWaiter*", -1);
440 public final int objectMonitorSucc = getFieldOffset("ObjectMonitor::_succ", Integer.class, "Thread*", -1);
441
442 public final int markWordNoHashInPlace = getConstant(markWordField("no_hash_in_place"), Integer.class);
443 public final int markWordNoLockInPlace = getConstant(markWordField("no_lock_in_place"), Integer.class);
444
445 /**
446 * See {@code markOopDesc::prototype()}/{@code markWord::prototype()}.
447 */
448 public long arrayPrototypeMarkWord() {
449 return markWordNoHashInPlace | markWordNoLockInPlace;
450 }
451
452 /**
453 * See {@code markOopDesc::copy_set_hash()}/{@code markWord::copy_set_hash()}.
454 */
455 public long tlabIntArrayMarkWord() {
456 long tmp = arrayPrototypeMarkWord() & (~markWordHashMaskInPlace);
457 tmp |= ((0x2 & markWordHashMask) << markWordHashShift);
458 return tmp;
459 }
460
461 private String markWordField(String simpleName) {
462 return versioned.markWordClassName + "::" + simpleName;
463 }
464
465 /**
466 * Mark word right shift to get identity hash code.
467 */
468 public final int identityHashCodeShift = getConstant(markWordField("hash_shift"), Integer.class);
469
470 /**
471 * Identity hash code value when uninitialized.
472 */
473 public final int uninitializedIdentityHashCodeValue = getConstant(markWordField("no_hash"), Integer.class);
474
475 public final int methodAccessFlagsOffset = getFieldOffset("Method::_access_flags", Integer.class, "AccessFlags");
476 public final int methodConstMethodOffset = getFieldOffset("Method::_constMethod", Integer.class, "ConstMethod*");
477 public final int methodIntrinsicIdOffset = versioned.methodIntrinsicIdOffset;
478 public final int methodFlagsOffset = versioned.methodFlagsOffset;
479 public final int methodVtableIndexOffset = getFieldOffset("Method::_vtable_index", Integer.class, "int");
480
481 public final int methodCountersOffset = getFieldOffset("Method::_method_counters", Integer.class, "MethodCounters*");
482 public final int methodDataOffset = getFieldOffset("Method::_method_data", Integer.class, "MethodData*");
483 public final int methodCompiledEntryOffset = getFieldOffset("Method::_from_compiled_entry", Integer.class, "address");
484 public final int methodCodeOffset = versioned.methodCodeOffset;
485
486 public final int methodFlagsCallerSensitive = getConstant("Method::_caller_sensitive", Integer.class);
487 public final int methodFlagsForceInline = getConstant("Method::_force_inline", Integer.class);
488 public final int methodFlagsDontInline = getConstant("Method::_dont_inline", Integer.class);
489 public final int methodFlagsHidden = getConstant("Method::_hidden", Integer.class);
490 public final int nonvirtualVtableIndex = getConstant("Method::nonvirtual_vtable_index", Integer.class);
491 public final int invalidVtableIndex = getConstant("Method::invalid_vtable_index", Integer.class);
492
493 public final int invocationCounterOffset = getFieldOffset("MethodCounters::_invocation_counter", Integer.class, "InvocationCounter");
527 */
528 public final int maxOopMapStackOffset = getFieldValue("CompilerToVM::Data::_max_oop_map_stack_offset", Integer.class, "int");
529
530 public final long safepointPollingAddress = getFieldValue("os::_polling_page", Long.class, "address");
531
532 // G1 Collector Related Values.
533
534 public final byte dirtyCardValue = versioned.dirtyCardValue;
535 public final byte g1YoungCardValue = versioned.g1YoungCardValue;
536
537 public final int g1SATBQueueMarkingOffset = versioned.g1SATBQueueMarkingOffset;
538 public final int g1SATBQueueIndexOffset = versioned.g1SATBQueueIndexOffset;
539 public final int g1SATBQueueBufferOffset = versioned.g1SATBQueueBufferOffset;
540 public final int g1CardQueueIndexOffset = versioned.g1CardQueueIndexOffset;
541 public final int g1CardQueueBufferOffset = versioned.g1CardQueueBufferOffset;
542
543 public final int klassOffset = getFieldValue("java_lang_Class::_klass_offset", Integer.class, "int");
544 public final int arrayKlassOffset = getFieldValue("java_lang_Class::_array_klass_offset", Integer.class, "int");
545
546 public final int basicLockSize = getFieldValue("CompilerToVM::Data::sizeof_BasicLock", Integer.class, "int");
547 public final int basicLockDisplacedHeaderOffset = getFieldOffset("BasicLock::_displaced_header", Integer.class, markWord);
548
549 public final int threadPollingPageOffset = getFieldOffset("Thread::_polling_page", Integer.class, "address", -1);
550 public final int threadAllocatedBytesOffset = getFieldOffset("Thread::_allocated_bytes", Integer.class, "jlong");
551
552 public final int tlabRefillWasteIncrement = getFlag("TLABWasteIncrement", Integer.class);
553
554 private final int threadLocalAllocBufferStartOffset = getFieldOffset("ThreadLocalAllocBuffer::_start", Integer.class, "HeapWord*");
555 private final int threadLocalAllocBufferEndOffset = getFieldOffset("ThreadLocalAllocBuffer::_end", Integer.class, "HeapWord*");
556 private final int threadLocalAllocBufferTopOffset = getFieldOffset("ThreadLocalAllocBuffer::_top", Integer.class, "HeapWord*");
557 private final int threadLocalAllocBufferPfTopOffset = getFieldOffset("ThreadLocalAllocBuffer::_pf_top", Integer.class, "HeapWord*");
558 private final int threadLocalAllocBufferSlowAllocationsOffset = getFieldOffset("ThreadLocalAllocBuffer::_slow_allocations", Integer.class, "unsigned");
559 private final int threadLocalAllocBufferFastRefillWasteOffset = getFieldOffset("ThreadLocalAllocBuffer::_fast_refill_waste", Integer.class, "unsigned");
560 private final int threadLocalAllocBufferNumberOfRefillsOffset = getFieldOffset("ThreadLocalAllocBuffer::_number_of_refills", Integer.class, "unsigned");
561 private final int threadLocalAllocBufferRefillWasteLimitOffset = getFieldOffset("ThreadLocalAllocBuffer::_refill_waste_limit", Integer.class, "size_t");
562 private final int threadLocalAllocBufferDesiredSizeOffset = getFieldOffset("ThreadLocalAllocBuffer::_desired_size", Integer.class, "size_t");
563
564 public int tlabSlowAllocationsOffset() {
565 return threadTlabOffset + threadLocalAllocBufferSlowAllocationsOffset;
566 }
567
583
584 public int threadTlabStartOffset() {
585 return threadTlabOffset + threadLocalAllocBufferStartOffset;
586 }
587
588 public int threadTlabEndOffset() {
589 return threadTlabOffset + threadLocalAllocBufferEndOffset;
590 }
591
592 public int threadTlabTopOffset() {
593 return threadTlabOffset + threadLocalAllocBufferTopOffset;
594 }
595
596 public int threadTlabPfTopOffset() {
597 return threadTlabOffset + threadLocalAllocBufferPfTopOffset;
598 }
599
600 public final int tlabAlignmentReserve = getFieldValue("CompilerToVM::Data::ThreadLocalAllocBuffer_alignment_reserve", Integer.class, "size_t");
601
602 public final boolean tlabStats = getFlag("TLABStats", Boolean.class);
603
604 // We set 0x10 as default value to disable DC ZVA if this field is not present in HotSpot.
605 // ARMv8-A architecture reference manual D12.2.35 Data Cache Zero ID register says:
606 // * BS, bits [3:0] indicate log2 of the DC ZVA block size in (4-byte) words.
607 // * DZP, bit [4] of indicates whether use of DC ZVA instruction is prohibited.
608 public final int psrInfoDczidValue = getFieldValue("VM_Version::_psr_info.dczid_el0", Integer.class, "uint32_t", 0x10);
609
610 // FIXME This is only temporary until the GC code is changed.
611 public final boolean inlineContiguousAllocationSupported = getFieldValue("CompilerToVM::Data::_supports_inline_contig_alloc", Boolean.class);
612 public final long heapEndAddress = getFieldValue("CompilerToVM::Data::_heap_end_addr", Long.class, "HeapWord**");
613 public final long heapTopAddress = versioned.heapTopAddress;
614
615 public final boolean cmsIncrementalMode = getFlag("CMSIncrementalMode", Boolean.class, false);
616
617 public final long inlineCacheMissStub = getFieldValue("CompilerToVM::Data::SharedRuntime_ic_miss_stub", Long.class, "address");
618 public final long handleWrongMethodStub = getFieldValue("CompilerToVM::Data::SharedRuntime_handle_wrong_method_stub", Long.class, "address");
619
620 public final long handleDeoptStub = getFieldValue("CompilerToVM::Data::SharedRuntime_deopt_blob_unpack", Long.class, "address");
621 public final long uncommonTrapStub = getFieldValue("CompilerToVM::Data::SharedRuntime_deopt_blob_uncommon_trap", Long.class, "address");
622
623 public final long codeCacheLowBound = versioned.codeCacheLowBound;
624 public final long codeCacheHighBound = versioned.codeCacheHighBound;
625
626 public final long aescryptEncryptBlockStub = getFieldValue("StubRoutines::_aescrypt_encryptBlock", Long.class, "address");
627 public final long aescryptDecryptBlockStub = getFieldValue("StubRoutines::_aescrypt_decryptBlock", Long.class, "address");
628 public final long cipherBlockChainingEncryptAESCryptStub = getFieldValue("StubRoutines::_cipherBlockChaining_encryptAESCrypt", Long.class, "address");
|