Skip to content

Commit 543708d

Browse files
committed
support for getfield and putfield on null-restricted flattened fields
1 parent 3eae851 commit 543708d

File tree

11 files changed

+209
-49
lines changed

11 files changed

+209
-49
lines changed

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include "oops/constantPool.inline.hpp"
4949
#include "oops/instanceKlass.inline.hpp"
5050
#include "oops/instanceMirrorKlass.hpp"
51+
#include "oops/methodData.hpp"
5152
#include "oops/method.inline.hpp"
5253
#include "oops/objArrayKlass.inline.hpp"
5354
#include "oops/typeArrayOop.inline.hpp"
@@ -501,9 +502,9 @@ C2V_VMENTRY_NULL(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject b
501502
} else if (JVMCIENV->isa_HotSpotMethodData(base_object)) {
502503
jlong base_address = (intptr_t) JVMCIENV->asMethodData(base_object);
503504
intptr_t temp = (intptr_t) *((Klass**) (intptr_t) (base_address + offset));
504-
// clear the bits used for acmp data profiling
505-
clear_bits(temp, 0b011);
506-
klass = (Klass*) temp;
505+
506+
// profiled type: cell without bit 0 and 1
507+
klass = (Klass*) (temp & TypeEntries::type_klass_mask);
507508
if (klass == nullptr || !klass->is_loader_alive()) {
508509
// Klasses in methodData might be concurrently unloading so return null in that case.
509510
return nullptr;

src/hotspot/share/jvmci/jvmciEnv.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,7 @@ JVMCIObject JVMCIEnv::new_FieldInfo(FieldInfo* fieldinfo, JVMCI_TRAPS) {
15961596
HotSpotJVMCI::FieldInfo::set_classfileFlags(JVMCIENV, obj_h(), (jint)fieldinfo->access_flags().as_int());
15971597
HotSpotJVMCI::FieldInfo::set_internalFlags(JVMCIENV, obj_h(), (jint)fieldinfo->field_flags().as_uint());
15981598
HotSpotJVMCI::FieldInfo::set_initializerIndex(JVMCIENV, obj_h(), (jint)fieldinfo->initializer_index());
1599+
HotSpotJVMCI::FieldInfo::set_nullMarkerOffset(JVMCIENV, obj_h(), (jint)fieldinfo->null_marker_offset());
15991600
return wrap(obj_h());
16001601
} else {
16011602
JNIAccessMark jni(this, THREAD);
@@ -1606,7 +1607,8 @@ JVMCIObject JVMCIEnv::new_FieldInfo(FieldInfo* fieldinfo, JVMCI_TRAPS) {
16061607
(jint)fieldinfo->offset(),
16071608
(jint)fieldinfo->access_flags().as_int(),
16081609
(jint)fieldinfo->field_flags().as_uint(),
1609-
(jint)fieldinfo->initializer_index());
1610+
(jint)fieldinfo->initializer_index(),
1611+
(jint)fieldinfo->null_marker_offset());
16101612

16111613
return wrap(result);
16121614
}

src/hotspot/share/jvmci/jvmciJavaClasses.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@
7979
int_field(FieldInfo, classfileFlags) \
8080
int_field(FieldInfo, internalFlags) \
8181
int_field(FieldInfo, initializerIndex) \
82-
jvmci_constructor(FieldInfo, "(IIIIII)V") \
82+
int_field(FieldInfo, nullMarkerOffset) \
83+
jvmci_constructor(FieldInfo, "(IIIIIII)V") \
8384
end_class \
8485
start_class(HotSpotResolvedJavaMethodImpl, jdk_vm_ci_hotspot_HotSpotResolvedJavaMethodImpl) \
8586
long_field(HotSpotResolvedJavaMethodImpl, methodHandle) \

src/hotspot/share/jvmci/vmStructs_jvmci.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@
264264
nonstatic_field(Klass, _secondary_supers, Array<Klass*>*) \
265265
nonstatic_field(Klass, _super, Klass*) \
266266
nonstatic_field(Klass, _super_check_offset, juint) \
267+
nonstatic_field(InstanceKlass, _adr_inlineklass_fixed_block, InlineKlassFixedBlock*) \
268+
nonstatic_field(InlineKlassFixedBlock, _first_field_offset, int) \
269+
nonstatic_field(InlineKlassFixedBlock, _internal_null_marker_offset, int) \
270+
nonstatic_field(FieldInfo, _null_marker_offset, u4) \
267271
volatile_nonstatic_field(Klass, _subklass, Klass*) \
268272
nonstatic_field(Klass, _layout_helper, jint) \
269273
nonstatic_field(Klass, _prototype_header, markWord) \
@@ -486,6 +490,10 @@
486490
declare_constant(JVM_ACC_WRITTEN_FLAGS) \
487491
declare_constant(FieldInfo::FieldFlags::_ff_injected) \
488492
declare_constant(FieldInfo::FieldFlags::_ff_stable) \
493+
declare_constant(FieldInfo::FieldFlags::_ff_flat) \
494+
declare_constant(FieldInfo::FieldFlags::_ff_null_free_inline_type) \
495+
declare_constant(FieldInfo::FieldFlags::_ff_null_marker) \
496+
declare_constant(FieldInfo::FieldFlags::_ff_internal_null_marker) \
489497
declare_preprocessor_constant("JVM_ACC_VARARGS", JVM_ACC_VARARGS) \
490498
declare_preprocessor_constant("JVM_ACC_BRIDGE", JVM_ACC_BRIDGE) \
491499
declare_preprocessor_constant("JVM_ACC_ANNOTATION", JVM_ACC_ANNOTATION) \

src/hotspot/share/oops/fieldInfo.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class FieldInfo {
6060
friend class FieldStreamBase;
6161
friend class FieldInfoReader;
6262
friend class VMStructs;
63+
friend class JVMCIVMStructs;
6364

6465
public:
6566

src/hotspot/share/oops/instanceKlass.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ struct JvmtiCachedClassFileData;
138138
class SigEntry;
139139

140140
class InlineKlassFixedBlock {
141+
friend class JVMCIVMStructs;
142+
141143
Array<SigEntry>** _extended_sig;
142144
Array<VMRegPair>** _return_regs;
143145
address* _pack_handler;

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotResolvedJavaFieldImpl.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,7 @@
3333
import java.util.List;
3434

3535
import jdk.internal.vm.VMSupport;
36-
import jdk.vm.ci.meta.AnnotationData;
37-
import jdk.vm.ci.meta.JavaConstant;
38-
import jdk.vm.ci.meta.JavaType;
39-
import jdk.vm.ci.meta.ResolvedJavaType;
40-
import jdk.vm.ci.meta.UnresolvedJavaType;
36+
import jdk.vm.ci.meta.*;
4137

4238
/**
4339
* Represents a field in a HotSpot type.
@@ -51,7 +47,7 @@ class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField {
5147
* Offset (in bytes) of field from start of its storage container (i.e. {@code instanceOop} or
5248
* {@code Klass*}).
5349
*/
54-
private final int offset;
50+
private int offset;
5551

5652
/**
5753
* Value of {@code fieldDescriptor::index()}.
@@ -108,6 +104,16 @@ public boolean isInternal() {
108104
return (internalFlags & (1 << config().jvmFieldFlagInternalShift)) != 0;
109105
}
110106

107+
@Override
108+
public boolean isNullFreeInlineType() {
109+
return (internalFlags & (1 << config().jvmFieldFlagNullFreeInlineTypeShift)) != 0;
110+
}
111+
112+
@Override
113+
public boolean isFlat(){
114+
return (internalFlags & (1 << config().jvmFieldFlagFlatShift)) != 0;
115+
}
116+
111117
/**
112118
* Determines if a given object contains this field.
113119
*
@@ -159,6 +165,11 @@ public int getOffset() {
159165
return offset;
160166
}
161167

168+
@Override
169+
public ResolvedJavaField changeOffset(int newOffset) {
170+
return new HotSpotResolvedJavaFieldImpl(holder, type, newOffset, classfileFlags, internalFlags, index);
171+
}
172+
162173
/**
163174
* Gets the value of this field's index (i.e. {@code fieldDescriptor::index()} in the encoded
164175
* fields of the declaring class.

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotResolvedObjectType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ default JavaKind getJavaKind() {
9797
boolean isPrimaryType();
9898

9999
int superCheckOffset();
100+
int firstFieldOffset();
100101

101102
long prototypeMarkWord();
102103

0 commit comments

Comments
 (0)