Mon, 28 Jul 2014 15:06:38 -0700
8051344: JVM crashed in Compile::start() during method parsing w/ UseRTMDeopt turned on
Summary: call rtm_deopt() only if there were no compilation bailouts before.
Reviewed-by: kvn
fparain@3906 | 1 | /* |
fparain@3906 | 2 | * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. |
fparain@3906 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
fparain@3906 | 4 | * |
fparain@3906 | 5 | * This code is free software; you can redistribute it and/or modify it |
fparain@3906 | 6 | * under the terms of the GNU General Public License version 2 only, as |
fparain@3906 | 7 | * published by the Free Software Foundation. |
fparain@3906 | 8 | * |
fparain@3906 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
fparain@3906 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
fparain@3906 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
fparain@3906 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
fparain@3906 | 13 | * accompanied this code). |
fparain@3906 | 14 | * |
fparain@3906 | 15 | * You should have received a copy of the GNU General Public License version |
fparain@3906 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
fparain@3906 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
fparain@3906 | 18 | * |
fparain@3906 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
fparain@3906 | 20 | * or visit www.oracle.com if you need additional information or have any |
fparain@3906 | 21 | * questions. |
fparain@3906 | 22 | */ |
fparain@3906 | 23 | |
fparain@3906 | 24 | /* |
fparain@3906 | 25 | * @test |
fparain@3906 | 26 | * @bug 6294277 |
fparain@3906 | 27 | * @summary java -Xdebug crashes on SourceDebugExtension attribute larger than 64K |
fparain@3933 | 28 | * @run main/othervm -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n SourceDebugExtension |
fparain@3906 | 29 | */ |
fparain@3906 | 30 | import java.io.*; |
fparain@3906 | 31 | |
fparain@3906 | 32 | public class SourceDebugExtension extends ClassLoader |
fparain@3906 | 33 | { |
fparain@3906 | 34 | static final int attrSize = 68000; |
fparain@3906 | 35 | static byte[] header = { |
fparain@3906 | 36 | (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe, (byte)0x00, (byte)0x00, (byte)0x00, |
fparain@3906 | 37 | (byte)0x32, (byte)0x00, (byte)0x1e, (byte)0x0a, (byte)0x00, (byte)0x06, (byte)0x00, |
fparain@3906 | 38 | (byte)0x0f, (byte)0x09, (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x11, (byte)0x08, |
fparain@3906 | 39 | (byte)0x00, (byte)0x12, (byte)0x0a, (byte)0x00, (byte)0x13, (byte)0x00, (byte)0x14, |
fparain@3906 | 40 | (byte)0x07, (byte)0x00, (byte)0x15, (byte)0x07, (byte)0x00, (byte)0x16, (byte)0x01, |
fparain@3906 | 41 | (byte)0x00, (byte)0x06, (byte)0x3c, (byte)0x69, (byte)0x6e, (byte)0x69, (byte)0x74, |
fparain@3906 | 42 | (byte)0x3e, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x28, (byte)0x29, (byte)0x56, |
fparain@3906 | 43 | (byte)0x01, (byte)0x00, (byte)0x04, (byte)0x43, (byte)0x6f, (byte)0x64, (byte)0x65, |
fparain@3906 | 44 | (byte)0x01, (byte)0x00, (byte)0x0f, (byte)0x4c, (byte)0x69, (byte)0x6e, (byte)0x65, |
fparain@3906 | 45 | (byte)0x4e, (byte)0x75, (byte)0x6d, (byte)0x62, (byte)0x65, (byte)0x72, (byte)0x54, |
fparain@3906 | 46 | (byte)0x61, (byte)0x62, (byte)0x6c, (byte)0x65, (byte)0x01, (byte)0x00, (byte)0x04, |
fparain@3906 | 47 | (byte)0x6d, (byte)0x61, (byte)0x69, (byte)0x6e, (byte)0x01, (byte)0x00, (byte)0x16, |
fparain@3906 | 48 | (byte)0x28, (byte)0x5b, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, |
fparain@3906 | 49 | (byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2f, (byte)0x53, |
fparain@3906 | 50 | (byte)0x74, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x67, (byte)0x3b, (byte)0x29, |
fparain@3906 | 51 | (byte)0x56, (byte)0x01, (byte)0x00, (byte)0x0a, (byte)0x53, (byte)0x6f, (byte)0x75, |
fparain@3906 | 52 | (byte)0x72, (byte)0x63, (byte)0x65, (byte)0x46, (byte)0x69, (byte)0x6c, (byte)0x65, |
fparain@3906 | 53 | (byte)0x01, (byte)0x00, (byte)0x0d, (byte)0x54, (byte)0x65, (byte)0x73, (byte)0x74, |
fparain@3906 | 54 | (byte)0x50, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x2e, (byte)0x6a, (byte)0x61, |
fparain@3906 | 55 | (byte)0x76, (byte)0x61, (byte)0x0c, (byte)0x00, (byte)0x07, (byte)0x00, (byte)0x08, |
fparain@3906 | 56 | (byte)0x07, (byte)0x00, (byte)0x17, (byte)0x0c, (byte)0x00, (byte)0x18, (byte)0x00, |
fparain@3906 | 57 | (byte)0x19, (byte)0x01, (byte)0x00, (byte)0x34, (byte)0x54, (byte)0x65, (byte)0x73, |
fparain@3906 | 58 | (byte)0x74, (byte)0x20, (byte)0x70, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x72, |
fparain@3906 | 59 | (byte)0x61, (byte)0x6d, (byte)0x20, (byte)0x66, (byte)0x6f, (byte)0x72, (byte)0x20, |
fparain@3906 | 60 | (byte)0x62, (byte)0x69, (byte)0x67, (byte)0x20, (byte)0x53, (byte)0x6f, (byte)0x75, |
fparain@3906 | 61 | (byte)0x72, (byte)0x63, (byte)0x65, (byte)0x44, (byte)0x65, (byte)0x62, (byte)0x75, |
fparain@3906 | 62 | (byte)0x67, (byte)0x45, (byte)0x78, (byte)0x74, (byte)0x65, (byte)0x6e, (byte)0x73, |
fparain@3906 | 63 | (byte)0x69, (byte)0x6f, (byte)0x6e, (byte)0x20, (byte)0x61, (byte)0x74, (byte)0x74, |
fparain@3906 | 64 | (byte)0x72, (byte)0x69, (byte)0x62, (byte)0x75, (byte)0x74, (byte)0x65, (byte)0x73, |
fparain@3906 | 65 | (byte)0x07, (byte)0x00, (byte)0x1a, (byte)0x0c, (byte)0x00, (byte)0x1b, (byte)0x00, |
fparain@3906 | 66 | (byte)0x1c, (byte)0x01, (byte)0x00, (byte)0x08, (byte)0x54, (byte)0x65, (byte)0x73, |
fparain@3906 | 67 | (byte)0x74, (byte)0x50, (byte)0x72, (byte)0x6f, (byte)0x67, (byte)0x01, (byte)0x00, |
fparain@3906 | 68 | (byte)0x10, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, |
fparain@3906 | 69 | (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2f, (byte)0x4f, (byte)0x62, (byte)0x6a, |
fparain@3906 | 70 | (byte)0x65, (byte)0x63, (byte)0x74, (byte)0x01, (byte)0x00, (byte)0x10, (byte)0x6a, |
fparain@3906 | 71 | (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, |
fparain@3906 | 72 | (byte)0x67, (byte)0x2f, (byte)0x53, (byte)0x79, (byte)0x73, (byte)0x74, (byte)0x65, |
fparain@3906 | 73 | (byte)0x6d, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x6f, (byte)0x75, (byte)0x74, |
fparain@3906 | 74 | (byte)0x01, (byte)0x00, (byte)0x15, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76, |
fparain@3906 | 75 | (byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f, (byte)0x2f, (byte)0x50, (byte)0x72, |
fparain@3906 | 76 | (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x53, (byte)0x74, (byte)0x72, (byte)0x65, |
fparain@3906 | 77 | (byte)0x61, (byte)0x6d, (byte)0x3b, (byte)0x01, (byte)0x00, (byte)0x13, (byte)0x6a, |
fparain@3906 | 78 | (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x69, (byte)0x6f, (byte)0x2f, |
fparain@3906 | 79 | (byte)0x50, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x53, (byte)0x74, |
fparain@3906 | 80 | (byte)0x72, (byte)0x65, (byte)0x61, (byte)0x6d, (byte)0x01, (byte)0x00, (byte)0x07, |
fparain@3906 | 81 | (byte)0x70, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x6c, (byte)0x6e, |
fparain@3906 | 82 | (byte)0x01, (byte)0x00, (byte)0x15, (byte)0x28, (byte)0x4c, (byte)0x6a, (byte)0x61, |
fparain@3906 | 83 | (byte)0x76, (byte)0x61, (byte)0x2f, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, |
fparain@3906 | 84 | (byte)0x2f, (byte)0x53, (byte)0x74, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x67, |
fparain@3906 | 85 | (byte)0x3b, (byte)0x29, (byte)0x56, (byte)0x01, (byte)0x00, (byte)0x14, (byte)0x53, |
fparain@3906 | 86 | (byte)0x6f, (byte)0x75, (byte)0x72, (byte)0x63, (byte)0x65, (byte)0x44, (byte)0x65, |
fparain@3906 | 87 | (byte)0x62, (byte)0x75, (byte)0x67, (byte)0x45, (byte)0x78, (byte)0x74, (byte)0x65, |
fparain@3906 | 88 | (byte)0x6e, (byte)0x73, (byte)0x69, (byte)0x6f, (byte)0x6e, (byte)0x00, (byte)0x21, |
fparain@3906 | 89 | (byte)0x00, (byte)0x05, (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x00, (byte)0x00, |
fparain@3906 | 90 | (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x07, |
fparain@3906 | 91 | (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00, |
fparain@3906 | 92 | (byte)0x00, (byte)0x00, (byte)0x1d, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x01, |
fparain@3906 | 93 | (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x2a, (byte)0xb7, (byte)0x00, |
fparain@3906 | 94 | (byte)0x01, (byte)0xb1, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, |
fparain@3906 | 95 | (byte)0x0a, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x01, |
fparain@3906 | 96 | (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, (byte)0x00, |
fparain@3906 | 97 | (byte)0x0b, (byte)0x00, (byte)0x0c, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x09, |
fparain@3906 | 98 | (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x25, (byte)0x00, (byte)0x02, (byte)0x00, |
fparain@3906 | 99 | (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x09, (byte)0xb2, (byte)0x00, |
fparain@3906 | 100 | (byte)0x02, (byte)0x12, (byte)0x03, (byte)0xb6, (byte)0x00, (byte)0x04, (byte)0xb1, |
fparain@3906 | 101 | (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x0a, (byte)0x00, |
fparain@3906 | 102 | (byte)0x00, (byte)0x00, (byte)0x0a, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x00, |
fparain@3906 | 103 | (byte)0x00, (byte)0x03, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x04, (byte)0x00, |
fparain@3906 | 104 | (byte)0x02, (byte)0x00, (byte)0x0d, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02, |
fparain@3906 | 105 | (byte)0x00, (byte)0x0e, (byte)0x00, (byte)0x1d, (byte)0x00, (byte)0x01, (byte)0x09, |
fparain@3906 | 106 | (byte)0xa0 |
fparain@3906 | 107 | }; |
fparain@3906 | 108 | |
fparain@3906 | 109 | public static void main(String[] args) throws Exception |
fparain@3906 | 110 | { |
fparain@3906 | 111 | try { |
fparain@3906 | 112 | SourceDebugExtension loader = new SourceDebugExtension(); |
fparain@3906 | 113 | /* The test program creates a class file from the header |
fparain@3906 | 114 | * stored above and adding the content of a SourceDebugExtension |
fparain@3906 | 115 | * attribute made of the character 0x02 repeated 68000 times. |
fparain@3906 | 116 | * This attribute doesn't follow the syntax specified in JSR 45 |
fparain@3906 | 117 | * but it's fine because this test just checks that the JVM is |
fparain@3906 | 118 | * able to load a class file with a SourceDebugExtension |
fparain@3906 | 119 | * attribute bigger than 64KB. The JVM doesn't try to |
fparain@3906 | 120 | * parse the content of the attribute, this work is performed |
fparain@3906 | 121 | * by the SA or external tools. |
fparain@3906 | 122 | */ |
fparain@3906 | 123 | byte[] buf = new byte[header.length + attrSize]; |
fparain@3906 | 124 | for(int i=0; i<header.length; i++) { |
fparain@3906 | 125 | buf[i] = header[i]; |
fparain@3906 | 126 | } |
fparain@3906 | 127 | for(int i=0; i<attrSize; i++) { |
fparain@3906 | 128 | buf[header.length+i] = (byte)0x02; |
fparain@3906 | 129 | } |
fparain@3906 | 130 | Class c = loader.defineClass("TestProg", buf, 0, buf.length); |
fparain@3906 | 131 | System.out.println("Test PASSES"); |
fparain@3906 | 132 | } catch(Exception e) { |
fparain@3906 | 133 | System.out.println("Test FAILS"); |
fparain@3906 | 134 | } |
fparain@3906 | 135 | } |
fparain@3906 | 136 | } |