--- /dev/null 2019-01-28 17:49:03.000000000 +0800 +++ new/test/jfr/jvm/TestJFRIntrinsic.java 2019-01-28 17:49:03.000000000 +0800 @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary Intrinsic for JFR + * @library /testlibrary /testlibrary/whitebox + * + * @modules jdk.jfr/jdk.jfr.internal + * java.base/jdk.internal.misc + * java.management + * + * @build sun.hotspot.code.NMethod + * @build sun.hotspot.WhiteBox + * @build ClassFileInstaller + * + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * + * @run main/othervm -Xbootclasspath/a:. -ea -Xmixed -Xbatch -XX:TieredStopAtLevel=4 -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+EnableJFR + * jdk.jfr.jvm.TestJFRIntrinsic + * + * @run main/othervm -Xbootclasspath/a:. -ea -Xmixed -Xbatch -XX:TieredStopAtLevel=1 -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+EnableJFR + * jdk.jfr.jvm.TestJFRIntrinsic + */ + +package jdk.jfr.jvm; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.stream.IntStream; +import jdk.jfr.internal.JVM; +import com.oracle.java.testlibrary.Platform; +import sun.hotspot.WhiteBox; +import sun.hotspot.code.NMethod; + +public class TestJFRIntrinsic { + + private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); + public Object eventWriter; + + public static void main(String... args) throws Exception { + /* + Temporarily excluded until getClassId is reworked to accommodate epoch shift tagging + Method classid = TestJFRIntrinsic.class.getDeclaredMethod("getClassIdIntrinsic", Class.class); + ti.runIntrinsicTest(classid); + */ + TestJFRIntrinsic ti = new TestJFRIntrinsic(); + Method eventWriterMethod = TestJFRIntrinsic.class.getDeclaredMethod("getEventWriterIntrinsic", Class.class); + ti.runIntrinsicTest(eventWriterMethod); + } + + /* + public void getClassIdIntrinsic(Class cls) { + long exp = JVM.getClassId(cls); + if (exp == 0) { + throw new RuntimeException("Class id is zero"); + } + } + */ + + public void getEventWriterIntrinsic(Class cls) { + Object o = JVM.getEventWriter(); + if (o != null) { + eventWriter = o; + } + } + + void runIntrinsicTest(Method method) throws Exception { + if (getMaxCompilationLevel() < 1) { + /* no compiler */ + return; + } + /* load it */ + try { + method.invoke(this, TestJFRIntrinsic.class); + } catch(Exception e) { + throw new RuntimeException(e); + } + + int[] lvls = getAvailableCompilationLevels(); + for (int i : lvls) { + if (!WHITE_BOX.enqueueMethodForCompilation(method, i)) { + throw new RuntimeException("Failed to enqueue method on level: " + i); + } + + if (WHITE_BOX.isMethodCompiled(method)) { + NMethod nm = NMethod.get(method, false); + if (nm.comp_level != i) { + throw new RuntimeException("Failed to compile on correct level: " + i); + } + System.out.println("Compiled " + method + " on level " + i); + } + } + } + + /* below is copied from CompilerUtil in hotspot test lib, removed this when it's moved */ + + /** + * Returns available compilation levels + * + * @return int array with compilation levels + */ + public static int[] getAvailableCompilationLevels() { + if (!WhiteBox.getWhiteBox().getBooleanVMFlag("UseCompiler")) { + return new int[0]; + } + if (WhiteBox.getWhiteBox().getBooleanVMFlag("TieredCompilation")) { + Long flagValue = WhiteBox.getWhiteBox() + .getIntxVMFlag("TieredStopAtLevel"); + int maxLevel = flagValue.intValue(); + return IntStream.rangeClosed(1, maxLevel).toArray(); + } else { + if (Platform.isServer() && !Platform.isEmulatedClient()) { + return new int[]{4}; + } + if (Platform.isClient() || Platform.isMinimal() || Platform.isEmulatedClient()) { + return new int[]{1}; + } + } + return new int[0]; + } + + /** + * Returns maximum compilation level available + * @return an int value representing maximum compilation level available + */ + public static int getMaxCompilationLevel() { + return Arrays.stream(getAvailableCompilationLevels()) + .max() + .getAsInt(); + } +}