GetResolvedJavaTypeTest.java revision 12772:fbb9c8026495
1109998Smarkm/* 2280304Sjkim * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. 3280304Sjkim * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4280304Sjkim * 5109998Smarkm * This code is free software; you can redistribute it and/or modify it 6109998Smarkm * under the terms of the GNU General Public License version 2 only, as 7160814Ssimon * published by the Free Software Foundation. 8109998Smarkm * 9109998Smarkm * This code is distributed in the hope that it will be useful, but WITHOUT 10109998Smarkm * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11109998Smarkm * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12109998Smarkm * version 2 for more details (a copy is included in the LICENSE file that 13109998Smarkm * accompanied this code). 14280304Sjkim * 15109998Smarkm * You should have received a copy of the GNU General Public License version 16109998Smarkm * 2 along with this work; if not, write to the Free Software Foundation, 17109998Smarkm * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18109998Smarkm * 19109998Smarkm * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20109998Smarkm * or visit www.oracle.com if you need additional information or have any 21109998Smarkm * questions. 22109998Smarkm */ 23109998Smarkm 24109998Smarkm/* 25109998Smarkm * @test 26109998Smarkm * @bug 8136421 27109998Smarkm * @requires vm.jvmci 28109998Smarkm * @library / /test/lib 29109998Smarkm * @library ../common/patches 30109998Smarkm * @modules java.base/jdk.internal.misc 31109998Smarkm * @modules jdk.internal.vm.ci/jdk.vm.ci.hotspot 32109998Smarkm * jdk.internal.vm.ci/jdk.vm.ci.meta 33109998Smarkm * 34109998Smarkm * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper 35109998Smarkm * jdk.internal.vm.ci/jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject 36109998Smarkm * sun.hotspot.WhiteBox 37109998Smarkm * @run driver ClassFileInstaller sun.hotspot.WhiteBox 38109998Smarkm * sun.hotspot.WhiteBox$WhiteBoxPermission 39109998Smarkm * @run main/othervm -Xbootclasspath/a:. 40109998Smarkm * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI 41109998Smarkm * -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI 42109998Smarkm * -XX:+UseCompressedOops 43109998Smarkm * compiler.jvmci.compilerToVM.GetResolvedJavaTypeTest 44109998Smarkm * @run main/othervm -Xbootclasspath/a:. 45109998Smarkm * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI 46109998Smarkm * -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI 47109998Smarkm * -XX:-UseCompressedOops -Djvmci.Compiler=null 48109998Smarkm * compiler.jvmci.compilerToVM.GetResolvedJavaTypeTest 49109998Smarkm */ 50109998Smarkm 51109998Smarkmpackage compiler.jvmci.compilerToVM; 52109998Smarkm 53109998Smarkmimport jdk.internal.misc.Unsafe; 54109998Smarkmimport jdk.test.lib.Asserts; 55109998Smarkmimport jdk.vm.ci.hotspot.CompilerToVMHelper; 56109998Smarkmimport jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod; 57109998Smarkmimport jdk.vm.ci.hotspot.HotSpotResolvedObjectType; 58109998Smarkmimport jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject; 59160814Ssimonimport jdk.vm.ci.meta.ConstantPool; 60160814Ssimonimport sun.hotspot.WhiteBox; 61280304Sjkim 62160814Ssimonimport java.lang.reflect.Field; 63160814Ssimon 64109998Smarkmpublic class GetResolvedJavaTypeTest { 65109998Smarkm private static enum TestCase { 66280304Sjkim NULL_BASE { 67109998Smarkm @Override 68280304Sjkim HotSpotResolvedObjectType getResolvedJavaType() { 69111147Snectar return CompilerToVMHelper.getResolvedJavaType( 70280304Sjkim null, getPtrToKlass(), COMPRESSED); 71280304Sjkim } 72280304Sjkim }, 73111147Snectar JAVA_METHOD_BASE { 74280304Sjkim @Override 75280304Sjkim HotSpotResolvedObjectType getResolvedJavaType() { 76280304Sjkim HotSpotResolvedJavaMethod methodInstance 77280304Sjkim = CompilerToVMHelper.getResolvedJavaMethodAtSlot( 78280304Sjkim TEST_CLASS, 0); 79280304Sjkim Field field; 80280304Sjkim try { 81280304Sjkim // jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl.metaspaceMethod 82280304Sjkim field = methodInstance.getClass() 83280304Sjkim .getDeclaredField("metaspaceMethod"); 84280304Sjkim field.setAccessible(true); 85280304Sjkim field.set(methodInstance, getPtrToKlass()); 86280304Sjkim } catch (ReflectiveOperationException e) { 87280304Sjkim throw new Error("TEST BUG : " + e, e); 88280304Sjkim } 89280304Sjkim 90280304Sjkim return CompilerToVMHelper.getResolvedJavaType(methodInstance, 91280304Sjkim 0L, COMPRESSED); 92280304Sjkim } 93280304Sjkim }, 94280304Sjkim CONSTANT_POOL_BASE { 95109998Smarkm @Override 96280304Sjkim HotSpotResolvedObjectType getResolvedJavaType() { 97280304Sjkim ConstantPool cpInst; 98160814Ssimon try { 99280304Sjkim cpInst = CompilerToVMHelper.getConstantPool(null, 100238405Sjkim getPtrToKlass()); 101109998Smarkm // jdk.vm.ci.hotspot.HotSpotConstantPool.metaspaceConstantPool 102109998Smarkm Field field = cpInst.getClass() 103109998Smarkm .getDeclaredField("metaspaceConstantPool"); 104109998Smarkm field.setAccessible(true); 105280304Sjkim field.set(cpInst, getPtrToKlass()); 106280304Sjkim } catch (ReflectiveOperationException e) { 107280304Sjkim throw new Error("TESTBUG : " + e, e); 108280304Sjkim } 109280304Sjkim return CompilerToVMHelper.getResolvedJavaType(cpInst, 110280304Sjkim 0L, COMPRESSED); 111280304Sjkim } 112280304Sjkim }, 113280304Sjkim CONSTANT_POOL_BASE_IN_TWO { 114280304Sjkim @Override 115280304Sjkim HotSpotResolvedObjectType getResolvedJavaType() { 116280304Sjkim long ptr = getPtrToKlass(); 117280304Sjkim ConstantPool cpInst = HotSpotResolvedObjectType 118280304Sjkim .fromObjectClass(TEST_CLASS) 119280304Sjkim .getConstantPool(); 120109998Smarkm try { 121280304Sjkim Field field = cpInst.getClass() 122280304Sjkim .getDeclaredField("metaspaceConstantPool"); 123109998Smarkm field.setAccessible(true); 124280304Sjkim field.set(cpInst, ptr / 2L); 125280304Sjkim } catch (ReflectiveOperationException e) { 126280304Sjkim throw new Error("TESTBUG : " + e, e); 127280304Sjkim } 128280304Sjkim return CompilerToVMHelper.getResolvedJavaType(cpInst, 129280304Sjkim ptr - ptr / 2L, COMPRESSED); 130280304Sjkim } 131109998Smarkm }, 132109998Smarkm CONSTANT_POOL_BASE_ZERO { 133280304Sjkim @Override 134280304Sjkim HotSpotResolvedObjectType getResolvedJavaType() { 135109998Smarkm long ptr = getPtrToKlass(); 136280304Sjkim ConstantPool cpInst = HotSpotResolvedObjectType 137280304Sjkim .fromObjectClass(TEST_CLASS) 138280304Sjkim .getConstantPool(); 139280304Sjkim try { 140280304Sjkim Field field = cpInst.getClass() 141280304Sjkim .getDeclaredField("metaspaceConstantPool"); 142280304Sjkim field.setAccessible(true); 143109998Smarkm field.set(cpInst, 0L); 144280304Sjkim } catch (ReflectiveOperationException e) { 145280304Sjkim throw new Error("TESTBUG : " + e, e); 146280304Sjkim } 147280304Sjkim return CompilerToVMHelper.getResolvedJavaType(cpInst, 148280304Sjkim ptr, COMPRESSED); 149280304Sjkim } 150280304Sjkim }, 151280304Sjkim ; 152280304Sjkim abstract HotSpotResolvedObjectType getResolvedJavaType(); 153280304Sjkim } 154280304Sjkim 155109998Smarkm private static final Unsafe UNSAFE = Unsafe.getUnsafe(); 156280304Sjkim private static final WhiteBox WB = WhiteBox.getWhiteBox(); 157280304Sjkim private static final Class TEST_CLASS = GetResolvedJavaTypeTest.class; 158280304Sjkim /* a compressed parameter for tested method is set to false because 159280304Sjkim unsafe.getKlassPointer always returns uncompressed pointer */ 160238405Sjkim private static final boolean COMPRESSED = false; 161238405Sjkim // = WB.getBooleanVMFlag("UseCompressedClassPointers"); 162280304Sjkim 163238405Sjkim private static long getPtrToKlass() { 164280304Sjkim Field field; 165280304Sjkim try { 166280304Sjkim field = TEST_CLASS.getDeclaredField("PTR"); 167280304Sjkim } catch (NoSuchFieldException e) { 168280304Sjkim throw new Error("TEST BUG : " + e, e); 169280304Sjkim } 170280304Sjkim Object base = UNSAFE.staticFieldBase(field); 171280304Sjkim return WB.getObjectAddress(base) + UNSAFE.staticFieldOffset(field); 172280304Sjkim } 173280304Sjkim 174280304Sjkim public void test(TestCase testCase) { 175109998Smarkm System.out.println(testCase.name()); 176109998Smarkm HotSpotResolvedObjectType type = testCase.getResolvedJavaType(); 177280304Sjkim Asserts.assertEQ(TEST_CLASS, 178280304Sjkim CompilerToVMHelper.getMirror(type), 179280304Sjkim testCase + " : unexpected class returned"); 180280304Sjkim } 181280304Sjkim 182280304Sjkim public static void main(String[] args) { 183280304Sjkim GetResolvedJavaTypeTest test = new GetResolvedJavaTypeTest(); 184280304Sjkim for (TestCase testCase : TestCase.values()) { 185280304Sjkim test.test(testCase); 186280304Sjkim } 187280304Sjkim testObjectBase(); 188280304Sjkim testMetaspaceWrapperBase(); 189280304Sjkim } 190109998Smarkm 191280304Sjkim private static void testMetaspaceWrapperBase() { 192280304Sjkim try { 193280304Sjkim HotSpotResolvedObjectType type 194109998Smarkm = CompilerToVMHelper.getResolvedJavaType( 195280304Sjkim new PublicMetaspaceWrapperObject() { 196280304Sjkim @Override 197280304Sjkim public long getMetaspacePointer() { 198280304Sjkim return getPtrToKlass(); 199280304Sjkim } 200280304Sjkim }, 0L, COMPRESSED); 201280304Sjkim throw new AssertionError("Test METASPACE_WRAPPER_BASE." 202280304Sjkim + " Expected IllegalArgumentException has not been caught"); 203280304Sjkim } catch (IllegalArgumentException iae) { 204280304Sjkim // expected 205109998Smarkm } 206280304Sjkim } 207280304Sjkim 208280304Sjkim private static void testObjectBase() { 209280304Sjkim try { 210280304Sjkim HotSpotResolvedObjectType type 211280304Sjkim = CompilerToVMHelper.getResolvedJavaType(new Object(), 0L, 212280304Sjkim COMPRESSED); 213280304Sjkim throw new AssertionError("Test OBJECT_BASE." 214280304Sjkim + " Expected IllegalArgumentException has not been caught"); 215280304Sjkim } catch (IllegalArgumentException iae) { 216280304Sjkim // expected 217280304Sjkim } 218280304Sjkim } 219280304Sjkim} 220280304Sjkim