1 /* 2 * Copyright (c) 2021, 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 8275868 27 * @library / /test/lib 28 * @summary Testing that ciReplay inlining does not fail with unresolved signature classes. 29 * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.compMode != "Xcomp" & vm.debug == true & vm.compiler2.enabled 30 * @modules java.base/jdk.internal.misc 31 * @run driver compiler.ciReplay.TestInliningProtectionDomain 32 */ 33 34 package compiler.ciReplay; 35 36 import jdk.test.lib.Asserts; 37 38 import java.util.List; 39 40 public class TestInliningProtectionDomain extends InliningBase { 41 42 public static void main(String[] args) { 43 new TestInliningProtectionDomain(ProtectionDomainTestCompiledBefore.class, true); 44 new TestInliningProtectionDomain(ProtectionDomainTestNoOtherCompilationPublic.class, false); 45 new TestInliningProtectionDomain(ProtectionDomainTestNoOtherCompilationPrivate.class, false); 46 new TestInliningProtectionDomain(ProtectionDomainTestNoOtherCompilationPrivateString.class, false); 47 } 48 49 public TestInliningProtectionDomain(Class<?> testClass, boolean compileBar) { 50 super(testClass); 51 if (compileBar) { 52 commandLineNormal.add("-XX:CompileCommand=compileonly," + testClass.getName() + "::bar"); 53 } 54 runTest(); 55 } 56 57 @Override 58 public void testAction() { 59 positiveTest(commandLineReplay); 60 String entryString = getTestClass() + " " + "test"; 61 boolean inlineFails = testClass == ProtectionDomainTestNoOtherCompilationPrivate.class; 62 int inlineeCount = inlineFails ? 1 : 5; 63 64 List<InlineEntry> inlineesNormal = parseLogFile(LOG_FILE_NORMAL, entryString, "compile_id='" + getCompileIdFromFile(getReplayFileName()) + "'", inlineeCount); 65 List<InlineEntry> inlineesReplay = parseLogFile(LOG_FILE_REPLAY, entryString, "test ()V", inlineeCount); 66 verifyLists(inlineesNormal, inlineesReplay, inlineeCount); 67 68 if (inlineFails) { 69 Asserts.assertTrue(inlineesNormal.get(0).compare("compiler.ciReplay.ProtectionDomainTestNoOtherCompilationPrivate", "bar", inlineesNormal.get(0).isUnloadedSignatureClasses())); 70 Asserts.assertTrue(inlineesReplay.get(0).compare("compiler.ciReplay.ProtectionDomainTestNoOtherCompilationPrivate", "bar", inlineesReplay.get(0).isDisallowedByReplay())); 71 } else { 72 Asserts.assertTrue(inlineesNormal.get(4).compare("compiler.ciReplay.InliningBar", "bar2", inlineesNormal.get(4).isNormalInline())); 73 Asserts.assertTrue(inlineesReplay.get(4).compare("compiler.ciReplay.InliningBar", "bar2", inlineesReplay.get(4).isForcedByReplay() || inlineesReplay.get(4).isForcedIncrementalInlineByReplay())); 74 } 75 } 76 } 77 78 class ProtectionDomainTestCompiledBefore { 79 public static void main(String[] args) { 80 for (int i = 0; i < 10000; i++) { 81 bar(); // Ensure that bar() was compiled 82 } 83 for (int i = 0; i < 10000; i++) { 84 test(); 85 } 86 } 87 88 public static void test() { 89 bar(); 90 } 91 92 // Integer should be resolved for the protection domain of this class because the separate compilation of bar() in 93 // the normal run will resolve all classes in the signature. Inlining succeeds. 94 private static Integer bar() { 95 InliningFoo.foo(); 96 return null; 97 } 98 } 99 100 class ProtectionDomainTestNoOtherCompilationPublic { 101 public static void main(String[] args) { 102 for (int i = 0; i < 10000; i++) { 103 test(); 104 } 105 } 106 107 public static void test() { 108 bar(); // Not compiled before separately 109 } 110 111 // Integer should be resolved for the protection domain of this class because getDeclaredMethods is called in normal run 112 // when validating main() method. In this process, all public methods of this class are visited and its signature classes 113 // are resolved. Inlining of bar() succeeds. 114 public static Integer bar() { 115 InliningFoo.foo(); 116 return null; 117 } 118 } 119 120 class ProtectionDomainTestNoOtherCompilationPrivate { 121 public static void main(String[] args) { 122 for (int i = 0; i < 10000; i++) { 123 test(); 124 } 125 } 126 127 public static void test() { 128 bar(); // Not compiled before separately 129 } 130 131 // Integer should be unresolved for the protection domain of this class even though getDeclaredMethods is called in normal 132 // run when validating main() method. In this process, only public methods of this class are visited and its signature 133 // classes are resolved. Since this method is private, the signature classes are not resolved for this protection domain. 134 // Inlining of bar() should fail in normal run with "unresolved signature classes". Therefore, replay compilation should 135 // also not inline bar(). 136 private static Integer bar() { 137 InliningFoo.foo(); 138 return null; 139 } 140 } 141 142 class ProtectionDomainTestNoOtherCompilationPrivateString { 143 public static void main(String[] args) { 144 for (int i = 0; i < 10000; i++) { 145 test(); 146 } 147 } 148 149 public static void test() { 150 bar(); // Not compiled before separately 151 } 152 153 // Integer should be resovled for the protection domain of this class because getDeclaredMethods is called in normal run 154 // when validating main() method. In this process, public methods of this class are visited and its signature classes 155 // are resolved. bar() is private and not visited in this process (i.e. no resolution of String). But since main() 156 // has String[] as parameter, the String class will be resolved for this protection domain. Inlining of bar() succeeds. 157 private static String bar() { 158 InliningFoo.foo(); 159 return null; 160 } 161 } 162 163 class InliningFoo { 164 public static void foo() { 165 foo2(); 166 } 167 168 private static void foo2() { 169 InliningBar.bar(); 170 } 171 } 172 173 174 class InliningBar { 175 public static void bar() { 176 bar2(); 177 } 178 179 private static void bar2() {} 180 }