# HG changeset patch # User thartmann # Date 1506589375 -7200 # Node ID 4d034d861e13217bee962349784b1a54efef1f7c # Parent ab3a898fff116372c2e79e9a96ec9054f8c034f0 8187780: VM crashes while generating replay compilation file Summary: Fixed two problems with generation of replay file. Reviewed-by: kvn diff -r ab3a898fff11 -r 4d034d861e13 src/hotspot/share/ci/ciInstanceKlass.cpp --- a/src/hotspot/share/ci/ciInstanceKlass.cpp Thu Sep 28 01:01:42 2017 +0000 +++ b/src/hotspot/share/ci/ciInstanceKlass.cpp Thu Sep 28 11:02:55 2017 +0200 @@ -665,9 +665,8 @@ _out->print_cr("null"); } else if (value->is_instance()) { if (value->is_a(SystemDictionary::String_klass())) { - _out->print("\""); - _out->print_raw(java_lang_String::as_quoted_ascii(value)); - _out->print_cr("\""); + const char* ascii_value = java_lang_String::as_quoted_ascii(value); + _out->print("\"%s\"", (ascii_value != NULL) ? ascii_value : ""); } else { const char* klass_name = value->klass()->name()->as_quoted_ascii(); _out->print_cr("%s", klass_name); diff -r ab3a898fff11 -r 4d034d861e13 src/hotspot/share/opto/bytecodeInfo.cpp --- a/src/hotspot/share/opto/bytecodeInfo.cpp Thu Sep 28 01:01:42 2017 +0000 +++ b/src/hotspot/share/opto/bytecodeInfo.cpp Thu Sep 28 11:02:55 2017 +0200 @@ -644,7 +644,8 @@ C->log()->elem("inline_level_discount caller='%d' callee='%d'", id1, id2); } } - InlineTree* ilt = new InlineTree(C, this, callee_method, caller_jvms, caller_bci, recur_frequency, _max_inline_level + max_inline_level_adjust); + // Allocate in the comp_arena to make sure the InlineTree is live when dumping a replay compilation file + InlineTree* ilt = new (C->comp_arena()) InlineTree(C, this, callee_method, caller_jvms, caller_bci, recur_frequency, _max_inline_level + max_inline_level_adjust); _subtrees.append(ilt); NOT_PRODUCT( _count_inlines += 1; ) diff -r ab3a898fff11 -r 4d034d861e13 test/hotspot/jtreg/compiler/ciReplay/TestDumpReplay.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/compiler/ciReplay/TestDumpReplay.java Thu Sep 28 11:02:55 2017 +0200 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017, 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. + * + * 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 + * @library /test/lib + * @modules java.base/jdk.internal.misc:+open + * @build sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -Xbatch -XX:-TieredCompilation -XX:+AlwaysIncrementalInline + * -XX:CompileCommand=compileonly,compiler.ciReplay.TestDumpReplay::* + * compiler.ciReplay.TestDumpReplay + */ + +package compiler.ciReplay; + +import sun.hotspot.WhiteBox; + +public class TestDumpReplay { + private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); + + private static final String emptyString; + + static { + emptyString = ""; + } + + public static void m1() { + m2(); + } + + public static void m2() { + m3(); + } + + public static void m3() { + + } + + public static void main(String[] args) { + // Add compiler control directive to force generation of replay file + String directive = "[{ match: \"*.*\", DumpReplay: true }]"; + if (WHITE_BOX.addCompilerDirective(directive) != 1) { + throw new RuntimeException("Failed to add compiler directive"); + } + + // Trigger compilation of m1 + for (int i = 0; i < 10_000; ++i) { + m1(); + } + } +}