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