Mon, 12 Nov 2012 14:03:53 -0800
6830717: replay of compilations would help with debugging
Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method.
Reviewed-by: kvn, twisti, sspitsyn
Contributed-by: yumin.qi@oracle.com
1 /*
2 * Copyright (c) 1999, 2012, 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 */
25 #include "precompiled.hpp"
26 #include "ci/ciSymbol.hpp"
27 #include "ci/ciUtilities.hpp"
28 #include "memory/oopFactory.hpp"
30 // ------------------------------------------------------------------
31 // ciSymbol::ciSymbol
32 //
33 // Preallocated symbol variant. Used with symbols from vmSymbols.
34 ciSymbol::ciSymbol(Symbol* s, vmSymbols::SID sid)
35 : _symbol(s), _sid(sid)
36 {
37 assert(_symbol != NULL, "adding null symbol");
38 _symbol->increment_refcount(); // increment ref count
39 assert(sid_ok(), "must be in vmSymbols");
40 }
42 // Normal case for non-famous symbols.
43 ciSymbol::ciSymbol(Symbol* s)
44 : _symbol(s), _sid(vmSymbols::NO_SID)
45 {
46 assert(_symbol != NULL, "adding null symbol");
47 _symbol->increment_refcount(); // increment ref count
48 assert(sid_ok(), "must not be in vmSymbols");
49 }
51 // ciSymbol
52 //
53 // This class represents a Symbol* in the HotSpot virtual
54 // machine.
56 // ------------------------------------------------------------------
57 // ciSymbol::as_utf8
58 //
59 // The text of the symbol as a null-terminated C string.
60 const char* ciSymbol::as_utf8() {
61 VM_QUICK_ENTRY_MARK;
62 Symbol* s = get_symbol();
63 return s->as_utf8();
64 }
66 // The text of the symbol as a null-terminated C string.
67 const char* ciSymbol::as_quoted_ascii() {
68 GUARDED_VM_QUICK_ENTRY(return get_symbol()->as_quoted_ascii();)
69 }
71 // ------------------------------------------------------------------
72 // ciSymbol::base
73 const jbyte* ciSymbol::base() {
74 GUARDED_VM_ENTRY(return get_symbol()->base();)
75 }
77 // ------------------------------------------------------------------
78 // ciSymbol::byte_at
79 int ciSymbol::byte_at(int i) {
80 GUARDED_VM_ENTRY(return get_symbol()->byte_at(i);)
81 }
83 // ------------------------------------------------------------------
84 // ciSymbol::starts_with
85 //
86 // Tests if the symbol starts with the given prefix.
87 bool ciSymbol::starts_with(const char* prefix, int len) const {
88 GUARDED_VM_ENTRY(return get_symbol()->starts_with(prefix, len);)
89 }
91 bool ciSymbol::is_signature_polymorphic_name() const {
92 GUARDED_VM_ENTRY(return MethodHandles::is_signature_polymorphic_name(get_symbol());)
93 }
95 // ------------------------------------------------------------------
96 // ciSymbol::index_of
97 //
98 // Determines where the symbol contains the given substring.
99 int ciSymbol::index_of_at(int i, const char* str, int len) const {
100 GUARDED_VM_ENTRY(return get_symbol()->index_of_at(i, str, len);)
101 }
103 // ------------------------------------------------------------------
104 // ciSymbol::utf8_length
105 int ciSymbol::utf8_length() {
106 GUARDED_VM_ENTRY(return get_symbol()->utf8_length();)
107 }
109 // ------------------------------------------------------------------
110 // ciSymbol::print_impl
111 //
112 // Implementation of the print method
113 void ciSymbol::print_impl(outputStream* st) {
114 st->print(" value=");
115 print_symbol_on(st);
116 }
118 // ------------------------------------------------------------------
119 // ciSymbol::print_symbol_on
120 //
121 // Print the value of this symbol on an outputStream
122 void ciSymbol::print_symbol_on(outputStream *st) {
123 GUARDED_VM_ENTRY(get_symbol()->print_symbol_on(st);)
124 }
126 // ------------------------------------------------------------------
127 // ciSymbol::make_impl
128 //
129 // Make a ciSymbol from a C string (implementation).
130 ciSymbol* ciSymbol::make_impl(const char* s) {
131 EXCEPTION_CONTEXT;
132 TempNewSymbol sym = SymbolTable::new_symbol(s, THREAD);
133 if (HAS_PENDING_EXCEPTION) {
134 CLEAR_PENDING_EXCEPTION;
135 CURRENT_THREAD_ENV->record_out_of_memory_failure();
136 return ciEnv::_unloaded_cisymbol;
137 }
138 return CURRENT_THREAD_ENV->get_symbol(sym);
139 }
141 // ------------------------------------------------------------------
142 // ciSymbol::make
143 //
144 // Make a ciSymbol from a C string.
145 ciSymbol* ciSymbol::make(const char* s) {
146 GUARDED_VM_ENTRY(return make_impl(s);)
147 }