< prev index next >
test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MemoryAccessProviderData.java
Print this page
*** 25,50 ****
--- 25,67 ----
import java.lang.reflect.Field;
import org.testng.annotations.DataProvider;
+ import sun.hotspot.WhiteBox;
import jdk.internal.misc.Unsafe;
import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider;
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
import jdk.vm.ci.hotspot.HotSpotVMConfigAccess;
import jdk.vm.ci.meta.Constant;
import jdk.vm.ci.meta.JavaConstant;
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.runtime.JVMCI;
+ import java.util.List;
+ import java.util.ArrayList;
+ import java.util.Map;
+ import java.util.HashMap;
public class MemoryAccessProviderData {
private static final Unsafe UNSAFE = Unsafe.getUnsafe();
private static final HotSpotConstantReflectionProvider CONSTANT_REFLECTION = (HotSpotConstantReflectionProvider) JVMCI.getRuntime().getHostJVMCIBackend().getConstantReflection();
private static final TestClass TEST_OBJECT = new TestClass();
private static final JavaConstant TEST_CONSTANT = CONSTANT_REFLECTION.forObject(TEST_OBJECT);
private static final JavaConstant TEST_CLASS_CONSTANT = CONSTANT_REFLECTION.forObject(TestClass.class);
+ private static KindData[] PRIMITIVE_KIND_DATA = {
+ new KindData(JavaKind.Boolean, TEST_OBJECT),
+ new KindData(JavaKind.Byte, TEST_OBJECT),
+ new KindData(JavaKind.Char, TEST_OBJECT),
+ new KindData(JavaKind.Short, TEST_OBJECT),
+ new KindData(JavaKind.Int, TEST_OBJECT),
+ new KindData(JavaKind.Float, TEST_OBJECT),
+ new KindData(JavaKind.Long, TEST_OBJECT),
+ new KindData(JavaKind.Double, TEST_OBJECT)
+ };
+ private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+
@DataProvider(name = "positiveObject")
public static Object[][] getPositiveObjectJavaKind() {
HotSpotJVMCIRuntimeProvider runtime = (HotSpotJVMCIRuntimeProvider) JVMCI.getRuntime();
int offset = new HotSpotVMConfigAccess(runtime.getConfigStore()).getFieldOffset("Klass::_java_mirror", Integer.class, "oop");
*** 52,122 ****
return new Object[][]{new Object[]{JavaKind.Object, wrappedKlassPointer, (long) offset, TEST_CLASS_CONSTANT, 0}};
}
@DataProvider(name = "positivePrimitive")
public static Object[][] getPositivePrimitiveJavaKinds() {
! Field booleanField;
! Field byteField;
! Field shortField;
! Field intField;
! Field longField;
! Field floatField;
! Field doubleField;
! Field charField;
! try {
! booleanField = MemoryAccessProviderData.TestClass.class.getDeclaredField("booleanField");
! byteField = MemoryAccessProviderData.TestClass.class.getDeclaredField("byteField");
! shortField = MemoryAccessProviderData.TestClass.class.getDeclaredField("shortField");
! intField = MemoryAccessProviderData.TestClass.class.getDeclaredField("intField");
! longField = MemoryAccessProviderData.TestClass.class.getDeclaredField("longField");
! floatField = MemoryAccessProviderData.TestClass.class.getDeclaredField("floatField");
! doubleField = MemoryAccessProviderData.TestClass.class.getDeclaredField("doubleField");
! charField = MemoryAccessProviderData.TestClass.class.getDeclaredField("charField");
! } catch (NoSuchFieldException e) {
! throw new Error("TESTBUG: can't find test field " + e, e);
! }
! long booleanFieldOffset = UNSAFE.objectFieldOffset(booleanField);
! long byteFieldOffset = UNSAFE.objectFieldOffset(byteField);
! long shortFieldOffset = UNSAFE.objectFieldOffset(shortField);
! long intFieldOffset = UNSAFE.objectFieldOffset(intField);
! long longFieldOffset = UNSAFE.objectFieldOffset(longField);
! long floatFieldOffset = UNSAFE.objectFieldOffset(floatField);
! long doubleFieldOffset = UNSAFE.objectFieldOffset(doubleField);
! long charFieldOffset = UNSAFE.objectFieldOffset(charField);
! return new Object[][]{
! new Object[]{JavaKind.Boolean, TEST_CONSTANT, booleanFieldOffset,
! JavaConstant.forBoolean(TEST_OBJECT.booleanField), 8},
! new Object[]{JavaKind.Byte, TEST_CONSTANT, byteFieldOffset,
! JavaConstant.forByte(TEST_OBJECT.byteField), 8},
! new Object[]{JavaKind.Short, TEST_CONSTANT, shortFieldOffset,
! JavaConstant.forShort(TEST_OBJECT.shortField), 16},
! new Object[]{JavaKind.Int, TEST_CONSTANT, intFieldOffset,
! JavaConstant.forInt(TEST_OBJECT.intField), 32},
! new Object[]{JavaKind.Long, TEST_CONSTANT, longFieldOffset,
! JavaConstant.forLong(TEST_OBJECT.longField), 64},
! new Object[]{JavaKind.Float, TEST_CONSTANT, floatFieldOffset,
! JavaConstant.forFloat(TEST_OBJECT.floatField), 32},
! new Object[]{JavaKind.Double, TEST_CONSTANT, doubleFieldOffset,
! JavaConstant.forDouble(TEST_OBJECT.doubleField), 64},
! new Object[]{JavaKind.Char, TEST_CONSTANT, charFieldOffset,
! JavaConstant.forChar(TEST_OBJECT.charField), 16}};
}
@DataProvider(name = "negative")
public static Object[][] getNegativeJavaKinds() {
return new Object[][]{
new Object[]{JavaKind.Void, JavaConstant.NULL_POINTER},
new Object[]{JavaKind.Illegal, JavaConstant.INT_1}};
}
private static class TestClass {
public final boolean booleanField = true;
public final byte byteField = 2;
public final short shortField = 3;
public final int intField = 4;
public final long longField = 5L;
public final double doubleField = 6.0d;
public final float floatField = 7.0f;
public final char charField = 'a';
! public final String stringField = "abc";
}
}
--- 69,166 ----
return new Object[][]{new Object[]{JavaKind.Object, wrappedKlassPointer, (long) offset, TEST_CLASS_CONSTANT, 0}};
}
@DataProvider(name = "positivePrimitive")
public static Object[][] getPositivePrimitiveJavaKinds() {
! List<Object[]> result = new ArrayList<>();
! for (KindData k : PRIMITIVE_KIND_DATA) {
! result.add(new Object[] {k.kind, TEST_CONSTANT, k.instanceFieldOffset, k.instanceFieldValue, Math.max(8, k.kind.getBitCount())});
! result.add(new Object[] {k.kind, TEST_CLASS_CONSTANT, k.staticFieldOffset, k.staticFieldValue, Math.max(8, k.kind.getBitCount())});
! }
! return result.toArray(new Object[result.size()][]);
! }
!
! @DataProvider(name = "outOfBoundsInstanceFields")
! public static Object[][] getOutOfBoundsStaticFieldReads() {
! long instanceSize = WHITE_BOX.getObjectSize(TEST_OBJECT);
! List<Object[]> result = new ArrayList<>();
! for (KindData k : PRIMITIVE_KIND_DATA) {
! long lastValidOffset = instanceSize - (k.kind.getByteCount());
! result.add(new Object[] {k.kind, TEST_CONSTANT, lastValidOffset, false});
! result.add(new Object[] {k.kind, TEST_CONSTANT, (long) -1, true});
! result.add(new Object[] {k.kind, TEST_CONSTANT, lastValidOffset + 1, true});
! result.add(new Object[] {k.kind, TEST_CONSTANT, lastValidOffset + 100, true});
! }
! return result.toArray(new Object[result.size()][]);
! }
!
! @DataProvider(name = "outOfBoundsStaticFields")
! public static Object[][] getOutOfBoundsInstanceFieldReads() {
! long staticsSize = WHITE_BOX.getObjectSize(TEST_OBJECT.getClass());
! List<Object[]> result = new ArrayList<>();
! for (KindData k : PRIMITIVE_KIND_DATA) {
! long lastValidOffset = staticsSize - (k.kind.getByteCount());
! result.add(new Object[] {k.kind, TEST_CLASS_CONSTANT, lastValidOffset, false});
! result.add(new Object[] {k.kind, TEST_CLASS_CONSTANT, (long) -1, true});
! result.add(new Object[] {k.kind, TEST_CLASS_CONSTANT, lastValidOffset + 1, true});
! result.add(new Object[] {k.kind, TEST_CLASS_CONSTANT, lastValidOffset + 100, true});
! }
! return result.toArray(new Object[result.size()][]);
}
@DataProvider(name = "negative")
public static Object[][] getNegativeJavaKinds() {
return new Object[][]{
new Object[]{JavaKind.Void, JavaConstant.NULL_POINTER},
new Object[]{JavaKind.Illegal, JavaConstant.INT_1}};
}
+
private static class TestClass {
public final boolean booleanField = true;
public final byte byteField = 2;
public final short shortField = 3;
public final int intField = 4;
public final long longField = 5L;
public final double doubleField = 6.0d;
public final float floatField = 7.0f;
public final char charField = 'a';
! public final String objectField = "abc";
!
! public static final boolean booleanStaticField = true;
! public static final byte byteStaticField = 2;
! public static final short shortStaticField = 3;
! public static final int intStaticField = 4;
! public static final long longStaticField = 5L;
! public static final double doubleStaticField = 6.0d;
! public static final float floatStaticField = 7.0f;
! public static final char charStaticField = 'a';
! public static final String objectStaticField = "abc";
! }
!
!
! static class KindData {
! final JavaKind kind;
! final Field instanceField;
! final Field staticField;
! final long instanceFieldOffset;
! final long staticFieldOffset;
! final JavaConstant instanceFieldValue;
! final JavaConstant staticFieldValue;
! KindData(JavaKind kind, Object testObject) {
! this.kind = kind;
! try {
! Class<?> c = testObject.getClass();
! instanceField = c.getDeclaredField(kind.getJavaName() + "Field");
! staticField = c.getDeclaredField(kind.getJavaName() + "StaticField");
! instanceField.setAccessible(true);
! staticField.setAccessible(true);
! instanceFieldOffset = UNSAFE.objectFieldOffset(instanceField);
! staticFieldOffset = UNSAFE.staticFieldOffset(staticField);
! instanceFieldValue = JavaConstant.forBoxedPrimitive(instanceField.get(testObject));
! staticFieldValue = JavaConstant.forBoxedPrimitive(staticField.get(null));
! } catch (Exception e) {
! throw new Error("TESTBUG for kind " + kind, e);
! }
! }
}
}
< prev index next >