diff --git a/src/hotspot/share/prims/unsafe.cpp b/src/hotspot/share/prims/unsafe.cpp index 99096677413..e06ddb97961 100644 --- a/src/hotspot/share/prims/unsafe.cpp +++ b/src/hotspot/share/prims/unsafe.cpp @@ -903,7 +903,7 @@ static void getBaseAndScale(int& base, int& scale, jclass clazz, TRAPS) { } } -UNSAFE_ENTRY(jint, Unsafe_ArrayBaseOffset1(JNIEnv *env, jobject unsafe, jarray array)) { +UNSAFE_ENTRY(jint, Unsafe_ArrayInstanceBaseOffset0(JNIEnv *env, jobject unsafe, jarray array)) { assert(array != nullptr, "array must not be null"); oop ar = JNIHandles::resolve_non_null(array); assert(ar->is_array(), "Must be an array"); @@ -947,7 +947,7 @@ UNSAFE_ENTRY(jint, Unsafe_ArrayIndexScale0(JNIEnv *env, jobject unsafe, jclass c return field_offset_from_byte_offset(scale) - field_offset_from_byte_offset(0); } UNSAFE_END -UNSAFE_ENTRY(jint, Unsafe_ArrayIndexScale1(JNIEnv *env, jobject unsafe, jarray array)) { +UNSAFE_ENTRY(jint, Unsafe_ArrayInstanceIndexScale0(JNIEnv *env, jobject unsafe, jarray array)) { assert(array != nullptr, "array must not be null"); oop ar = JNIHandles::resolve_non_null(array); assert(ar->is_array(), "Must be an array"); @@ -1236,9 +1236,9 @@ static JNINativeMethod jdk_internal_misc_Unsafe_methods[] = { {CC "staticFieldBase0", CC "(" FLD ")" OBJ, FN_PTR(Unsafe_StaticFieldBase0)}, {CC "ensureClassInitialized0", CC "(" CLS ")V", FN_PTR(Unsafe_EnsureClassInitialized0)}, {CC "arrayBaseOffset0", CC "(" CLS ")I", FN_PTR(Unsafe_ArrayBaseOffset0)}, - {CC "arrayBaseOffset1", CC "(" OBJ_ARR ")I", FN_PTR(Unsafe_ArrayBaseOffset1)}, + {CC "arrayInstanceBaseOffset0", CC "(" OBJ_ARR ")I", FN_PTR(Unsafe_ArrayInstanceBaseOffset0)}, {CC "arrayIndexScale0", CC "(" CLS ")I", FN_PTR(Unsafe_ArrayIndexScale0)}, - {CC "arrayIndexScale1", CC "(" OBJ_ARR ")I", FN_PTR(Unsafe_ArrayIndexScale1)}, + {CC "arrayInstanceIndexScale0", CC "(" OBJ_ARR ")I", FN_PTR(Unsafe_ArrayInstanceIndexScale0)}, {CC "getObjectSize0", CC "(Ljava/lang/Object;)J", FN_PTR(Unsafe_GetObjectSize0)}, {CC "defineClass0", CC "(" DC_Args ")" CLS, FN_PTR(Unsafe_DefineClass0)}, diff --git a/src/java.base/share/classes/java/lang/invoke/ArrayVarHandle.java b/src/java.base/share/classes/java/lang/invoke/ArrayVarHandle.java index 835ddb6fa72..64beed4feda 100644 --- a/src/java.base/share/classes/java/lang/invoke/ArrayVarHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/ArrayVarHandle.java @@ -123,8 +123,8 @@ static Object getVolatile(VarHandle ob, Object oarray, int index) { if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.getFlatValueVolatile(array, @@ -142,8 +142,8 @@ static void setVolatile(VarHandle ob, Object oarray, int index, Object value) { if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); UNSAFE.putFlatValueVolatile(array, @@ -164,8 +164,8 @@ static Object getOpaque(VarHandle ob, Object oarray, int index) { if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.getFlatValueOpaque(array, @@ -183,8 +183,8 @@ static void setOpaque(VarHandle ob, Object oarray, int index, Object value) { if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); UNSAFE.putFlatValueOpaque(array, @@ -205,8 +205,8 @@ static Object getAcquire(VarHandle ob, Object oarray, int index) { if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.getFlatValueAcquire(array, @@ -224,8 +224,8 @@ static void setRelease(VarHandle ob, Object oarray, int index, Object value) { if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); UNSAFE.putFlatValueRelease(array, @@ -246,8 +246,8 @@ static boolean compareAndSet(VarHandle ob, Object oarray, int index, Object expe if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.compareAndSetFlatValue(array, @@ -269,8 +269,8 @@ static Object compareAndExchange(VarHandle ob, Object oarray, int index, Object if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.compareAndExchangeFlatValue(array, @@ -292,8 +292,8 @@ static Object compareAndExchangeAcquire(VarHandle ob, Object oarray, int index, if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.compareAndExchangeFlatValueAcquire(array, @@ -315,8 +315,8 @@ static Object compareAndExchangeRelease(VarHandle ob, Object oarray, int index, if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.compareAndExchangeFlatValueRelease(array, @@ -338,8 +338,8 @@ static boolean weakCompareAndSetPlain(VarHandle ob, Object oarray, int index, Ob if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.weakCompareAndSetFlatValuePlain(array, @@ -361,8 +361,8 @@ static boolean weakCompareAndSet(VarHandle ob, Object oarray, int index, Object if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.weakCompareAndSetFlatValue(array, @@ -384,8 +384,8 @@ static boolean weakCompareAndSetAcquire(VarHandle ob, Object oarray, int index, if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.weakCompareAndSetFlatValueAcquire(array, @@ -407,8 +407,8 @@ static boolean weakCompareAndSetRelease(VarHandle ob, Object oarray, int index, if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.weakCompareAndSetFlatValueRelease(array, @@ -430,8 +430,8 @@ static Object getAndSet(VarHandle ob, Object oarray, int index, Object value) { if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.getAndSetFlatValue(array, @@ -451,8 +451,8 @@ static Object getAndSetAcquire(VarHandle ob, Object oarray, int index, Object va if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.getAndSetFlatValueAcquire(array, @@ -472,8 +472,8 @@ static Object getAndSetRelease(VarHandle ob, Object oarray, int index, Object va if (ValueClass.isFlatArray(oarray)) { // delegate to flat access primitives VarHandles.checkAtomicFlatArray(array); - int aoffset = (int) UNSAFE.arrayBaseOffset(array); - int ascale = UNSAFE.arrayIndexScale(array); + int aoffset = (int) UNSAFE.arrayInstanceBaseOffset(array); + int ascale = UNSAFE.arrayInstanceIndexScale(array); int ashift = 31 - Integer.numberOfLeadingZeros(ascale); int layout = UNSAFE.arrayLayout(array); return UNSAFE.getAndSetFlatValueRelease(array, diff --git a/src/java.base/share/classes/jdk/internal/misc/Unsafe.java b/src/java.base/share/classes/jdk/internal/misc/Unsafe.java index 96e96970e22..31db2daa9cc 100644 --- a/src/java.base/share/classes/jdk/internal/misc/Unsafe.java +++ b/src/java.base/share/classes/jdk/internal/misc/Unsafe.java @@ -1421,6 +1421,11 @@ public void notifyStrictStaticAccess(Class> c, long staticFieldOffset, boolean * The return value is in the range of a {@code int}. The return type is * {@code long} to emphasize that long arithmetic should always be used * for offset calculations to avoid overflows. + *
+ * This method doesn't support arrays with an element type that is + * a value class, because this type of array can have multiple layouts. + * For these arrays, {@code arrayInstanceBaseOffset(Object[] array)} + * must be used instead. * * @see #getInt(Object, long) * @see #putInt(Object, long, int) @@ -1433,12 +1438,12 @@ public long arrayBaseOffset(Class> arrayClass) { return arrayBaseOffset0(arrayClass); } - public long arrayBaseOffset(Object[] array) { + public long arrayInstanceBaseOffset(Object[] array) { if (array == null) { throw new NullPointerException(); } - return arrayBaseOffset1(array); + return arrayInstanceBaseOffset0(array); } /** The value of {@code arrayBaseOffset(boolean[].class)} */ @@ -1486,6 +1491,11 @@ public long arrayBaseOffset(Object[] array) { *
* The computation of the actual memory offset should always use {@code * long} arithmetic to avoid overflows. + *
+ * This method doesn't support arrays with an element type that is + * a value class, because this type of array can have multiple layouts. + * For these arrays, {@code arrayInstanceIndexScale(Object[] array)} + * must be used instead. * * @see #arrayBaseOffset * @see #getInt(Object, long) @@ -1499,12 +1509,12 @@ public int arrayIndexScale(Class> arrayClass) { return arrayIndexScale0(arrayClass); } - public int arrayIndexScale(Object[] array) { + public int arrayInstanceIndexScale(Object[] array) { if (array == null) { throw new NullPointerException(); } - return arrayIndexScale1(array); + return arrayInstanceIndexScale0(array); } /** @@ -2904,8 +2914,8 @@ private boolean compareAndSetFlatValueAsBytes(Object o, long offset, int layout, // (see VarHandles::isAtomicFlat). Object[] expectedArray = newSpecialArray(valueType, 1, layout); Object xArray = newSpecialArray(valueType, 1, layout); - long base = arrayBaseOffset(expectedArray); - int scale = arrayIndexScale(expectedArray); + long base = arrayInstanceBaseOffset(expectedArray); + int scale = arrayInstanceIndexScale(expectedArray); putFlatValue(expectedArray, base, layout, valueType, expected); putFlatValue(xArray, base, layout, valueType, x); switch (scale) { @@ -4434,9 +4444,9 @@ private void putShortParts(Object o, long offset, byte i0, byte i1) { private native void ensureClassInitialized0(Class> c); private native void notifyStrictStaticAccess0(Class> c, long staticFieldOffset, boolean writing); private native int arrayBaseOffset0(Class> arrayClass); // public version returns long to promote correct arithmetic - private native int arrayBaseOffset1(Object[] array); + private native int arrayInstanceBaseOffset0(Object[] array); private native int arrayIndexScale0(Class> arrayClass); - private native int arrayIndexScale1(Object[] array); + private native int arrayInstanceIndexScale0(Object[] array); private native long getObjectSize0(Object o); private native int getLoadAverage0(double[] loadavg, int nelems); diff --git a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java index 80ee8f4fe22..e3235af38a5 100644 --- a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java +++ b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java @@ -649,8 +649,8 @@ public void test32_verifier() { static { try { TEST33_ARRAY = (MyValue1[])ValueClass.newNullRestrictedNonAtomicArray(MyValue1.class, 2, MyValue1.DEFAULT); - TEST33_BASE_OFFSET = U.arrayBaseOffset(TEST33_ARRAY); - TEST33_INDEX_SCALE = U.arrayIndexScale(TEST33_ARRAY); + TEST33_BASE_OFFSET = U.arrayInstanceBaseOffset(TEST33_ARRAY); + TEST33_INDEX_SCALE = U.arrayInstanceIndexScale(TEST33_ARRAY); TEST33_FLATTENED_ARRAY = ValueClass.isFlatArray(TEST33_ARRAY); TEST33_LAYOUT = U.arrayLayout(TEST33_ARRAY); } catch (Exception e) { @@ -1257,8 +1257,8 @@ public void test63_verifier() { static { try { TEST64_ARRAY = (SmallValue[])ValueClass.newNullRestrictedAtomicArray(SmallValue.class, 2, SmallValue.DEFAULT); - TEST64_BASE_OFFSET = U.arrayBaseOffset(TEST64_ARRAY); - TEST64_INDEX_SCALE = U.arrayIndexScale(TEST64_ARRAY); + TEST64_BASE_OFFSET = U.arrayInstanceBaseOffset(TEST64_ARRAY); + TEST64_INDEX_SCALE = U.arrayInstanceIndexScale(TEST64_ARRAY); TEST64_FLATTENED_ARRAY = ValueClass.isFlatArray(TEST64_ARRAY); TEST64_ATOMIC_ARRAY = ValueClass.isAtomicArray(TEST64_ARRAY); TEST64_LAYOUT = U.arrayLayout(TEST64_ARRAY); diff --git a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/UnsafeTest.java b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/UnsafeTest.java index c419a00492c..2982c8907b3 100644 --- a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/UnsafeTest.java +++ b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/UnsafeTest.java @@ -301,8 +301,8 @@ public static void testNullableFlatArrays() throws Throwable { final int ARRAY_LENGTH = 10; TestValue1[] array = (TestValue1[])ValueClass.newNullableAtomicArray(TestValue1.class, ARRAY_LENGTH); Asserts.assertTrue(ValueClass.isFlatArray(array)); - long baseOffset = U.arrayBaseOffset(array); - int scaleIndex = U.arrayIndexScale(array); + long baseOffset = U.arrayInstanceBaseOffset(array); + int scaleIndex = U.arrayInstanceIndexScale(array); for (int i = 0; i < ARRAY_LENGTH; i++) { Asserts.assertNull(U.getValue(array, baseOffset + i * scaleIndex, TestValue1.class)); } @@ -356,8 +356,8 @@ public static void testNullableFlatArrays() throws Throwable { public static void testNullableFlatArrays2() throws Throwable { final int ARRAY_LENGTH = 10; TestValue1[] array = (TestValue1[])ValueClass.newNullableAtomicArray(TestValue1.class, ARRAY_LENGTH); - long baseOffset = U.arrayBaseOffset(array); - int scaleIndex = U.arrayIndexScale(array); + long baseOffset = U.arrayInstanceBaseOffset(array); + int scaleIndex = U.arrayInstanceIndexScale(array); int layoutKind = U.arrayLayout(array); for (int i = 0; i < ARRAY_LENGTH; i++) { Asserts.assertNull(U.getFlatValue(array, baseOffset + i * scaleIndex, layoutKind, TestValue1.class)); diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 776283c17c5..ec96bc9c6f8 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -846,7 +846,6 @@ tools/sincechecker/modules/jdk.management.jfr/JdkManagementJfrCheckSince.java 83 java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessValue.java 8367346 generic-all jdk/classfile/AccessFlagsTest.java 8366270 generic-all -jdk/internal/misc/Unsafe/AddressComputationContractTest.java 8368933 generic-all jdk/jfr/event/runtime/TestClassLoaderStatsEvent.java 8366820 generic-all sun/tools/jhsdb/BasicLauncherTest.java 8366806 generic-all