SimpleDebugInfoTest.java revision 11707:ad7af1afda7a
1/* 2 * Copyright (c) 2015, 2016, 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 * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9") & os.arch != "aarch64" 27 * @library / 28 * @modules jdk.vm.ci/jdk.vm.ci.hotspot 29 * jdk.vm.ci/jdk.vm.ci.meta 30 * jdk.vm.ci/jdk.vm.ci.code 31 * jdk.vm.ci/jdk.vm.ci.code.site 32 * jdk.vm.ci/jdk.vm.ci.runtime 33 * jdk.vm.ci/jdk.vm.ci.amd64 34 * jdk.vm.ci/jdk.vm.ci.sparc 35 * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java TestHotSpotVMConfig.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java 36 * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.SimpleDebugInfoTest 37 */ 38 39package jdk.vm.ci.code.test; 40 41import jdk.vm.ci.code.Register; 42import jdk.vm.ci.hotspot.HotSpotConstant; 43import jdk.vm.ci.meta.JavaConstant; 44import jdk.vm.ci.meta.JavaKind; 45import jdk.vm.ci.meta.ResolvedJavaType; 46import jdk.vm.ci.meta.Value; 47import org.junit.Assume; 48import org.junit.Test; 49 50public class SimpleDebugInfoTest extends DebugInfoTest { 51 52 public static int intOnStack() { 53 return 42; 54 } 55 56 private void testIntOnStack(DebugInfoCompiler compiler) { 57 test(compiler, getMethod("intOnStack"), 2, JavaKind.Int); 58 } 59 60 public static int intInLocal() { 61 int local = 42; 62 return local; 63 } 64 65 public void testIntInLocal(DebugInfoCompiler compiler) { 66 test(compiler, getMethod("intInLocal"), 3, JavaKind.Int); 67 } 68 69 @Test 70 public void testConstInt() { 71 DebugInfoCompiler compiler = (asm, values) -> { 72 values[0] = JavaConstant.forInt(42); 73 return null; 74 }; 75 testIntOnStack(compiler); 76 testIntInLocal(compiler); 77 } 78 79 @Test 80 public void testRegInt() { 81 DebugInfoCompiler compiler = (asm, values) -> { 82 Register reg = asm.emitLoadInt(42); 83 values[0] = reg.asValue(asm.getValueKind(JavaKind.Int)); 84 return null; 85 }; 86 testIntOnStack(compiler); 87 testIntInLocal(compiler); 88 } 89 90 @Test 91 public void testStackInt() { 92 DebugInfoCompiler compiler = (asm, values) -> { 93 Register reg = asm.emitLoadInt(42); 94 values[0] = asm.emitIntToStack(reg); 95 return null; 96 }; 97 testIntOnStack(compiler); 98 testIntInLocal(compiler); 99 } 100 101 public static float floatOnStack() { 102 return 42.0f; 103 } 104 105 private void testFloatOnStack(DebugInfoCompiler compiler) { 106 test(compiler, getMethod("floatOnStack"), 2, JavaKind.Float); 107 } 108 109 public static float floatInLocal() { 110 float local = 42.0f; 111 return local; 112 } 113 114 private void testFloatInLocal(DebugInfoCompiler compiler) { 115 test(compiler, getMethod("floatInLocal"), 3, JavaKind.Float); 116 } 117 118 @Test 119 public void testConstFloat() { 120 DebugInfoCompiler compiler = (asm, values) -> { 121 values[0] = JavaConstant.forFloat(42.0f); 122 return null; 123 }; 124 testFloatOnStack(compiler); 125 testFloatInLocal(compiler); 126 } 127 128 @Test 129 public void testRegFloat() { 130 DebugInfoCompiler compiler = (asm, values) -> { 131 Register reg = asm.emitLoadFloat(42.0f); 132 values[0] = reg.asValue(asm.getValueKind(JavaKind.Float)); 133 return null; 134 }; 135 testFloatOnStack(compiler); 136 testFloatInLocal(compiler); 137 } 138 139 @Test 140 public void testStackFloat() { 141 DebugInfoCompiler compiler = (asm, values) -> { 142 Register reg = asm.emitLoadFloat(42.0f); 143 values[0] = asm.emitFloatToStack(reg); 144 return null; 145 }; 146 testFloatOnStack(compiler); 147 testFloatInLocal(compiler); 148 } 149 150 public static long longOnStack() { 151 return 42; 152 } 153 154 private void testLongOnStack(DebugInfoCompiler compiler) { 155 test(compiler, getMethod("longOnStack"), 3, JavaKind.Long, JavaKind.Illegal); 156 } 157 158 public static long longInLocal() { 159 long local = 42; 160 return local; 161 } 162 163 private void testLongInLocal(DebugInfoCompiler compiler) { 164 test(compiler, getMethod("longInLocal"), 4, JavaKind.Long, JavaKind.Illegal); 165 } 166 167 @Test 168 public void testConstLong() { 169 DebugInfoCompiler compiler = (asm, values) -> { 170 values[0] = JavaConstant.forLong(42); 171 values[1] = Value.ILLEGAL; 172 return null; 173 }; 174 testLongOnStack(compiler); 175 testLongInLocal(compiler); 176 } 177 178 @Test 179 public void testRegLong() { 180 DebugInfoCompiler compiler = (asm, values) -> { 181 Register reg = asm.emitLoadLong(42); 182 values[0] = reg.asValue(asm.getValueKind(JavaKind.Long)); 183 values[1] = Value.ILLEGAL; 184 return null; 185 }; 186 testLongOnStack(compiler); 187 testLongInLocal(compiler); 188 } 189 190 @Test 191 public void testStackLong() { 192 DebugInfoCompiler compiler = (asm, values) -> { 193 Register reg = asm.emitLoadLong(42); 194 values[0] = asm.emitLongToStack(reg); 195 values[1] = Value.ILLEGAL; 196 return null; 197 }; 198 testLongOnStack(compiler); 199 testLongInLocal(compiler); 200 } 201 202 public static Class<?> objectOnStack() { 203 return SimpleDebugInfoTest.class; 204 } 205 206 private void testObjectOnStack(DebugInfoCompiler compiler) { 207 test(compiler, getMethod("objectOnStack"), 2, JavaKind.Object); 208 } 209 210 public static Class<?> objectInLocal() { 211 Class<?> local = SimpleDebugInfoTest.class; 212 return local; 213 } 214 215 private void testObjectInLocal(DebugInfoCompiler compiler) { 216 test(compiler, getMethod("objectInLocal"), 3, JavaKind.Object); 217 } 218 219 @Test 220 public void testConstObject() { 221 ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack()); 222 DebugInfoCompiler compiler = (asm, values) -> { 223 values[0] = constantReflection.asJavaClass(type); 224 return null; 225 }; 226 testObjectOnStack(compiler); 227 testObjectInLocal(compiler); 228 } 229 230 @Test 231 public void testRegObject() { 232 ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack()); 233 DebugInfoCompiler compiler = (asm, values) -> { 234 Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.asJavaClass(type)); 235 values[0] = reg.asValue(asm.getValueKind(JavaKind.Object)); 236 return null; 237 }; 238 testObjectOnStack(compiler); 239 testObjectInLocal(compiler); 240 } 241 242 @Test 243 public void testStackObject() { 244 ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack()); 245 DebugInfoCompiler compiler = (asm, values) -> { 246 Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.asJavaClass(type)); 247 values[0] = asm.emitPointerToStack(reg); 248 return null; 249 }; 250 testObjectOnStack(compiler); 251 testObjectInLocal(compiler); 252 } 253 254 @Test 255 public void testRegNarrowObject() { 256 Assume.assumeTrue(config.useCompressedOops); 257 ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack()); 258 DebugInfoCompiler compiler = (asm, values) -> { 259 HotSpotConstant wide = (HotSpotConstant) constantReflection.asJavaClass(type); 260 Register reg = asm.emitLoadPointer((HotSpotConstant) wide.compress()); 261 values[0] = reg.asValue(asm.narrowOopKind); 262 return null; 263 }; 264 testObjectOnStack(compiler); 265 testObjectInLocal(compiler); 266 } 267 268 @Test 269 public void testStackNarrowObject() { 270 Assume.assumeTrue(config.useCompressedOops); 271 ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack()); 272 DebugInfoCompiler compiler = (asm, values) -> { 273 HotSpotConstant wide = (HotSpotConstant) constantReflection.asJavaClass(type); 274 Register reg = asm.emitLoadPointer((HotSpotConstant) wide.compress()); 275 values[0] = asm.emitNarrowPointerToStack(reg); 276 return null; 277 }; 278 testObjectOnStack(compiler); 279 testObjectInLocal(compiler); 280 } 281} 282