1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 8136421 27 * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64" 28 * @library / /testlibrary 29 * @compile ../common/CompilerToVMHelper.java 30 * @build compiler.jvmci.common.JVMCIHelpers 31 * compiler.jvmci.events.JvmciNotifyInstallEventTest 32 * @run main jdk.test.lib.FileInstaller ../common/services/ ./META-INF/services/ 33 * @run main jdk.test.lib.FileInstaller ./JvmciNotifyInstallEventTest.config 34 * ./META-INF/services/jdk.vm.ci.hotspot.HotSpotVMEventListener 35 * @run main ClassFileInstaller 36 * compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler 37 * compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory 38 * compiler.jvmci.events.JvmciNotifyInstallEventTest 39 * compiler.jvmci.common.CTVMUtilities 40 * compiler.jvmci.common.testcases.SimpleClass 41 * jdk.vm.ci.hotspot.CompilerToVMHelper 42 * jdk.test.lib.Asserts 43 * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI 44 * -Djvmci.compiler=EmptyCompiler -Xbootclasspath/a:. -Xmixed 45 * -XX:+UseJVMCICompiler -XX:-BootstrapJVMCI 46 * -Dcompiler.jvmci.events.JvmciNotifyInstallEventTest.noevent=false 47 * compiler.jvmci.events.JvmciNotifyInstallEventTest 48 * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:-EnableJVMCI 49 * -Djvmci.compiler=EmptyCompiler -Xbootclasspath/a:. -Xmixed 50 * -Dcompiler.jvmci.events.JvmciNotifyInstallEventTest.noevent=true 51 * compiler.jvmci.events.JvmciNotifyInstallEventTest 52 */ 53 54 package compiler.jvmci.events; 55 56 import compiler.jvmci.common.CTVMUtilities; 57 import compiler.jvmci.common.testcases.SimpleClass; 58 import jdk.test.lib.Asserts; 59 import java.lang.reflect.Method; 60 import jdk.vm.ci.hotspot.HotSpotVMEventListener; 61 import jdk.vm.ci.code.CompilationResult; 62 import jdk.vm.ci.code.InstalledCode; 63 import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider; 64 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; 65 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl; 66 67 public class JvmciNotifyInstallEventTest implements HotSpotVMEventListener { 68 private static final String METHOD_NAME = "testMethod"; 69 private static final boolean IS_POSITIVE = !Boolean.getBoolean( 70 "compiler.jvmci.events.JvmciNotifyInstallEventTest.noevent"); 71 private static volatile int gotInstallNotification = 0; 72 73 public static void main(String args[]) { 74 new JvmciNotifyInstallEventTest().runTest(); 75 } 76 77 private void runTest() { 78 if (gotInstallNotification != 0) { 79 throw new Error("Got install notification before test actions"); 80 } 81 HotSpotCodeCacheProvider codeCache = null; 82 try { 83 codeCache = (HotSpotCodeCacheProvider) HotSpotJVMCIRuntime.runtime() 84 .getHostJVMCIBackend().getCodeCache(); 85 } catch (InternalError ie) { 86 if (IS_POSITIVE) { 87 throw new AssertionError( 88 "Got unexpected InternalError trying to get code cache", 89 ie); 90 } 91 // passed 92 return; 93 } 94 Asserts.assertTrue(IS_POSITIVE, 95 "Haven't caught InternalError in negative case"); 96 Method testMethod; 97 try { 98 testMethod = SimpleClass.class.getDeclaredMethod(METHOD_NAME); 99 } catch (NoSuchMethodException e) { 100 throw new Error("TEST BUG: Can't find " + METHOD_NAME, e); 101 } 102 HotSpotResolvedJavaMethodImpl method = CTVMUtilities 103 .getResolvedMethod(SimpleClass.class, testMethod); 104 CompilationResult compResult = new CompilationResult(METHOD_NAME); 105 // to pass sanity check of default -1 106 compResult.setTotalFrameSize(0); 107 codeCache.installMethod(method, compResult, /* jvmciEnv = */ 0L, 108 /* isDefault = */ false); 109 Asserts.assertEQ(gotInstallNotification, 1, 110 "Got unexpected event count after 1st install attempt"); 111 // since "empty" compilation result is ok, a second attempt should be ok 112 codeCache.installMethod(method, compResult, /* jvmciEnv = */ 0L, 113 /* isDefault = */ false); 114 Asserts.assertEQ(gotInstallNotification, 2, 115 "Got unexpected event count after 2nd install attempt"); 116 } 117 118 @Override 119 public void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, 120 InstalledCode installedCode, CompilationResult compResult) { 121 gotInstallNotification++; 122 } 123 }