MaxOopMapStackOffsetTest.java revision 12772:fbb9c8026495
1/*
2 * Copyright (c) 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.jvmci & (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9")
27 * @library /
28 * @modules jdk.internal.vm.ci/jdk.vm.ci.hotspot
29 *          jdk.internal.vm.ci/jdk.vm.ci.meta
30 *          jdk.internal.vm.ci/jdk.vm.ci.code
31 *          jdk.internal.vm.ci/jdk.vm.ci.code.site
32 *          jdk.internal.vm.ci/jdk.vm.ci.common
33 *          jdk.internal.vm.ci/jdk.vm.ci.runtime
34 *          jdk.internal.vm.ci/jdk.vm.ci.amd64
35 *          jdk.internal.vm.ci/jdk.vm.ci.sparc
36 * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java TestHotSpotVMConfig.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
37 * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -Djvmci.Compiler=null jdk.vm.ci.code.test.MaxOopMapStackOffsetTest
38 */
39
40package jdk.vm.ci.code.test;
41
42import jdk.vm.ci.code.Location;
43import jdk.vm.ci.code.Register;
44import jdk.vm.ci.common.JVMCIError;
45import jdk.vm.ci.meta.JavaConstant;
46import jdk.vm.ci.meta.JavaKind;
47import org.junit.Test;
48
49public class MaxOopMapStackOffsetTest extends DebugInfoTest {
50
51    public static int pass() {
52        return 42;
53    }
54
55    public static int fail() {
56        return 42;
57    }
58
59    private void test(String name, int offset) {
60        Location location = Location.stack(offset);
61               DebugInfoCompiler compiler = (asm, values) -> {
62            asm.growFrame(offset);
63            Register v = asm.emitLoadInt(0);
64            asm.emitIntToStack(v);
65            values[0] = JavaConstant.forInt(42);
66            return null;
67        };
68        test(compiler, getMethod(name), 2, new Location[]{location}, new Location[1], new int[]{4}, JavaKind.Int);
69    }
70
71    private int maxOffset() {
72        return config.maxOopMapStackOffset;
73    }
74
75    private int wordSize() {
76        return config.heapWordSize;
77    }
78
79    @Test(expected = JVMCIError.class)
80    public void failTooLargeOffset() {
81        // This should throw a JVMCIError during installation because the offset is too large.
82        test("fail", maxOffset() + wordSize());
83    }
84
85    @Test
86    public void passWithLargeOffset() {
87        test("pass", maxOffset());
88    }
89}
90