annotate src/share/vm/code/nmethod.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents d2ede61b7a12
children 71faaa8e3ccc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_nmethod.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 #ifdef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // Only bother with this argument setup if dtrace is available
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 HS_DTRACE_PROBE_DECL8(hotspot, compiled__method__load,
a61af66fc99e Initial load
duke
parents:
diff changeset
33 const char*, int, const char*, int, const char*, int, void*, size_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 HS_DTRACE_PROBE_DECL6(hotspot, compiled__method__unload,
a61af66fc99e Initial load
duke
parents:
diff changeset
36 char*, int, char*, int, char*, int);
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #define DTRACE_METHOD_UNLOAD_PROBE(method) \
a61af66fc99e Initial load
duke
parents:
diff changeset
39 { \
a61af66fc99e Initial load
duke
parents:
diff changeset
40 methodOop m = (method); \
a61af66fc99e Initial load
duke
parents:
diff changeset
41 if (m != NULL) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
42 symbolOop klass_name = m->klass_name(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
43 symbolOop name = m->name(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
44 symbolOop signature = m->signature(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
45 HS_DTRACE_PROBE6(hotspot, compiled__method__unload, \
a61af66fc99e Initial load
duke
parents:
diff changeset
46 klass_name->bytes(), klass_name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
47 name->bytes(), name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
48 signature->bytes(), signature->utf8_length()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
49 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
50 }
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 #else // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 #define DTRACE_METHOD_UNLOAD_PROBE(method)
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 bool nmethod::is_compiled_by_c1() const {
1155
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
59 if (compiler() == NULL || method() == NULL) return false; // can happen during debug printing
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60 if (is_native_method()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 return compiler()->is_c1();
a61af66fc99e Initial load
duke
parents:
diff changeset
62 }
a61af66fc99e Initial load
duke
parents:
diff changeset
63 bool nmethod::is_compiled_by_c2() const {
1155
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
64 if (compiler() == NULL || method() == NULL) return false; // can happen during debug printing
0
a61af66fc99e Initial load
duke
parents:
diff changeset
65 if (is_native_method()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 return compiler()->is_c2();
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
68 bool nmethod::is_compiled_by_shark() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
69 if (is_native_method()) return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
70 assert(compiler() != NULL, "must be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
71 return compiler()->is_shark();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
72 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 //---------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // NMethod statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // They are printed under various flags, including:
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // PrintC1Statistics, PrintOptoStatistics, LogVMOutput, and LogCompilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // (In the latter two cases, they like other stats are printed to the log only.)
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // These variables are put into one block to reduce relocations
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // and make it simpler to print from the debugger.
a61af66fc99e Initial load
duke
parents:
diff changeset
85 static
a61af66fc99e Initial load
duke
parents:
diff changeset
86 struct nmethod_stats_struct {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 int nmethod_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 int total_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 int relocation_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 int code_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 int stub_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 int consts_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 int scopes_data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 int scopes_pcs_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 int dependencies_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 int handler_table_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 int nul_chk_table_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 int oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void note_nmethod(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 nmethod_count += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 total_size += nm->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
103 relocation_size += nm->relocation_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
104 code_size += nm->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
105 stub_size += nm->stub_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
106 consts_size += nm->consts_size();
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
107 oops_size += nm->oops_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108 scopes_data_size += nm->scopes_data_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
109 scopes_pcs_size += nm->scopes_pcs_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
110 dependencies_size += nm->dependencies_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
111 handler_table_size += nm->handler_table_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
112 nul_chk_table_size += nm->nul_chk_table_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void print_nmethod_stats() {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 if (nmethod_count == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 tty->print_cr("Statistics for %d bytecoded nmethods:", nmethod_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
117 if (total_size != 0) tty->print_cr(" total in heap = %d", total_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 if (relocation_size != 0) tty->print_cr(" relocation = %d", relocation_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 if (code_size != 0) tty->print_cr(" main code = %d", code_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (stub_size != 0) tty->print_cr(" stub code = %d", stub_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 if (consts_size != 0) tty->print_cr(" constants = %d", consts_size);
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
122 if (oops_size != 0) tty->print_cr(" oops = %d", oops_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 if (scopes_data_size != 0) tty->print_cr(" scopes data = %d", scopes_data_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (scopes_pcs_size != 0) tty->print_cr(" scopes pcs = %d", scopes_pcs_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
125 if (dependencies_size != 0) tty->print_cr(" dependencies = %d", dependencies_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (handler_table_size != 0) tty->print_cr(" handler table = %d", handler_table_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 if (nul_chk_table_size != 0) tty->print_cr(" nul chk table = %d", nul_chk_table_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 int native_nmethod_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 int native_total_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 int native_relocation_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 int native_code_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 int native_oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void note_native_nmethod(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 native_nmethod_count += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 native_total_size += nm->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 native_relocation_size += nm->relocation_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
139 native_code_size += nm->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
140 native_oops_size += nm->oops_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void print_native_nmethod_stats() {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (native_nmethod_count == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 tty->print_cr("Statistics for %d native nmethods:", native_nmethod_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (native_total_size != 0) tty->print_cr(" N. total size = %d", native_total_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 if (native_relocation_size != 0) tty->print_cr(" N. relocation = %d", native_relocation_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 if (native_code_size != 0) tty->print_cr(" N. main code = %d", native_code_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (native_oops_size != 0) tty->print_cr(" N. oops = %d", native_oops_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 int pc_desc_resets; // number of resets (= number of caches)
a61af66fc99e Initial load
duke
parents:
diff changeset
152 int pc_desc_queries; // queries to nmethod::find_pc_desc
a61af66fc99e Initial load
duke
parents:
diff changeset
153 int pc_desc_approx; // number of those which have approximate true
a61af66fc99e Initial load
duke
parents:
diff changeset
154 int pc_desc_repeats; // number of _last_pc_desc hits
a61af66fc99e Initial load
duke
parents:
diff changeset
155 int pc_desc_hits; // number of LRU cache hits
a61af66fc99e Initial load
duke
parents:
diff changeset
156 int pc_desc_tests; // total number of PcDesc examinations
a61af66fc99e Initial load
duke
parents:
diff changeset
157 int pc_desc_searches; // total number of quasi-binary search steps
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int pc_desc_adds; // number of LUR cache insertions
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 void print_pc_stats() {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 tty->print_cr("PcDesc Statistics: %d queries, %.2f comparisons per query",
a61af66fc99e Initial load
duke
parents:
diff changeset
162 pc_desc_queries,
a61af66fc99e Initial load
duke
parents:
diff changeset
163 (double)(pc_desc_tests + pc_desc_searches)
a61af66fc99e Initial load
duke
parents:
diff changeset
164 / pc_desc_queries);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 tty->print_cr(" caches=%d queries=%d/%d, hits=%d+%d, tests=%d+%d, adds=%d",
a61af66fc99e Initial load
duke
parents:
diff changeset
166 pc_desc_resets,
a61af66fc99e Initial load
duke
parents:
diff changeset
167 pc_desc_queries, pc_desc_approx,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 pc_desc_repeats, pc_desc_hits,
a61af66fc99e Initial load
duke
parents:
diff changeset
169 pc_desc_tests, pc_desc_searches, pc_desc_adds);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 } nmethod_stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 //---------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // The _unwind_handler is a special marker address, which says that
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // for given exception oop and address, the frame should be removed
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // as the tuple cannot be caught in the nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
180 address ExceptionCache::_unwind_handler = (address) -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 ExceptionCache::ExceptionCache(Handle exception, address pc, address handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert(pc != NULL, "Must be non null");
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(exception.not_null(), "Must be non null");
a61af66fc99e Initial load
duke
parents:
diff changeset
186 assert(handler != NULL, "Must be non null");
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 _exception_type = exception->klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
190 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 add_address_and_handler(pc,handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 address ExceptionCache::match(Handle exception, address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 assert(pc != NULL,"Must be non null");
a61af66fc99e Initial load
duke
parents:
diff changeset
198 assert(exception.not_null(),"Must be non null");
a61af66fc99e Initial load
duke
parents:
diff changeset
199 if (exception->klass() == exception_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 return (test_address(pc));
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 bool ExceptionCache::match_exception_with_space(Handle exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 assert(exception.not_null(),"Must be non null");
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (exception->klass() == exception_type() && count() < cache_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 address ExceptionCache::test_address(address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 for (int i=0; i<count(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 if (pc_at(i) == addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return handler_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 bool ExceptionCache::add_address_and_handler(address addr, address handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 if (test_address(addr) == handler) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 if (count() < cache_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 set_pc_at(count(),addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 set_handler_at(count(), handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 increment_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // private method for handling exception cache
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // These methods are private, and used to manipulate the exception cache
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // directly.
a61af66fc99e Initial load
duke
parents:
diff changeset
241 ExceptionCache* nmethod::exception_cache_entry_for_exception(Handle exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 ExceptionCache* ec = exception_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
243 while (ec != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 if (ec->match_exception_with_space(exception)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 return ec;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 ec = ec->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // Helper used by both find_pc_desc methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
257 static inline bool match_desc(PcDesc* pc, int pc_offset, bool approximate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 NOT_PRODUCT(++nmethod_stats.pc_desc_tests);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 if (!approximate)
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return pc->pc_offset() == pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 else
a61af66fc99e Initial load
duke
parents:
diff changeset
262 return (pc-1)->pc_offset() < pc_offset && pc_offset <= pc->pc_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 void PcDescCache::reset_to(PcDesc* initial_pc_desc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 if (initial_pc_desc == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 _last_pc_desc = NULL; // native method
a61af66fc99e Initial load
duke
parents:
diff changeset
268 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 NOT_PRODUCT(++nmethod_stats.pc_desc_resets);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // reset the cache by filling it with benign (non-null) values
a61af66fc99e Initial load
duke
parents:
diff changeset
272 assert(initial_pc_desc->pc_offset() < 0, "must be sentinel");
a61af66fc99e Initial load
duke
parents:
diff changeset
273 _last_pc_desc = initial_pc_desc + 1; // first valid one is after sentinel
a61af66fc99e Initial load
duke
parents:
diff changeset
274 for (int i = 0; i < cache_size; i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
275 _pc_descs[i] = initial_pc_desc;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 PcDesc* PcDescCache::find_pc_desc(int pc_offset, bool approximate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 NOT_PRODUCT(++nmethod_stats.pc_desc_queries);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 NOT_PRODUCT(if (approximate) ++nmethod_stats.pc_desc_approx);
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // In order to prevent race conditions do not load cache elements
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // repeatedly, but use a local copy:
a61af66fc99e Initial load
duke
parents:
diff changeset
284 PcDesc* res;
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Step one: Check the most recently returned value.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 res = _last_pc_desc;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 if (res == NULL) return NULL; // native method; no PcDescs at all
a61af66fc99e Initial load
duke
parents:
diff changeset
289 if (match_desc(res, pc_offset, approximate)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 NOT_PRODUCT(++nmethod_stats.pc_desc_repeats);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Step two: Check the LRU cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
295 for (int i = 0; i < cache_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 res = _pc_descs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
297 if (res->pc_offset() < 0) break; // optimization: skip empty cache
a61af66fc99e Initial load
duke
parents:
diff changeset
298 if (match_desc(res, pc_offset, approximate)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 NOT_PRODUCT(++nmethod_stats.pc_desc_hits);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 _last_pc_desc = res; // record this cache hit in case of repeat
a61af66fc99e Initial load
duke
parents:
diff changeset
301 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // Report failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
306 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 void PcDescCache::add_pc_desc(PcDesc* pc_desc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 NOT_PRODUCT(++nmethod_stats.pc_desc_adds);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Update the LRU cache by shifting pc_desc forward:
a61af66fc99e Initial load
duke
parents:
diff changeset
312 for (int i = 0; i < cache_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 PcDesc* next = _pc_descs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
314 _pc_descs[i] = pc_desc;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 pc_desc = next;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Note: Do not update _last_pc_desc. It fronts for the LRU cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // adjust pcs_size so that it is a multiple of both oopSize and
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // sizeof(PcDesc) (assumes that if sizeof(PcDesc) is not a multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // of oopSize, then 2*sizeof(PcDesc) is)
a61af66fc99e Initial load
duke
parents:
diff changeset
323 static int adjust_pcs_size(int pcs_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 int nsize = round_to(pcs_size, oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 if ((nsize % sizeof(PcDesc)) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 nsize = pcs_size + sizeof(PcDesc);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328 assert((nsize % oopSize) == 0, "correct alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
329 return nsize;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 void nmethod::add_exception_cache_entry(ExceptionCache* new_entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 assert(ExceptionCache_lock->owned_by_self(),"Must hold the ExceptionCache_lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
337 assert(new_entry != NULL,"Must be non null");
a61af66fc99e Initial load
duke
parents:
diff changeset
338 assert(new_entry->next() == NULL, "Must be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (exception_cache() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 new_entry->set_next(exception_cache());
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 set_exception_cache(new_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 void nmethod::remove_from_exception_cache(ExceptionCache* ec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 ExceptionCache* prev = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 ExceptionCache* curr = exception_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
349 assert(curr != NULL, "nothing to remove");
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // find the previous and next entry of ec
a61af66fc99e Initial load
duke
parents:
diff changeset
351 while (curr != ec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 prev = curr;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 curr = curr->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
354 assert(curr != NULL, "ExceptionCache not found");
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // now: curr == ec
a61af66fc99e Initial load
duke
parents:
diff changeset
357 ExceptionCache* next = curr->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (prev == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 set_exception_cache(next);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 prev->set_next(next);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
363 delete curr;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // public method for accessing the exception cache
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // These are the public access methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
369 address nmethod::handler_for_exception_and_pc(Handle exception, address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // We never grab a lock to read the exception cache, so we may
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // have false negatives. This is okay, as it can only happen during
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // the first few exception lookups for a given nmethod.
a61af66fc99e Initial load
duke
parents:
diff changeset
373 ExceptionCache* ec = exception_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
374 while (ec != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 address ret_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if ((ret_val = ec->match(exception,pc)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return ret_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 ec = ec->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 void nmethod::add_handler_for_exception_and_pc(Handle exception, address pc, address handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // There are potential race conditions during exception cache updates, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // must own the ExceptionCache_lock before doing ANY modifications. Because
605
98cb887364d3 6810672: Comment typos
twisti
parents: 374
diff changeset
388 // we don't lock during reads, it is possible to have several threads attempt
0
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // to update the cache with the same data. We need to check for already inserted
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // copies of the current data before adding it.
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 MutexLocker ml(ExceptionCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
393 ExceptionCache* target_entry = exception_cache_entry_for_exception(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395 if (target_entry == NULL || !target_entry->add_address_and_handler(pc,handler)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
396 target_entry = new ExceptionCache(exception,pc,handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
397 add_exception_cache_entry(target_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 //-------------end of code for ExceptionCache--------------
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 int nmethod::total_size() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 return
a61af66fc99e Initial load
duke
parents:
diff changeset
407 code_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
408 stub_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
409 consts_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
410 scopes_data_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
411 scopes_pcs_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
412 handler_table_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
413 nul_chk_table_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 const char* nmethod::compile_kind() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 if (is_osr_method()) return "osr";
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
418 if (method() != NULL && is_native_method()) return "c2n";
0
a61af66fc99e Initial load
duke
parents:
diff changeset
419 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
422 // Fill in default values for various flag fields
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
423 void nmethod::init_defaults() {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
424 _state = alive;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
425 _marked_for_reclamation = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
426 _has_flushed_dependencies = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
427 _speculatively_disconnected = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
428 _has_unsafe_access = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
429 _has_method_handle_invokes = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
430 _marked_for_deoptimization = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
431 _lock_count = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
432 _stack_traversal_mark = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
433 _unload_reported = false; // jvmti state
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
434
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
435 NOT_PRODUCT(_has_debug_info = false);
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
436 _oops_do_mark_link = NULL;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
437 _jmethod_id = NULL;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
438 _osr_link = NULL;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
439 _scavenge_root_link = NULL;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
440 _scavenge_root_state = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
441 _saved_nmethod_link = NULL;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
442 _compiler = NULL;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
443
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
444 #ifdef HAVE_DTRACE_H
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
445 _trap_offset = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
446 #endif // def HAVE_DTRACE_H
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
447 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 nmethod* nmethod::new_native_nmethod(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
451 CodeBuffer *code_buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 int vep_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
453 int frame_complete,
a61af66fc99e Initial load
duke
parents:
diff changeset
454 int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
455 ByteSize basic_lock_owner_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
456 ByteSize basic_lock_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
457 OopMapSet* oop_maps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // create nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
459 nmethod* nm = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
460 {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 int native_nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
463 CodeOffsets offsets;
a61af66fc99e Initial load
duke
parents:
diff changeset
464 offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
465 offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
a61af66fc99e Initial load
duke
parents:
diff changeset
466 nm = new (native_nmethod_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
467 nmethod(method(), native_nmethod_size, &offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
468 code_buffer, frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
469 basic_lock_owner_sp_offset, basic_lock_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
470 oop_maps);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_native_nmethod(nm));
a61af66fc99e Initial load
duke
parents:
diff changeset
472 if (PrintAssembly && nm != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
473 Disassembler::decode(nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // verify nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
476 debug_only(if (nm) nm->verify();) // might block
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 nm->log_new_nmethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 return nm;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
485 #ifdef HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
486 nmethod* nmethod::new_dtrace_nmethod(methodHandle method,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
487 CodeBuffer *code_buffer,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
488 int vep_offset,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
489 int trap_offset,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
490 int frame_complete,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
491 int frame_size) {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
492 // create nmethod
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
493 nmethod* nm = NULL;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
494 {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
495 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
496 int nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
497 CodeOffsets offsets;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
498 offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
499 offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
500 offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
501
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
502 nm = new (nmethod_size) nmethod(method(), nmethod_size, &offsets, code_buffer, frame_size);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
503
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
504 NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
505 if (PrintAssembly && nm != NULL)
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
506 Disassembler::decode(nm);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
507 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
508 // verify nmethod
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
509 debug_only(if (nm) nm->verify();) // might block
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
510
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
511 if (nm != NULL) {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
512 nm->log_new_nmethod();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
513 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
514
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
515 return nm;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
516 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
517
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
518 #endif // def HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
519
0
a61af66fc99e Initial load
duke
parents:
diff changeset
520 nmethod* nmethod::new_nmethod(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
521 int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
522 int entry_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
523 CodeOffsets* offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
524 int orig_pc_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
525 DebugInformationRecorder* debug_info,
a61af66fc99e Initial load
duke
parents:
diff changeset
526 Dependencies* dependencies,
a61af66fc99e Initial load
duke
parents:
diff changeset
527 CodeBuffer* code_buffer, int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
528 OopMapSet* oop_maps,
a61af66fc99e Initial load
duke
parents:
diff changeset
529 ExceptionHandlerTable* handler_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
530 ImplicitExceptionTable* nul_chk_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
531 AbstractCompiler* compiler,
a61af66fc99e Initial load
duke
parents:
diff changeset
532 int comp_level
a61af66fc99e Initial load
duke
parents:
diff changeset
533 )
a61af66fc99e Initial load
duke
parents:
diff changeset
534 {
a61af66fc99e Initial load
duke
parents:
diff changeset
535 assert(debug_info->oop_recorder() == code_buffer->oop_recorder(), "shared OR");
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // create nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
537 nmethod* nm = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
538 { MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 int nmethod_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
540 allocation_size(code_buffer, sizeof(nmethod))
a61af66fc99e Initial load
duke
parents:
diff changeset
541 + adjust_pcs_size(debug_info->pcs_size())
a61af66fc99e Initial load
duke
parents:
diff changeset
542 + round_to(dependencies->size_in_bytes() , oopSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
543 + round_to(handler_table->size_in_bytes(), oopSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
544 + round_to(nul_chk_table->size_in_bytes(), oopSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
545 + round_to(debug_info->data_size() , oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
546 nm = new (nmethod_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
547 nmethod(method(), nmethod_size, compile_id, entry_bci, offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
548 orig_pc_offset, debug_info, dependencies, code_buffer, frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
549 oop_maps,
a61af66fc99e Initial load
duke
parents:
diff changeset
550 handler_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
551 nul_chk_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
552 compiler,
a61af66fc99e Initial load
duke
parents:
diff changeset
553 comp_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // To make dependency checking during class loading fast, record
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // the nmethod dependencies in the classes it is dependent on.
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // This allows the dependency checking code to simply walk the
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // class hierarchy above the loaded class, checking only nmethods
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // which are dependent on those classes. The slow way is to
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // check every nmethod for dependencies which makes it linear in
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // the number of methods compiled. For applications with a lot
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // classes the slow way is too slow.
a61af66fc99e Initial load
duke
parents:
diff changeset
563 for (Dependencies::DepStream deps(nm); deps.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 klassOop klass = deps.context_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
565 if (klass == NULL) continue; // ignore things like evol_method
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // record this nmethod as dependent on this klass
a61af66fc99e Initial load
duke
parents:
diff changeset
568 instanceKlass::cast(klass)->add_dependent_nmethod(nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
571 NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
a61af66fc99e Initial load
duke
parents:
diff changeset
572 if (PrintAssembly && nm != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
573 Disassembler::decode(nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // verify nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
577 debug_only(if (nm) nm->verify();) // might block
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 nm->log_new_nmethod();
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // done
a61af66fc99e Initial load
duke
parents:
diff changeset
584 return nm;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // For native wrappers
a61af66fc99e Initial load
duke
parents:
diff changeset
589 nmethod::nmethod(
a61af66fc99e Initial load
duke
parents:
diff changeset
590 methodOop method,
a61af66fc99e Initial load
duke
parents:
diff changeset
591 int nmethod_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
592 CodeOffsets* offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
593 CodeBuffer* code_buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
594 int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
595 ByteSize basic_lock_owner_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
596 ByteSize basic_lock_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
597 OopMapSet* oop_maps )
a61af66fc99e Initial load
duke
parents:
diff changeset
598 : CodeBlob("native nmethod", code_buffer, sizeof(nmethod),
a61af66fc99e Initial load
duke
parents:
diff changeset
599 nmethod_size, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps),
a61af66fc99e Initial load
duke
parents:
diff changeset
600 _compiled_synchronized_native_basic_lock_owner_sp_offset(basic_lock_owner_sp_offset),
a61af66fc99e Initial load
duke
parents:
diff changeset
601 _compiled_synchronized_native_basic_lock_sp_offset(basic_lock_sp_offset)
a61af66fc99e Initial load
duke
parents:
diff changeset
602 {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 {
a61af66fc99e Initial load
duke
parents:
diff changeset
604 debug_only(No_Safepoint_Verifier nsv;)
a61af66fc99e Initial load
duke
parents:
diff changeset
605 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
606
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
607 init_defaults();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
608 _method = method;
a61af66fc99e Initial load
duke
parents:
diff changeset
609 _entry_bci = InvocationEntryBci;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // We have no exception handler or deopt handler make the
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // values something that will never match a pc like the nmethod vtable entry
a61af66fc99e Initial load
duke
parents:
diff changeset
612 _exception_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
613 _deoptimize_offset = 0;
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
614 _deoptimize_mh_offset = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
615 _orig_pc_offset = 0;
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
616
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617 _stub_offset = data_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
618 _consts_offset = data_offset();
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
619 _oops_offset = data_offset();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
620 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
621 _scopes_pcs_offset = _scopes_data_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 _dependencies_offset = _scopes_pcs_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
623 _handler_table_offset = _dependencies_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
624 _nul_chk_table_offset = _handler_table_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 _nmethod_end_offset = _nul_chk_table_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
626 _compile_id = 0; // default
a61af66fc99e Initial load
duke
parents:
diff changeset
627 _comp_level = CompLevel_none;
a61af66fc99e Initial load
duke
parents:
diff changeset
628 _entry_point = instructions_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
629 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
630 _osr_entry_point = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
631 _exception_cache = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 _pc_desc_cache.reset_to(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 code_buffer->copy_oops_to(this);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
635 debug_only(verify_scavenge_root_oops());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
636 CodeCache::commit(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 if (PrintNativeNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 ttyLocker ttyl; // keep the following output all in one block
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // This output goes directly to the tty, not the compiler log.
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // To enable tools to match it up with the compilation activity,
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // be sure to tag this tty output with the compile ID.
a61af66fc99e Initial load
duke
parents:
diff changeset
644 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
645 xtty->begin_head("print_native_nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
646 xtty->method(_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
647 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
648 xtty->end_head(" address='" INTPTR_FORMAT "'", (intptr_t) this);
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // print the header part first
a61af66fc99e Initial load
duke
parents:
diff changeset
651 print();
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // then print the requested information
a61af66fc99e Initial load
duke
parents:
diff changeset
653 if (PrintNativeNMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
654 print_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
655 oop_maps->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
657 if (PrintRelocations) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 print_relocations();
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
661 xtty->tail("print_native_nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664 Events::log("Create nmethod " INTPTR_FORMAT, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
666
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
667 // For dtrace wrappers
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
668 #ifdef HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
669 nmethod::nmethod(
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
670 methodOop method,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
671 int nmethod_size,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
672 CodeOffsets* offsets,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
673 CodeBuffer* code_buffer,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
674 int frame_size)
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
675 : CodeBlob("dtrace nmethod", code_buffer, sizeof(nmethod),
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
676 nmethod_size, offsets->value(CodeOffsets::Frame_Complete), frame_size, NULL),
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
677 _compiled_synchronized_native_basic_lock_owner_sp_offset(in_ByteSize(-1)),
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
678 _compiled_synchronized_native_basic_lock_sp_offset(in_ByteSize(-1))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
679 {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
680 {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
681 debug_only(No_Safepoint_Verifier nsv;)
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
682 assert_locked_or_safepoint(CodeCache_lock);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
683
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
684 init_defaults();
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
685 _method = method;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
686 _entry_bci = InvocationEntryBci;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
687 // We have no exception handler or deopt handler make the
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
688 // values something that will never match a pc like the nmethod vtable entry
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
689 _exception_offset = 0;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
690 _deoptimize_offset = 0;
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
691 _deoptimize_mh_offset = 0;
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1253
diff changeset
692 _unwind_handler_offset = -1;
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
693 _trap_offset = offsets->value(CodeOffsets::Dtrace_trap);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
694 _orig_pc_offset = 0;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
695 _stub_offset = data_offset();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
696 _consts_offset = data_offset();
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
697 _oops_offset = data_offset();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
698 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize);
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
699 _scopes_pcs_offset = _scopes_data_offset;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
700 _dependencies_offset = _scopes_pcs_offset;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
701 _handler_table_offset = _dependencies_offset;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
702 _nul_chk_table_offset = _handler_table_offset;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
703 _nmethod_end_offset = _nul_chk_table_offset;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
704 _compile_id = 0; // default
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
705 _comp_level = CompLevel_none;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
706 _entry_point = instructions_begin();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
707 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
708 _osr_entry_point = NULL;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
709 _exception_cache = NULL;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
710 _pc_desc_cache.reset_to(NULL);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
711
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
712 code_buffer->copy_oops_to(this);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
713 debug_only(verify_scavenge_root_oops());
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
714 CodeCache::commit(this);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
715 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
716
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
717 if (PrintNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
718 ttyLocker ttyl; // keep the following output all in one block
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
719 // This output goes directly to the tty, not the compiler log.
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
720 // To enable tools to match it up with the compilation activity,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
721 // be sure to tag this tty output with the compile ID.
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
722 if (xtty != NULL) {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
723 xtty->begin_head("print_dtrace_nmethod");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
724 xtty->method(_method);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
725 xtty->stamp();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
726 xtty->end_head(" address='" INTPTR_FORMAT "'", (intptr_t) this);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
727 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
728 // print the header part first
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
729 print();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
730 // then print the requested information
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
731 if (PrintNMethods) {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
732 print_code();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
733 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
734 if (PrintRelocations) {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
735 print_relocations();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
736 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
737 if (xtty != NULL) {
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
738 xtty->tail("print_dtrace_nmethod");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
739 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
740 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
741 Events::log("Create nmethod " INTPTR_FORMAT, this);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
742 }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
743 #endif // def HAVE_DTRACE_H
0
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 void* nmethod::operator new(size_t size, int nmethod_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // Always leave some room in the CodeCache for I2C/C2I adapters
a61af66fc99e Initial load
duke
parents:
diff changeset
747 if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 return CodeCache::allocate(nmethod_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 nmethod::nmethod(
a61af66fc99e Initial load
duke
parents:
diff changeset
753 methodOop method,
a61af66fc99e Initial load
duke
parents:
diff changeset
754 int nmethod_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
755 int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
756 int entry_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
757 CodeOffsets* offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
758 int orig_pc_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
759 DebugInformationRecorder* debug_info,
a61af66fc99e Initial load
duke
parents:
diff changeset
760 Dependencies* dependencies,
a61af66fc99e Initial load
duke
parents:
diff changeset
761 CodeBuffer *code_buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
762 int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
763 OopMapSet* oop_maps,
a61af66fc99e Initial load
duke
parents:
diff changeset
764 ExceptionHandlerTable* handler_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
765 ImplicitExceptionTable* nul_chk_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
766 AbstractCompiler* compiler,
a61af66fc99e Initial load
duke
parents:
diff changeset
767 int comp_level
a61af66fc99e Initial load
duke
parents:
diff changeset
768 )
a61af66fc99e Initial load
duke
parents:
diff changeset
769 : CodeBlob("nmethod", code_buffer, sizeof(nmethod),
a61af66fc99e Initial load
duke
parents:
diff changeset
770 nmethod_size, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps),
a61af66fc99e Initial load
duke
parents:
diff changeset
771 _compiled_synchronized_native_basic_lock_owner_sp_offset(in_ByteSize(-1)),
a61af66fc99e Initial load
duke
parents:
diff changeset
772 _compiled_synchronized_native_basic_lock_sp_offset(in_ByteSize(-1))
a61af66fc99e Initial load
duke
parents:
diff changeset
773 {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 assert(debug_info->oop_recorder() == code_buffer->oop_recorder(), "shared OR");
a61af66fc99e Initial load
duke
parents:
diff changeset
775 {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 debug_only(No_Safepoint_Verifier nsv;)
a61af66fc99e Initial load
duke
parents:
diff changeset
777 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
778
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
779 init_defaults();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
780 _method = method;
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
781 _entry_bci = entry_bci;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
782 _compile_id = compile_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 _comp_level = comp_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 _compiler = compiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 _orig_pc_offset = orig_pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 _stub_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->stubs()->start());
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Exception handler and deopt handler are in the stub section
a61af66fc99e Initial load
duke
parents:
diff changeset
789 _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions);
a61af66fc99e Initial load
duke
parents:
diff changeset
790 _deoptimize_offset = _stub_offset + offsets->value(CodeOffsets::Deopt);
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
791 _deoptimize_mh_offset = _stub_offset + offsets->value(CodeOffsets::DeoptMH);
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1253
diff changeset
792 if (offsets->value(CodeOffsets::UnwindHandler) != -1) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1253
diff changeset
793 _unwind_handler_offset = instructions_offset() + offsets->value(CodeOffsets::UnwindHandler);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1253
diff changeset
794 } else {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1253
diff changeset
795 _unwind_handler_offset = -1;
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1253
diff changeset
796 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
797 _consts_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->consts()->start());
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
798 _oops_offset = data_offset();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
799 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size (), oopSize);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
800 _scopes_pcs_offset = _scopes_data_offset + round_to(debug_info->data_size (), oopSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
801 _dependencies_offset = _scopes_pcs_offset + adjust_pcs_size(debug_info->pcs_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
802 _handler_table_offset = _dependencies_offset + round_to(dependencies->size_in_bytes (), oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
803 _nul_chk_table_offset = _handler_table_offset + round_to(handler_table->size_in_bytes(), oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
804 _nmethod_end_offset = _nul_chk_table_offset + round_to(nul_chk_table->size_in_bytes(), oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 _entry_point = instructions_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
807 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
808 _osr_entry_point = instructions_begin() + offsets->value(CodeOffsets::OSR_Entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 _exception_cache = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 _pc_desc_cache.reset_to(scopes_pcs_begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
811
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // Copy contents of ScopeDescRecorder to nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
813 code_buffer->copy_oops_to(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
814 debug_info->copy_to(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
815 dependencies->copy_to(this);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
816 if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
817 CodeCache::add_scavenge_root_nmethod(this);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
818 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
819 debug_only(verify_scavenge_root_oops());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 CodeCache::commit(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // Copy contents of ExceptionHandlerTable to nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
824 handler_table->copy_to(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
825 nul_chk_table->copy_to(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // we use the information of entry points to find out if a method is
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // static or non static
a61af66fc99e Initial load
duke
parents:
diff changeset
829 assert(compiler->is_c2() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
830 _method->is_static() == (entry_point() == _verified_entry_point),
a61af66fc99e Initial load
duke
parents:
diff changeset
831 " entry points must be same for static methods and vice versa");
a61af66fc99e Initial load
duke
parents:
diff changeset
832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
833
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
834 bool printnmethods = PrintNMethods
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
835 || CompilerOracle::should_print(_method)
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
836 || CompilerOracle::has_option_string(_method, "PrintNMethods");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 if (printnmethods || PrintDebugInfo || PrintRelocations || PrintDependencies || PrintExceptionHandlers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
838 print_nmethod(printnmethods);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // Note: Do not verify in here as the CodeCache_lock is
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // taken which would conflict with the CompiledIC_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // which taken during the verification of call sites.
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // (was bug - gri 10/25/99)
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 Events::log("Create nmethod " INTPTR_FORMAT, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // Print a short set of xml attributes to identify this nmethod. The
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // output should be embedded in some other element.
a61af66fc99e Initial load
duke
parents:
diff changeset
852 void nmethod::log_identity(xmlStream* log) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 log->print(" compile_id='%d'", compile_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
854 const char* nm_kind = compile_kind();
a61af66fc99e Initial load
duke
parents:
diff changeset
855 if (nm_kind != NULL) log->print(" compile_kind='%s'", nm_kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
856 if (compiler() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 log->print(" compiler='%s'", compiler()->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
860 log->print(" level='%d'", comp_level());
a61af66fc99e Initial load
duke
parents:
diff changeset
861 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 #define LOG_OFFSET(log, name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
866 if ((intptr_t)name##_end() - (intptr_t)name##_begin()) \
a61af66fc99e Initial load
duke
parents:
diff changeset
867 log->print(" " XSTR(name) "_offset='%d'" , \
a61af66fc99e Initial load
duke
parents:
diff changeset
868 (intptr_t)name##_begin() - (intptr_t)this)
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 void nmethod::log_new_nmethod() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 if (LogCompilation && xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
874 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 xtty->begin_elem("nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
876 log_identity(xtty);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 xtty->print(" entry='" INTPTR_FORMAT "' size='%d'",
a61af66fc99e Initial load
duke
parents:
diff changeset
878 instructions_begin(), size());
a61af66fc99e Initial load
duke
parents:
diff changeset
879 xtty->print(" address='" INTPTR_FORMAT "'", (intptr_t) this);
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 LOG_OFFSET(xtty, relocation);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 LOG_OFFSET(xtty, code);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 LOG_OFFSET(xtty, stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
884 LOG_OFFSET(xtty, consts);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 LOG_OFFSET(xtty, scopes_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
886 LOG_OFFSET(xtty, scopes_pcs);
a61af66fc99e Initial load
duke
parents:
diff changeset
887 LOG_OFFSET(xtty, dependencies);
a61af66fc99e Initial load
duke
parents:
diff changeset
888 LOG_OFFSET(xtty, handler_table);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 LOG_OFFSET(xtty, nul_chk_table);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 LOG_OFFSET(xtty, oops);
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 xtty->method(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
893 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
894 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 #undef LOG_OFFSET
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // Print out more verbose output usually for a newly created nmethod.
a61af66fc99e Initial load
duke
parents:
diff changeset
902 void nmethod::print_on(outputStream* st, const char* title) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 if (st != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // Print a little tag line that looks like +PrintCompilation output:
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
906 int tlen = (int) strlen(title);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
907 bool do_nl = false;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
908 if (tlen > 0 && title[tlen-1] == '\n') { tlen--; do_nl = true; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
909 st->print("%3d%c %.*s",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
910 compile_id(),
a61af66fc99e Initial load
duke
parents:
diff changeset
911 is_osr_method() ? '%' :
a61af66fc99e Initial load
duke
parents:
diff changeset
912 method() != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
913 is_native_method() ? 'n' : ' ',
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
914 tlen, title);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
915 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
916 st->print(" (%d) ", comp_level());
a61af66fc99e Initial load
duke
parents:
diff changeset
917 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
918 if (WizardMode) st->print(" (" INTPTR_FORMAT ")", this);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
919 if (Universe::heap()->is_gc_active() && method() != NULL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
920 st->print("(method)");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
921 } else if (method() != NULL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
922 method()->print_short_name(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
923 if (is_osr_method())
a61af66fc99e Initial load
duke
parents:
diff changeset
924 st->print(" @ %d", osr_entry_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
925 if (method()->code_size() > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
926 st->print(" (%d bytes)", method()->code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
928
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
929 if (do_nl) st->cr();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
930 }
a61af66fc99e Initial load
duke
parents:
diff changeset
931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 void nmethod::print_nmethod(bool printmethod) {
a61af66fc99e Initial load
duke
parents:
diff changeset
935 ttyLocker ttyl; // keep the following output all in one block
a61af66fc99e Initial load
duke
parents:
diff changeset
936 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
937 xtty->begin_head("print_nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
938 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
939 xtty->end_head();
a61af66fc99e Initial load
duke
parents:
diff changeset
940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // print the header part first
a61af66fc99e Initial load
duke
parents:
diff changeset
942 print();
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // then print the requested information
a61af66fc99e Initial load
duke
parents:
diff changeset
944 if (printmethod) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 print_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
946 print_pcs();
a61af66fc99e Initial load
duke
parents:
diff changeset
947 oop_maps()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949 if (PrintDebugInfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
950 print_scopes();
a61af66fc99e Initial load
duke
parents:
diff changeset
951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
952 if (PrintRelocations) {
a61af66fc99e Initial load
duke
parents:
diff changeset
953 print_relocations();
a61af66fc99e Initial load
duke
parents:
diff changeset
954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
955 if (PrintDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
956 print_dependencies();
a61af66fc99e Initial load
duke
parents:
diff changeset
957 }
a61af66fc99e Initial load
duke
parents:
diff changeset
958 if (PrintExceptionHandlers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
959 print_handler_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
960 print_nul_chk_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
962 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
963 xtty->tail("print_nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
968 // Promote one word from an assembly-time handle to a live embedded oop.
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
969 inline void nmethod::initialize_immediate_oop(oop* dest, jobject handle) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
970 if (handle == NULL ||
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
971 // As a special case, IC oops are initialized to 1 or -1.
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
972 handle == (jobject) Universe::non_oop_word()) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
973 (*dest) = (oop) handle;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
974 } else {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
975 (*dest) = JNIHandles::resolve_non_null(handle);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
976 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
977 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
978
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
979
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
980 void nmethod::copy_oops(GrowableArray<jobject>* array) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
981 //assert(oops_size() == 0, "do this handshake just once, please");
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
982 int length = array->length();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
983 assert((address)(oops_begin() + length) <= data_end(), "oops big enough");
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
984 oop* dest = oops_begin();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
985 for (int index = 0 ; index < length; index++) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
986 initialize_immediate_oop(&dest[index], array->at(index));
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
987 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
988
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
989 // Now we can fix up all the oops in the code. We need to do this
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
990 // in the code because the assembler uses jobjects as placeholders.
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
991 // The code and relocations have already been initialized by the
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
992 // CodeBlob constructor, so it is valid even at this early point to
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
993 // iterate over relocations and patch the code.
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
994 fix_oop_relocations(NULL, NULL, /*initialize_immediates=*/ true);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
995 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
996
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
997
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
998 bool nmethod::is_at_poll_return(address pc) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
999 RelocIterator iter(this, pc, pc+1);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1000 while (iter.next()) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1001 if (iter.type() == relocInfo::poll_return_type)
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1002 return true;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1003 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1004 return false;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1005 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1006
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1007
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1008 bool nmethod::is_at_poll_or_poll_return(address pc) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1009 RelocIterator iter(this, pc, pc+1);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1010 while (iter.next()) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1011 relocInfo::relocType t = iter.type();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1012 if (t == relocInfo::poll_return_type || t == relocInfo::poll_type)
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1013 return true;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1014 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1015 return false;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1016 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1017
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1018
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1019 void nmethod::fix_oop_relocations(address begin, address end, bool initialize_immediates) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1020 // re-patch all oop-bearing instructions, just in case some oops moved
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1021 RelocIterator iter(this, begin, end);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1022 while (iter.next()) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1023 if (iter.type() == relocInfo::oop_type) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1024 oop_Relocation* reloc = iter.oop_reloc();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1025 if (initialize_immediates && reloc->oop_is_immediate()) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1026 oop* dest = reloc->oop_addr();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1027 initialize_immediate_oop(dest, (jobject) *dest);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1028 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1029 // Refresh the oop-related bits of this instruction.
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1030 reloc->fix_oop_relocation();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1031 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1032
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1033 // There must not be any interfering patches or breakpoints.
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1034 assert(!(iter.type() == relocInfo::breakpoint_type
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1035 && iter.breakpoint_reloc()->active()),
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1036 "no active breakpoint");
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1037 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1038 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1039
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
1040
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 ScopeDesc* nmethod::scope_desc_at(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 PcDesc* pd = pc_desc_at(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 guarantee(pd != NULL, "scope must be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 return new ScopeDesc(this, pd->scope_decode_offset(),
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 1250
diff changeset
1045 pd->obj_decode_offset(), pd->should_reexecute(),
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 1250
diff changeset
1046 pd->return_oop());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 void nmethod::clear_inline_caches() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 assert(SafepointSynchronize::is_at_safepoint(), "cleaning of IC's only allowed at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 if (is_zombie()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1055
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 RelocIterator iter(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 iter.reloc()->clear_inline_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 void nmethod::cleanup_inline_caches() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1064
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1065 assert_locked_or_safepoint(CompiledIC_lock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // If the method is not entrant or zombie then a JMP is plastered over the
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // first few bytes. If an oop in the old code was there, that oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // should not get GC'd. Skip the first few bytes of oops on
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 // not-entrant methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 address low_boundary = verified_entry_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 if (!is_in_use()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 low_boundary += NativeJump::instruction_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // %%% Note: On SPARC we patch only a 4-byte trap, not a full NativeJump.
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // This means that the low_boundary is going to be a little too high.
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // This shouldn't matter, since oops of non-entrant methods are never used.
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 // In fact, why are we bothering to look at oops in a non-entrant method??
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1079
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // Find all calls in an nmethod, and clear the ones that points to zombie methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 RelocIterator iter(this, low_boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 while(iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 switch(iter.type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 case relocInfo::virtual_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 case relocInfo::opt_virtual_call_type: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 CompiledIC *ic = CompiledIC_at(iter.reloc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // Ok, to lookup references to zombies here
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 CodeBlob *cb = CodeCache::find_blob_unsafe(ic->ic_destination());
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 if( cb != NULL && cb->is_nmethod() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // Clean inline caches pointing to both zombie and not_entrant methods
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1093 if (!nm->is_in_use() || (nm->method()->code() != nm)) ic->set_to_clean();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 case relocInfo::static_call_type: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 CompiledStaticCall *csc = compiledStaticCall_at(iter.reloc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 CodeBlob *cb = CodeCache::find_blob_unsafe(csc->destination());
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 if( cb != NULL && cb->is_nmethod() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // Clean inline caches pointing to both zombie and not_entrant methods
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1103 if (!nm->is_in_use() || (nm->method()->code() != nm)) csc->set_to_clean();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1110
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1111 // This is a private interface with the sweeper.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 void nmethod::mark_as_seen_on_stack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 assert(is_not_entrant(), "must be a non-entrant method");
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1114 // Set the traversal mark to ensure that the sweeper does 2
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1115 // cleaning passes before moving to zombie.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 set_stack_traversal_mark(NMethodSweeper::traversal_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // Tell if a non-entrant method can be converted to a zombie (i.e., there is no activations on the stack)
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 bool nmethod::can_not_entrant_be_converted() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 assert(is_not_entrant(), "must be a non-entrant method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // Since the nmethod sweeper only does partial sweep the sweeper's traversal
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 // count can be greater than the stack traversal count before it hits the
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // nmethod for the second time.
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 return stack_traversal_mark()+1 < NMethodSweeper::traversal_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 void nmethod::inc_decompile_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 // Could be gated by ProfileTraps, but do not bother...
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 methodOop m = method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (m == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 methodDataOop mdo = m->method_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 if (mdo == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // There is a benign race here. See comments in methodDataOop.hpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 mdo->inc_decompile_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 void nmethod::make_unloaded(BoolObjectClosure* is_alive, oop cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 post_compiled_method_unload();
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // Since this nmethod is being unloaded, make sure that dependencies
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // recorded in instanceKlasses get flushed and pass non-NULL closure to
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 // indicate that this work is being done during a GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 assert(Universe::heap()->is_gc_active(), "should only be called during gc");
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 assert(is_alive != NULL, "Should be non-NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 // A non-NULL is_alive closure indicates that this is being called during GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 flush_dependencies(is_alive);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // Break cycle between nmethod & method
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 if (TraceClassUnloading && WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 tty->print_cr("[Class unloading: Making nmethod " INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 " unloadable], methodOop(" INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 "), cause(" INTPTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 this, (address)_method, (address)cause);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1157 if (!Universe::heap()->is_gc_active())
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1158 cause->klass()->print();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 }
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1160 // Unlink the osr method, so we do not look this up again
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1161 if (is_osr_method()) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1162 invalidate_osr_method();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1163 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 // If _method is already NULL the methodOop is about to be unloaded,
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 // so we don't have to break the cycle. Note that it is possible to
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // have the methodOop live here, in case we unload the nmethod because
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // it is pointing to some oop (other than the methodOop) being unloaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 if (_method != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // OSR methods point to the methodOop, but the methodOop does not
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // point back!
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 if (_method->code() == this) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 _method->clear_code(); // Break a cycle
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 _method = NULL; // Clear the method of this dead nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // Make the class unloaded - i.e., change state and notify sweeper
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1177 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 if (is_in_use()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 // Transitioning directly from live to unloaded -- so
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // we need to force a cache clean-up; remember this
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 // for later on.
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 CodeCache::set_needs_cache_clean(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 }
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1184 _state = unloaded;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1186 // Log the unloading.
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1187 log_state_change();
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1188
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 // The methodOop is gone at this point
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 assert(_method == NULL, "Tautology");
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1192 set_osr_link(NULL);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1193 //set_scavenge_root_link(NULL); // done by prune_scavenge_root_nmethods
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 NMethodSweeper::notify(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 void nmethod::invalidate_osr_method() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 assert(_entry_bci != InvocationEntryBci, "wrong kind of nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // Remove from list of active nmethods
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 if (method() != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 instanceKlass::cast(method()->method_holder())->remove_osr_nmethod(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // Set entry as invalid
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 _entry_bci = InvalidOSREntryBci;
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1206 void nmethod::log_state_change() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 if (LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 ttyLocker ttyl; // keep the following output all in one block
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1210 if (_state == unloaded) {
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1211 xtty->begin_elem("make_unloaded thread='" UINTX_FORMAT "'",
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1212 os::current_thread_id());
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1213 } else {
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1214 xtty->begin_elem("make_not_entrant thread='" UINTX_FORMAT "'%s",
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1215 os::current_thread_id(),
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1216 (_state == zombie ? " zombie='1'" : ""));
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1217 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 log_identity(xtty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 }
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1223 if (PrintCompilation && _state != unloaded) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1224 print_on(tty, _state == zombie ? "made zombie " : "made not entrant ");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1228
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // Common functionality for both make_not_entrant and make_zombie
1141
b1f619d38249 6914002: unsigned compare problem after 5057818
never
parents: 1138
diff changeset
1230 bool nmethod::make_not_entrant_or_zombie(unsigned int state) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 assert(state == zombie || state == not_entrant, "must be zombie or not_entrant");
a61af66fc99e Initial load
duke
parents:
diff changeset
1232
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
1233 bool was_alive = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1235 // Make sure neither the nmethod nor the method is flushed in case of a safepoint in code below.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 nmethodLocker nml(this);
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1237 methodHandle the_method(method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1238
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 {
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
1240 // If the method is already zombie there is nothing to do
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
1241 if (is_zombie()) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
1242 return false;
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
1243 }
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
1244
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1245 // invalidate osr nmethod before acquiring the patching lock since
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1246 // they both acquire leaf locks and we don't want a deadlock.
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1247 // This logic is equivalent to the logic below for patching the
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1248 // verified entry point of regular methods.
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1249 if (is_osr_method()) {
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1250 // this effectively makes the osr nmethod not entrant
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1251 invalidate_osr_method();
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1252 }
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1253
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 // Enter critical section. Does not block for safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1256
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1257 if (_state == state) {
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1258 // another thread already performed this transition so nothing
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1259 // to do, but return false to indicate this.
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1260 return false;
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1261 }
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1262
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 // The caller can be calling the method statically or through an inline
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 // cache call.
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1265 if (!is_osr_method() && !is_not_entrant()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 NativeJump::patch_verified_entry(entry_point(), verified_entry_point(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 SharedRuntime::get_handle_wrong_method_stub());
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1269
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1270 if (is_in_use()) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1271 // It's a true state change, so mark the method as decompiled.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1272 // Do it only for transition from alive.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1273 inc_decompile_count();
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1274 }
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
1275
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 // Change state
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1277 _state = state;
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1278
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1279 // Log the transition once
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1280 log_state_change();
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1281
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1282 // Remove nmethod from method.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1283 // We need to check if both the _code and _from_compiled_code_entry_point
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1284 // refer to this nmethod because there is a race in setting these two fields
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1285 // in methodOop as seen in bugid 4947125.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1286 // If the vep() points to the zombie nmethod, the memory for the nmethod
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1287 // could be flushed and the compiler and vtable stubs could still call
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1288 // through it.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1289 if (method() != NULL && (method()->code() == this ||
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1290 method()->from_compiled_entry() == verified_entry_point())) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1291 HandleMark hm;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1292 method()->clear_code();
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1293 }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1294
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1295 if (state == not_entrant) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1296 mark_as_seen_on_stack();
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1297 }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1298
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 } // leave critical region under Patching_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1300
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1301 // When the nmethod becomes zombie it is no longer alive so the
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1302 // dependencies must be flushed. nmethods in the not_entrant
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1303 // state will be flushed later when the transition to zombie
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1304 // happens or they get unloaded.
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1305 if (state == zombie) {
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1306 // zombie only - if a JVMTI agent has enabled the CompiledMethodUnload event
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1307 // and it hasn't already been reported for this nmethod then report it now.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1308 // (the event may have been reported earilier if the GC marked it for unloading).
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1309 post_compiled_method_unload();
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
1310
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1311 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1312 flush_dependencies(NULL);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1313 } else {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1314 assert(state == not_entrant, "other cases may need to be handled differently");
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1315 }
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1316
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 if (TraceCreateZombies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 tty->print_cr("nmethod <" INTPTR_FORMAT "> code made %s", this, (state == not_entrant) ? "not entrant" : "zombie");
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 // Make sweeper aware that there is a zombie method that needs to be removed
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 NMethodSweeper::notify(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 994
diff changeset
1324 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 void nmethod::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // Note that there are no valid oops in the nmethod anymore.
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 assert(is_zombie() || (is_osr_method() && is_unloaded()), "must be a zombie method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 assert(is_marked_for_reclamation() || (is_osr_method() && is_unloaded()), "must be marked for reclamation");
a61af66fc99e Initial load
duke
parents:
diff changeset
1331
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 assert (!is_locked_by_vm(), "locked methods shouldn't be flushed");
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1333 assert_locked_or_safepoint(CodeCache_lock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1334
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 // completely deallocate this method
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 EventMark m("flushing nmethod " INTPTR_FORMAT " %s", this, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 if (PrintMethodFlushing) {
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1338 tty->print_cr("*flushing nmethod %3d/" INTPTR_FORMAT ". Live blobs:" UINT32_FORMAT "/Free CodeCache:" SIZE_FORMAT "Kb",
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1339 _compile_id, this, CodeCache::nof_blobs(), CodeCache::unallocated_capacity()/1024);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 // We need to deallocate any ExceptionCache data.
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 // Note that we do not need to grab the nmethod lock for this, it
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 // better be thread safe if we're disposing of it!
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 ExceptionCache* ec = exception_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 set_exception_cache(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 while(ec != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 ExceptionCache* next = ec->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 delete ec;
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 ec = next;
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1352
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1353 if (on_scavenge_root_list()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1354 CodeCache::drop_scavenge_root_nmethod(this);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1355 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1356
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1357 if (is_speculatively_disconnected()) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1358 CodeCache::remove_saved_code(this);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1359 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
1360
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
1361 #ifdef SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
1362 ((SharkCompiler *) compiler())->free_compiled_method(instructions_begin());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
1363 #endif // SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
1364
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 ((CodeBlob*)(this))->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
1366
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 CodeCache::free(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 // Notify all classes this nmethod is dependent on that it is no
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 // longer dependent. This should only be called in two situations.
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 // First, when a nmethod transitions to a zombie all dependents need
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 // to be clear. Since zombification happens at a safepoint there's no
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 // synchronization issues. The second place is a little more tricky.
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 // During phase 1 of mark sweep class unloading may happen and as a
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 // result some nmethods may get unloaded. In this case the flushing
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 // of dependencies must happen during phase 1 since after GC any
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 // dependencies in the unloaded nmethod won't be updated, so
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 // traversing the dependency information in unsafe. In that case this
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 // function is called with a non-NULL argument and this function only
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 // notifies instanceKlasses that are reachable
a61af66fc99e Initial load
duke
parents:
diff changeset
1384
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 void nmethod::flush_dependencies(BoolObjectClosure* is_alive) {
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1490
diff changeset
1386 assert_locked_or_safepoint(CodeCache_lock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 assert(Universe::heap()->is_gc_active() == (is_alive != NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 "is_alive is non-NULL if and only if we are called during GC");
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 if (!has_flushed_dependencies()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 set_has_flushed_dependencies();
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 for (Dependencies::DepStream deps(this); deps.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 klassOop klass = deps.context_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 if (klass == NULL) continue; // ignore things like evol_method
a61af66fc99e Initial load
duke
parents:
diff changeset
1394
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 // During GC the is_alive closure is non-NULL, and is used to
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 // determine liveness of dependees that need to be updated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 if (is_alive == NULL || is_alive->do_object_b(klass)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 instanceKlass::cast(klass)->remove_dependent_nmethod(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
a61af66fc99e Initial load
duke
parents:
diff changeset
1404
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 // If this oop is not live, the nmethod can be unloaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 bool nmethod::can_unload(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 oop* root, bool unloading_occurred) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 assert(root != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 oop obj = *root;
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 if (obj == NULL || is_alive->do_object_b(obj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 if (obj->is_compiledICHolder()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 compiledICHolderOop cichk_oop = compiledICHolderOop(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 if (is_alive->do_object_b(
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 cichk_oop->holder_method()->method_holder()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 is_alive->do_object_b(cichk_oop->holder_klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 // The oop should be kept alive
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 keep_alive->do_oop(root);
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1424 // If ScavengeRootsInCode is true, an nmethod might be unloaded
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1425 // simply because one of its constant oops has gone dead.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1426 // No actual classes need to be unloaded in order for this to occur.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1427 assert(unloading_occurred || ScavengeRootsInCode, "Inconsistency in unloading");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 make_unloaded(is_alive, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1431
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 // post_compiled_method_load_event
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 // new method for install_code() path
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // Transfer information from compilation to jvmti
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 void nmethod::post_compiled_method_load_event() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 methodOop moop = method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 HS_DTRACE_PROBE8(hotspot, compiled__method__load,
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 moop->klass_name()->bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 moop->klass_name()->utf8_length(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 moop->name()->bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 moop->name()->utf8_length(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 moop->signature()->bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 moop->signature()->utf8_length(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 code_begin(), code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1447
1616
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1448 if (JvmtiExport::should_post_compiled_method_load() ||
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1449 JvmtiExport::should_post_compiled_method_unload()) {
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1450 get_and_cache_jmethod_id();
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1451 }
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1452
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 if (JvmtiExport::should_post_compiled_method_load()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 JvmtiExport::post_compiled_method_load(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1457
1616
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1458 jmethodID nmethod::get_and_cache_jmethod_id() {
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1459 if (_jmethod_id == NULL) {
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1460 // Cache the jmethod_id since it can no longer be looked up once the
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1461 // method itself has been marked for unloading.
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1462 _jmethod_id = method()->jmethod_id();
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1463 }
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1464 return _jmethod_id;
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1465 }
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1466
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 void nmethod::post_compiled_method_unload() {
1577
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1563
diff changeset
1468 if (unload_reported()) {
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1563
diff changeset
1469 // During unloading we transition to unloaded and then to zombie
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1563
diff changeset
1470 // and the unloading is reported during the first transition.
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1563
diff changeset
1471 return;
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1563
diff changeset
1472 }
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1563
diff changeset
1473
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 assert(_method != NULL && !is_unloaded(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 DTRACE_METHOD_UNLOAD_PROBE(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
1476
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 // If a JVMTI agent has enabled the CompiledMethodUnload event then
1616
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1478 // post the event. Sometime later this nmethod will be made a zombie
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1479 // by the sweeper but the methodOop will not be valid at that point.
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1480 // If the _jmethod_id is null then no load event was ever requested
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1481 // so don't bother posting the unload. The main reason for this is
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1482 // that the jmethodID is a weak reference to the methodOop so if
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1483 // it's being unloaded there's no way to look it up since the weak
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1484 // ref will have been cleared.
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1485 if (_jmethod_id != NULL && JvmtiExport::should_post_compiled_method_unload()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 assert(!unload_reported(), "already unloaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 HandleMark hm;
1616
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1602
diff changeset
1488 JvmtiExport::post_compiled_method_unload(_jmethod_id, code_begin());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1490
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 // The JVMTI CompiledMethodUnload event can be enabled or disabled at
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 // any time. As the nmethod is being unloaded now we mark it has
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 // having the unload event reported - this will ensure that we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 // attempt to report the event in the unlikely scenario where the
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 // event is enabled at the time the nmethod is made a zombie.
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 set_unload_reported();
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 // This is called at the end of the strong tracing/marking phase of a
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 // GC to unload an nmethod if it contains otherwise unreachable
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 // oops.
a61af66fc99e Initial load
duke
parents:
diff changeset
1502
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 void nmethod::do_unloading(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 OopClosure* keep_alive, bool unloading_occurred) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 // Make sure the oop's ready to receive visitors
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 assert(!is_zombie() && !is_unloaded(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 "should not call follow on zombie or unloaded nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
1508
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 // If the method is not entrant then a JMP is plastered over the
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 // first few bytes. If an oop in the old code was there, that oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 // should not get GC'd. Skip the first few bytes of oops on
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 // not-entrant methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 address low_boundary = verified_entry_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 if (is_not_entrant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 low_boundary += NativeJump::instruction_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 // %%% Note: On SPARC we patch only a 4-byte trap, not a full NativeJump.
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 // (See comment above.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1519
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 // The RedefineClasses() API can cause the class unloading invariant
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 // to no longer be true. See jvmtiExport.hpp for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 // Also, leave a debugging breadcrumb in local flag.
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 bool a_class_was_redefined = JvmtiExport::has_redefined_a_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 if (a_class_was_redefined) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 // This set of the unloading_occurred flag is done before the
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 // call to post_compiled_method_unload() so that the unloading
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 // of this nmethod is reported.
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 unloading_occurred = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1530
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 // Follow methodOop
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 if (can_unload(is_alive, keep_alive, (oop*)&_method, unloading_occurred)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1535
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 // Exception cache
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 ExceptionCache* ec = exception_cache();
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 while (ec != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 oop* ex_addr = (oop*)ec->exception_type_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 oop ex = *ex_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 ExceptionCache* next_ec = ec->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 if (ex != NULL && !is_alive->do_object_b(ex)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 assert(!ex->is_compiledICHolder(), "Possible error here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 remove_from_exception_cache(ec);
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 ec = next_ec;
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1548
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 // If class unloading occurred we first iterate over all inline caches and
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 // clear ICs where the cached oop is referring to an unloaded klass or method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 // The remaining live cached oops will be traversed in the relocInfo::oop_type
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 // iteration below.
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 if (unloading_occurred) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 RelocIterator iter(this, low_boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 while(iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 if (iter.type() == relocInfo::virtual_call_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 CompiledIC *ic = CompiledIC_at(iter.reloc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 oop ic_oop = ic->cached_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 if (ic_oop != NULL && !is_alive->do_object_b(ic_oop)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 // The only exception is compiledICHolder oops which may
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 // yet be marked below. (We check this further below).
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 if (ic_oop->is_compiledICHolder()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 compiledICHolderOop cichk_oop = compiledICHolderOop(ic_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 if (is_alive->do_object_b(
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 cichk_oop->holder_method()->method_holder()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 is_alive->do_object_b(cichk_oop->holder_klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 ic->set_to_clean();
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1378
diff changeset
1571 assert(ic->cached_oop() == NULL,
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1378
diff changeset
1572 "cached oop in IC should be cleared");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1577
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 // Compiled code
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 RelocIterator iter(this, low_boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 if (iter.type() == relocInfo::oop_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 oop_Relocation* r = iter.oop_reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 // In this loop, we must only traverse those oops directly embedded in
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 // the code. Other oops (oop_index>0) are seen as part of scopes_oops.
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 assert(1 == (r->oop_is_immediate()) +
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 (r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 "oop must be found in exactly one place");
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 if (r->oop_is_immediate() && r->oop_value() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 if (can_unload(is_alive, keep_alive, r->oop_addr(), unloading_occurred)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1595
a61af66fc99e Initial load
duke
parents:
diff changeset
1596
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 // Scopes
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 for (oop* p = oops_begin(); p < oops_end(); p++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 if (*p == Universe::non_oop_word()) continue; // skip non-oops
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 if (can_unload(is_alive, keep_alive, p, unloading_occurred)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1604
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 // This nmethod was not unloaded; check below that all CompiledICs
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 // refer to marked oops.
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 RelocIterator iter(this, low_boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 if (iter.type() == relocInfo::virtual_call_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 CompiledIC *ic = CompiledIC_at(iter.reloc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 oop ic_oop = ic->cached_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 assert(ic_oop == NULL || is_alive->do_object_b(ic_oop),
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 "Found unmarked ic_oop in reachable nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1621
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1622 // This method is called twice during GC -- once while
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1623 // tracing the "active" nmethods on thread stacks during
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1624 // the (strong) marking phase, and then again when walking
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1625 // the code cache contents during the weak roots processing
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1626 // phase. The two uses are distinguished by means of the
994
753cf9794df9 6885169: merge of 4957990 and 6863023 causes conflict on do_nmethods
jrose
parents: 993
diff changeset
1627 // 'do_strong_roots_only' flag, which is true in the first
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1628 // case. We want to walk the weak roots in the nmethod
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1629 // only in the second case. The weak roots in the nmethod
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1630 // are the oops in the ExceptionCache and the InlineCache
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1631 // oops.
994
753cf9794df9 6885169: merge of 4957990 and 6863023 causes conflict on do_nmethods
jrose
parents: 993
diff changeset
1632 void nmethod::oops_do(OopClosure* f, bool do_strong_roots_only) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 // make sure the oops ready to receive visitors
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 assert(!is_zombie() && !is_unloaded(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 "should not call follow on zombie or unloaded nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
1636
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 // If the method is not entrant or zombie then a JMP is plastered over the
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 // first few bytes. If an oop in the old code was there, that oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 // should not get GC'd. Skip the first few bytes of oops on
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 // not-entrant methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 address low_boundary = verified_entry_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 if (is_not_entrant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 low_boundary += NativeJump::instruction_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 // %%% Note: On SPARC we patch only a 4-byte trap, not a full NativeJump.
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 // (See comment above.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1647
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 // Compiled code
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 f->do_oop((oop*) &_method);
994
753cf9794df9 6885169: merge of 4957990 and 6863023 causes conflict on do_nmethods
jrose
parents: 993
diff changeset
1650 if (!do_strong_roots_only) {
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1651 // weak roots processing phase -- update ExceptionCache oops
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1652 ExceptionCache* ec = exception_cache();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1653 while(ec != NULL) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1654 f->do_oop((oop*)ec->exception_type_addr());
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1655 ec = ec->next();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1656 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1657 } // Else strong roots phase -- skip oops in ExceptionCache
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1658
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 RelocIterator iter(this, low_boundary);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1660
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 if (iter.type() == relocInfo::oop_type ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 oop_Relocation* r = iter.oop_reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 // In this loop, we must only follow those oops directly embedded in
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 // the code. Other oops (oop_index>0) are seen as part of scopes_oops.
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1666 assert(1 == (r->oop_is_immediate()) +
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1667 (r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()),
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 605
diff changeset
1668 "oop must be found in exactly one place");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 if (r->oop_is_immediate() && r->oop_value() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 f->do_oop(r->oop_addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1674
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 // Scopes
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1676 // This includes oop constants not inlined in the code stream.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 for (oop* p = oops_begin(); p < oops_end(); p++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 if (*p == Universe::non_oop_word()) continue; // skip non-oops
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 f->do_oop(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1682
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1683 #define NMETHOD_SENTINEL ((nmethod*)badAddress)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1684
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1685 nmethod* volatile nmethod::_oops_do_mark_nmethods;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1686
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1687 // An nmethod is "marked" if its _mark_link is set non-null.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1688 // Even if it is the end of the linked list, it will have a non-null link value,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1689 // as long as it is on the list.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1690 // This code must be MP safe, because it is used from parallel GC passes.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1691 bool nmethod::test_set_oops_do_mark() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1692 assert(nmethod::oops_do_marking_is_active(), "oops_do_marking_prologue must be called");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1693 nmethod* observed_mark_link = _oops_do_mark_link;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1694 if (observed_mark_link == NULL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1695 // Claim this nmethod for this thread to mark.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1696 observed_mark_link = (nmethod*)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1697 Atomic::cmpxchg_ptr(NMETHOD_SENTINEL, &_oops_do_mark_link, NULL);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1698 if (observed_mark_link == NULL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1699
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1700 // Atomically append this nmethod (now claimed) to the head of the list:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1701 nmethod* observed_mark_nmethods = _oops_do_mark_nmethods;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1702 for (;;) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1703 nmethod* required_mark_nmethods = observed_mark_nmethods;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1704 _oops_do_mark_link = required_mark_nmethods;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1705 observed_mark_nmethods = (nmethod*)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1706 Atomic::cmpxchg_ptr(this, &_oops_do_mark_nmethods, required_mark_nmethods);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1707 if (observed_mark_nmethods == required_mark_nmethods)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1708 break;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1709 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1710 // Mark was clear when we first saw this guy.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1711 NOT_PRODUCT(if (TraceScavenge) print_on(tty, "oops_do, mark\n"));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1712 return false;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1713 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1714 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1715 // On fall through, another racing thread marked this nmethod before we did.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1716 return true;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1717 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1718
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1719 void nmethod::oops_do_marking_prologue() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1720 NOT_PRODUCT(if (TraceScavenge) tty->print_cr("[oops_do_marking_prologue"));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1721 assert(_oops_do_mark_nmethods == NULL, "must not call oops_do_marking_prologue twice in a row");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1722 // We use cmpxchg_ptr instead of regular assignment here because the user
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1723 // may fork a bunch of threads, and we need them all to see the same state.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1724 void* observed = Atomic::cmpxchg_ptr(NMETHOD_SENTINEL, &_oops_do_mark_nmethods, NULL);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1725 guarantee(observed == NULL, "no races in this sequential code");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1726 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1727
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1728 void nmethod::oops_do_marking_epilogue() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1729 assert(_oops_do_mark_nmethods != NULL, "must not call oops_do_marking_epilogue twice in a row");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1730 nmethod* cur = _oops_do_mark_nmethods;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1731 while (cur != NMETHOD_SENTINEL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1732 assert(cur != NULL, "not NULL-terminated");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1733 nmethod* next = cur->_oops_do_mark_link;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1734 cur->_oops_do_mark_link = NULL;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1735 NOT_PRODUCT(if (TraceScavenge) cur->print_on(tty, "oops_do, unmark\n"));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1736 cur = next;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1737 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1738 void* required = _oops_do_mark_nmethods;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1739 void* observed = Atomic::cmpxchg_ptr(NULL, &_oops_do_mark_nmethods, required);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1740 guarantee(observed == required, "no races in this sequential code");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1741 NOT_PRODUCT(if (TraceScavenge) tty->print_cr("oops_do_marking_epilogue]"));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1742 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1743
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1744 class DetectScavengeRoot: public OopClosure {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1745 bool _detected_scavenge_root;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1746 public:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1747 DetectScavengeRoot() : _detected_scavenge_root(false)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1748 { NOT_PRODUCT(_print_nm = NULL); }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1749 bool detected_scavenge_root() { return _detected_scavenge_root; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1750 virtual void do_oop(oop* p) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1751 if ((*p) != NULL && (*p)->is_scavengable()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1752 NOT_PRODUCT(maybe_print(p));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1753 _detected_scavenge_root = true;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1754 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1755 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1756 virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1757
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1758 #ifndef PRODUCT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1759 nmethod* _print_nm;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1760 void maybe_print(oop* p) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1761 if (_print_nm == NULL) return;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1762 if (!_detected_scavenge_root) _print_nm->print_on(tty, "new scavenge root");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1763 tty->print_cr(""PTR_FORMAT"[offset=%d] detected non-perm oop "PTR_FORMAT" (found at "PTR_FORMAT")",
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1764 _print_nm, (int)((intptr_t)p - (intptr_t)_print_nm),
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1765 (intptr_t)(*p), (intptr_t)p);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1766 (*p)->print();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1767 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1768 #endif //PRODUCT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1769 };
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1770
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1771 bool nmethod::detect_scavenge_root_oops() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1772 DetectScavengeRoot detect_scavenge_root;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1773 NOT_PRODUCT(if (TraceScavenge) detect_scavenge_root._print_nm = this);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1774 oops_do(&detect_scavenge_root);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1775 return detect_scavenge_root.detected_scavenge_root();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1776 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
1777
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 // Method that knows how to preserve outgoing arguments at call. This method must be
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 // called with a frame corresponding to a Java invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 void nmethod::preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f) {
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
1781 #ifndef SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 if (!method()->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 SimpleScopeDesc ssd(this, fr.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 Bytecode_invoke* call = Bytecode_invoke_at(ssd.method(), ssd.bci());
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1135
diff changeset
1785 bool has_receiver = call->has_receiver();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 symbolOop signature = call->signature();
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1135
diff changeset
1787 fr.oops_compiled_arguments_do(signature, has_receiver, reg_map, f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 }
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
1789 #endif // !SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1791
a61af66fc99e Initial load
duke
parents:
diff changeset
1792
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 oop nmethod::embeddedOop_at(u_char* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 RelocIterator iter(this, p, p + oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 while (iter.next())
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 if (iter.type() == relocInfo::oop_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 return iter.oop_reloc()->oop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1801
a61af66fc99e Initial load
duke
parents:
diff changeset
1802
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 inline bool includes(void* p, void* from, void* to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 return from <= p && p < to;
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1806
a61af66fc99e Initial load
duke
parents:
diff changeset
1807
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 void nmethod::copy_scopes_pcs(PcDesc* pcs, int count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 assert(count >= 2, "must be sentinel values, at least");
a61af66fc99e Initial load
duke
parents:
diff changeset
1810
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 // must be sorted and unique; we do a binary search in find_pc_desc()
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 int prev_offset = pcs[0].pc_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 assert(prev_offset == PcDesc::lower_offset_limit,
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 "must start with a sentinel");
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 for (int i = 1; i < count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 int this_offset = pcs[i].pc_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 assert(this_offset > prev_offset, "offsets must be sorted");
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 prev_offset = this_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 assert(prev_offset == PcDesc::upper_offset_limit,
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 "must end with a sentinel");
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 #endif //ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1824
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1825 // Search for MethodHandle invokes and tag the nmethod.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1826 for (int i = 0; i < count; i++) {
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1827 if (pcs[i].is_method_handle_invoke()) {
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1828 set_has_method_handle_invokes(true);
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1829 break;
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1830 }
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1831 }
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
1832
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 int size = count * sizeof(PcDesc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 assert(scopes_pcs_size() >= size, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 memcpy(scopes_pcs_begin(), pcs, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1836
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 // Adjust the final sentinel downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 PcDesc* last_pc = &scopes_pcs_begin()[count-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 assert(last_pc->pc_offset() == PcDesc::upper_offset_limit, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 last_pc->set_pc_offset(instructions_size() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 for (; last_pc + 1 < scopes_pcs_end(); last_pc += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 // Fill any rounding gaps with copies of the last record.
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 last_pc[1] = last_pc[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 // The following assert could fail if sizeof(PcDesc) is not
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 // an integral multiple of oopSize (the rounding term).
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 // If it fails, change the logic to always allocate a multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // of sizeof(PcDesc), and fill unused words with copies of *last_pc.
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 assert(last_pc + 1 == scopes_pcs_end(), "must match exactly");
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1851
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 void nmethod::copy_scopes_data(u_char* buffer, int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 assert(scopes_data_size() >= size, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 memcpy(scopes_data_begin(), buffer, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1856
a61af66fc99e Initial load
duke
parents:
diff changeset
1857
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 static PcDesc* linear_search(nmethod* nm, int pc_offset, bool approximate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 PcDesc* lower = nm->scopes_pcs_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 PcDesc* upper = nm->scopes_pcs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 lower += 1; // exclude initial sentinel
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 PcDesc* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 for (PcDesc* p = lower; p < upper; p++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 NOT_PRODUCT(--nmethod_stats.pc_desc_tests); // don't count this call to match_desc
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 if (match_desc(p, pc_offset, approximate)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 if (res == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 res = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 res = (PcDesc*) badAddress;
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1876
a61af66fc99e Initial load
duke
parents:
diff changeset
1877
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 // Finds a PcDesc with real-pc equal to "pc"
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 PcDesc* nmethod::find_pc_desc_internal(address pc, bool approximate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 address base_address = instructions_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 if ((pc < base_address) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 (pc - base_address) >= (ptrdiff_t) PcDesc::upper_offset_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 return NULL; // PC is wildly out of range
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 int pc_offset = (int) (pc - base_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
1886
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 // Check the PcDesc cache if it contains the desired PcDesc
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 // (This as an almost 100% hit rate.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 PcDesc* res = _pc_desc_cache.find_pc_desc(pc_offset, approximate);
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 if (res != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 assert(res == linear_search(this, pc_offset, approximate), "cache ok");
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1894
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 // Fallback algorithm: quasi-linear search for the PcDesc
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 // Find the last pc_offset less than the given offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 // The successor must be the required match, if there is a match at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 // (Use a fixed radix to avoid expensive affine pointer arithmetic.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 PcDesc* lower = scopes_pcs_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 PcDesc* upper = scopes_pcs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 upper -= 1; // exclude final sentinel
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 if (lower >= upper) return NULL; // native method; no PcDescs at all
a61af66fc99e Initial load
duke
parents:
diff changeset
1903
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 #define assert_LU_OK \
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 /* invariant on lower..upper during the following search: */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 assert(lower->pc_offset() < pc_offset, "sanity"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 assert(upper->pc_offset() >= pc_offset, "sanity")
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 assert_LU_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1909
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 // Use the last successful return as a split point.
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 PcDesc* mid = _pc_desc_cache.last_pc_desc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 NOT_PRODUCT(++nmethod_stats.pc_desc_searches);
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 if (mid->pc_offset() < pc_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 lower = mid;
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 upper = mid;
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1918
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 // Take giant steps at first (4096, then 256, then 16, then 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 const int LOG2_RADIX = 4 /*smaller steps in debug mode:*/ debug_only(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 const int RADIX = (1 << LOG2_RADIX);
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 for (int step = (1 << (LOG2_RADIX*3)); step > 1; step >>= LOG2_RADIX) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 while ((mid = lower + step) < upper) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 assert_LU_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 NOT_PRODUCT(++nmethod_stats.pc_desc_searches);
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 if (mid->pc_offset() < pc_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 lower = mid;
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 upper = mid;
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 assert_LU_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1935
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 // Sneak up on the value with a linear search of length ~16.
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 assert_LU_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 mid = lower + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 NOT_PRODUCT(++nmethod_stats.pc_desc_searches);
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 if (mid->pc_offset() < pc_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 lower = mid;
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 upper = mid;
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 #undef assert_LU_OK
a61af66fc99e Initial load
duke
parents:
diff changeset
1949
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 if (match_desc(upper, pc_offset, approximate)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 assert(upper == linear_search(this, pc_offset, approximate), "search ok");
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 _pc_desc_cache.add_pc_desc(upper);
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 return upper;
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 assert(NULL == linear_search(this, pc_offset, approximate), "search ok");
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1959
a61af66fc99e Initial load
duke
parents:
diff changeset
1960
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 bool nmethod::check_all_dependencies() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 bool found_check = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 // wholesale check of all dependencies
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 for (Dependencies::DepStream deps(this); deps.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 if (deps.check_dependency() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 found_check = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 NOT_DEBUG(break);
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 return found_check; // tell caller if we found anything
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1972
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 bool nmethod::check_dependency_on(DepChange& changes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 // What has happened:
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 // 1) a new class dependee has been added
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 // 2) dependee and all its super classes have been marked
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 bool found_check = false; // set true if we are upset
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 for (Dependencies::DepStream deps(this); deps.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 // Evaluate only relevant dependencies.
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 if (deps.spot_check_dependency_at(changes) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 found_check = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 NOT_DEBUG(break);
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 return found_check;
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1987
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 bool nmethod::is_evol_dependent_on(klassOop dependee) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 instanceKlass *dependee_ik = instanceKlass::cast(dependee);
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 objArrayOop dependee_methods = dependee_ik->methods();
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 for (Dependencies::DepStream deps(this); deps.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 if (deps.type() == Dependencies::evol_method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 methodOop method = deps.method_argument(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 for (int j = 0; j < dependee_methods->length(); j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 if ((methodOop) dependee_methods->obj_at(j) == method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 // RC_TRACE macro has an embedded ResourceMark
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 RC_TRACE(0x01000000,
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 ("Found evol dependency of nmethod %s.%s(%s) compile_id=%d on method %s.%s(%s)",
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 _method->method_holder()->klass_part()->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 _method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 _method->signature()->as_C_string(), compile_id(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 method->method_holder()->klass_part()->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 method->signature()->as_C_string()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 if (TraceDependencies || LogCompilation)
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 deps.log_dependency(dependee);
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2014
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 // Called from mark_for_deoptimization, when dependee is invalidated.
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 bool nmethod::is_dependent_on_method(methodOop dependee) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 for (Dependencies::DepStream deps(this); deps.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 if (deps.type() != Dependencies::evol_method)
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 methodOop method = deps.method_argument(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 if (method == dependee) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2025
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 bool nmethod::is_patchable_at(address instr_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 assert (code_contains(instr_addr), "wrong nmethod used");
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 if (is_zombie()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 // a zombie may never be patched
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2035
a61af66fc99e Initial load
duke
parents:
diff changeset
2036
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 address nmethod::continuation_for_implicit_exception(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 // Exception happened outside inline-cache check code => we are inside
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 // an active nmethod => use cpc to determine a return address
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 int exception_offset = pc - instructions_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 int cont_offset = ImplicitExceptionTable(this).at( exception_offset );
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 if (cont_offset == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 Thread* thread = ThreadLocalStorage::get_thread_slow();
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 ResetNoHandleMark rnm; // Might be called from LEAF/QUICK ENTRY
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 CodeBlob* cb = CodeCache::find_blob(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 assert(cb != NULL && cb == this, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 tty->print_cr("implicit exception happened at " INTPTR_FORMAT, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 method()->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 print_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 print_pcs();
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 #endif
1250
3f5b7efb9642 6920293: OptimizeStringConcat causing core dumps
never
parents: 1206
diff changeset
2057 if (cont_offset == 0) {
3f5b7efb9642 6920293: OptimizeStringConcat causing core dumps
never
parents: 1206
diff changeset
2058 // Let the normal error handling report the exception
3f5b7efb9642 6920293: OptimizeStringConcat causing core dumps
never
parents: 1206
diff changeset
2059 return NULL;
3f5b7efb9642 6920293: OptimizeStringConcat causing core dumps
never
parents: 1206
diff changeset
2060 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 return instructions_begin() + cont_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2063
a61af66fc99e Initial load
duke
parents:
diff changeset
2064
a61af66fc99e Initial load
duke
parents:
diff changeset
2065
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 void nmethod_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 // make sure you didn't forget to adjust the filler fields
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 assert(sizeof(nmethod) % oopSize == 0, "nmethod size must be multiple of a word");
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2070
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 //-------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2073
a61af66fc99e Initial load
duke
parents:
diff changeset
2074
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 // QQQ might we make this work from a frame??
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 nmethodLocker::nmethodLocker(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 CodeBlob* cb = CodeCache::find_blob(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 guarantee(cb != NULL && cb->is_nmethod(), "bad pc for a nmethod found");
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 _nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 lock_nmethod(_nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2082
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 void nmethodLocker::lock_nmethod(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 if (nm == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 Atomic::inc(&nm->_lock_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 guarantee(!nm->is_zombie(), "cannot lock a zombie method");
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2088
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 void nmethodLocker::unlock_nmethod(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 if (nm == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 Atomic::dec(&nm->_lock_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 guarantee(nm->_lock_count >= 0, "unmatched nmethod lock/unlock");
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2094
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2095
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2096 // -----------------------------------------------------------------------------
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2097 // nmethod::get_deopt_original_pc
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2098 //
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2099 // Return the original PC for the given PC if:
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2100 // (a) the given PC belongs to a nmethod and
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2101 // (b) it is a deopt PC
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2102 address nmethod::get_deopt_original_pc(const frame* fr) {
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2103 if (fr->cb() == NULL) return NULL;
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2104
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2105 nmethod* nm = fr->cb()->as_nmethod_or_null();
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2106 if (nm != NULL && nm->is_deopt_pc(fr->pc()))
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2107 return nm->get_original_pc(fr);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2108
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2109 return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2111
a61af66fc99e Initial load
duke
parents:
diff changeset
2112
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 // -----------------------------------------------------------------------------
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2114 // MethodHandle
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2115
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2116 bool nmethod::is_method_handle_return(address return_pc) {
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2117 if (!has_method_handle_invokes()) return false;
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2118 PcDesc* pd = pc_desc_at(return_pc);
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2119 if (pd == NULL)
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2120 return false;
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2121 return pd->is_method_handle_invoke();
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2122 }
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2123
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2124
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
2125 // -----------------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 // Verification
a61af66fc99e Initial load
duke
parents:
diff changeset
2127
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2128 class VerifyOopsClosure: public OopClosure {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2129 nmethod* _nm;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2130 bool _ok;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2131 public:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2132 VerifyOopsClosure(nmethod* nm) : _nm(nm), _ok(true) { }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2133 bool ok() { return _ok; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2134 virtual void do_oop(oop* p) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2135 if ((*p) == NULL || (*p)->is_oop()) return;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2136 if (_ok) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2137 _nm->print_nmethod(true);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2138 _ok = false;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2139 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2140 tty->print_cr("*** non-oop "PTR_FORMAT" found at "PTR_FORMAT" (offset %d)",
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2141 (intptr_t)(*p), (intptr_t)p, (int)((intptr_t)p - (intptr_t)_nm));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2142 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2143 virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2144 };
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2145
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 void nmethod::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2147
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 // Hmm. OSR methods can be deopted but not marked as zombie or not_entrant
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 // seems odd.
a61af66fc99e Initial load
duke
parents:
diff changeset
2150
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 if( is_zombie() || is_not_entrant() )
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2153
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 // Make sure all the entry points are correctly aligned for patching.
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 NativeJump::check_verified_entry_alignment(entry_point(), verified_entry_point());
a61af66fc99e Initial load
duke
parents:
diff changeset
2156
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 assert(method()->is_oop(), "must be valid");
a61af66fc99e Initial load
duke
parents:
diff changeset
2158
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2160
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 if (!CodeCache::contains(this)) {
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1489
diff changeset
2162 fatal(err_msg("nmethod at " INTPTR_FORMAT " not in zone", this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2164
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 if(is_native_method() )
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2167
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 nmethod* nm = CodeCache::find_nmethod(verified_entry_point());
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 if (nm != this) {
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1489
diff changeset
2170 fatal(err_msg("findNMethod did not find this nmethod (" INTPTR_FORMAT ")",
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1489
diff changeset
2171 this));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2173
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 for (PcDesc* p = scopes_pcs_begin(); p < scopes_pcs_end(); p++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 if (! p->verify(this)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 tty->print_cr("\t\tin nmethod at " INTPTR_FORMAT " (pcs)", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2179
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2180 VerifyOopsClosure voc(this);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2181 oops_do(&voc);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2182 assert(voc.ok(), "embedded oops must be OK");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2183 verify_scavenge_root_oops();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2184
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 verify_scopes();
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2187
a61af66fc99e Initial load
duke
parents:
diff changeset
2188
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 void nmethod::verify_interrupt_point(address call_site) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 // This code does not work in release mode since
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 // owns_lock only is available in debug mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 CompiledIC* ic = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 Thread *cur = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 if (CompiledIC_lock->owner() == cur ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 ((cur->is_VM_thread() || cur->is_ConcurrentGC_thread()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 SafepointSynchronize::is_at_safepoint())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 ic = CompiledIC_at(call_site);
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 MutexLocker ml_verify (CompiledIC_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 ic = CompiledIC_at(call_site);
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 PcDesc* pd = pc_desc_at(ic->end_of_call());
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 assert(pd != NULL, "PcDesc must exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 for (ScopeDesc* sd = new ScopeDesc(this, pd->scope_decode_offset(),
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 1250
diff changeset
2206 pd->obj_decode_offset(), pd->should_reexecute(),
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 1250
diff changeset
2207 pd->return_oop());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 !sd->is_top(); sd = sd->sender()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 sd->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2212
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 void nmethod::verify_scopes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 if( !method() ) return; // Runtime stubs have no scope
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 if (method()->is_native()) return; // Ignore stub methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 // iterate through all interrupt point
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 // and verify the debug information is valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 RelocIterator iter((nmethod*)this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 address stub = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 switch (iter.type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 case relocInfo::virtual_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 verify_interrupt_point(iter.addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 case relocInfo::opt_virtual_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 stub = iter.opt_virtual_call_reloc()->static_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 verify_interrupt_point(iter.addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 case relocInfo::static_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 stub = iter.static_call_reloc()->static_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 //verify_interrupt_point(iter.addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 case relocInfo::runtime_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 address destination = iter.reloc()->value();
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 // Right now there is no way to find out which entries support
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 // an interrupt point. It would be nice if we had this
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 // information in a table.
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 assert(stub == NULL || stub_contains(stub), "static call stub outside stub section");
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2243
a61af66fc99e Initial load
duke
parents:
diff changeset
2244
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 // -----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2248
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2249 class DebugScavengeRoot: public OopClosure {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2250 nmethod* _nm;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2251 bool _ok;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2252 public:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2253 DebugScavengeRoot(nmethod* nm) : _nm(nm), _ok(true) { }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2254 bool ok() { return _ok; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2255 virtual void do_oop(oop* p) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2256 if ((*p) == NULL || !(*p)->is_scavengable()) return;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2257 if (_ok) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2258 _nm->print_nmethod(true);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2259 _ok = false;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2260 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2261 tty->print_cr("*** non-perm oop "PTR_FORMAT" found at "PTR_FORMAT" (offset %d)",
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2262 (intptr_t)(*p), (intptr_t)p, (int)((intptr_t)p - (intptr_t)_nm));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2263 (*p)->print();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2264 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2265 virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2266 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2267
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2268 void nmethod::verify_scavenge_root_oops() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2269 if (!on_scavenge_root_list()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2270 // Actually look inside, to verify the claim that it's clean.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2271 DebugScavengeRoot debug_scavenge_root(this);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2272 oops_do(&debug_scavenge_root);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2273 if (!debug_scavenge_root.ok())
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2274 fatal("found an unadvertised bad non-perm oop in the code cache");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2276 assert(scavenge_root_not_marked(), "");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2278
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2279 #endif // PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2280
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 // Printing operations
a61af66fc99e Initial load
duke
parents:
diff changeset
2282
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 void nmethod::print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 ttyLocker ttyl; // keep the following output all in one block
a61af66fc99e Initial load
duke
parents:
diff changeset
2286
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 tty->print("Compiled ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2288
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 if (is_compiled_by_c1()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 tty->print("(c1) ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 } else if (is_compiled_by_c2()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 tty->print("(c2) ");
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
2293 } else if (is_compiled_by_shark()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1691
diff changeset
2294 tty->print("(shark) ");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 tty->print("(nm) ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2298
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 print_on(tty, "nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 tty->print("((nmethod*) "INTPTR_FORMAT ") ", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 tty->print(" for method " INTPTR_FORMAT , (address)method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 tty->print(" { ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 if (is_in_use()) tty->print("in_use ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 if (is_not_entrant()) tty->print("not_entrant ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 if (is_zombie()) tty->print("zombie ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 if (is_unloaded()) tty->print("unloaded ");
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 931
diff changeset
2309 if (on_scavenge_root_list()) tty->print("scavenge_root ");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 tty->print_cr("}:");
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 if (size () > 0) tty->print_cr(" total in heap [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 (address)this,
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 (address)this + size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 if (relocation_size () > 0) tty->print_cr(" relocation [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 relocation_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 relocation_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 relocation_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 if (code_size () > 0) tty->print_cr(" main code [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 code_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 code_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 if (stub_size () > 0) tty->print_cr(" stub code [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 stub_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 stub_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 stub_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 if (consts_size () > 0) tty->print_cr(" constants [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 consts_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 consts_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 consts_size());
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
2332 if (oops_size () > 0) tty->print_cr(" oops [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
2333 oops_begin(),
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
2334 oops_end(),
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
2335 oops_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 if (scopes_data_size () > 0) tty->print_cr(" scopes data [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 scopes_data_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 scopes_data_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 scopes_data_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 if (scopes_pcs_size () > 0) tty->print_cr(" scopes pcs [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 scopes_pcs_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 scopes_pcs_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 scopes_pcs_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 if (dependencies_size () > 0) tty->print_cr(" dependencies [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 dependencies_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 dependencies_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 dependencies_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 if (handler_table_size() > 0) tty->print_cr(" handler table [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 handler_table_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 handler_table_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 handler_table_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 if (nul_chk_table_size() > 0) tty->print_cr(" nul chk table [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 nul_chk_table_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 nul_chk_table_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 nul_chk_table_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 if (oops_size () > 0) tty->print_cr(" oops [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 oops_begin(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 oops_end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 oops_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2361
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2362 void nmethod::print_code() {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2363 HandleMark hm;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2364 ResourceMark m;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2365 Disassembler::decode(this);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2366 }
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2367
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2368
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2369 #ifndef PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2370
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 void nmethod::print_scopes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 // Find the first pc desc for all scopes in the code and print it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 for (PcDesc* p = scopes_pcs_begin(); p < scopes_pcs_end(); p++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 if (p->scope_decode_offset() == DebugInformationRecorder::serialized_null)
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
2377
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 ScopeDesc* sd = scope_desc_at(p->real_pc(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 sd->print_on(tty, p);
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2382
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 void nmethod::print_dependencies() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 ttyLocker ttyl; // keep the following output all in one block
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 tty->print_cr("Dependencies:");
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 for (Dependencies::DepStream deps(this); deps.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 deps.print_dependency();
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 klassOop ctxk = deps.context_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 if (ctxk != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 Klass* k = Klass::cast(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 if (k->oop_is_instance() && ((instanceKlass*)k)->is_dependent_nmethod(this)) {
30
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
2393 tty->print_cr(" [nmethod<=klass]%s", k->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 deps.log_dependency(); // put it into the xml log also
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2399
a61af66fc99e Initial load
duke
parents:
diff changeset
2400
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 void nmethod::print_relocations() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 ResourceMark m; // in case methods get printed via the debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 tty->print_cr("relocations:");
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 RelocIterator iter(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 iter.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 if (UseRelocIndex) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 jint* index_end = (jint*)relocation_end() - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 jint index_size = *index_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 jint* index_start = (jint*)( (address)index_end - index_size );
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 tty->print_cr(" index @" INTPTR_FORMAT ": index_size=%d", index_start, index_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 if (index_size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 jint* ip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 for (ip = index_start; ip+2 <= index_end; ip += 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 tty->print_cr(" (%d %d) addr=" INTPTR_FORMAT " @" INTPTR_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 ip[0],
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 ip[1],
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 header_end()+ip[0],
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 relocation_begin()-1+ip[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 for (; ip < index_end; ip++)
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 tty->print_cr(" (%d ?)", ip[0]);
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 tty->print_cr(" @" INTPTR_FORMAT ": index_size=%d", ip, *ip++);
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 tty->print_cr("reloc_end @" INTPTR_FORMAT ":", ip);
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2426
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 void nmethod::print_pcs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 ResourceMark m; // in case methods get printed via debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 tty->print_cr("pc-bytecode offsets:");
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 for (PcDesc* p = scopes_pcs_begin(); p < scopes_pcs_end(); p++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 p->print(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2435
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2436 #endif // PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2437
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 const char* nmethod::reloc_string_for(u_char* begin, u_char* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 RelocIterator iter(this, begin, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 bool have_one = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 have_one = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 switch (iter.type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 case relocInfo::none: return "no_reloc";
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 case relocInfo::oop_type: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 oop_Relocation* r = iter.oop_reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 oop obj = r->oop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 st.print("oop(");
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 if (obj == NULL) st.print("NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 else obj->print_value_on(&st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 st.print(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 return st.as_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 case relocInfo::virtual_call_type: return "virtual_call";
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 case relocInfo::opt_virtual_call_type: return "optimized virtual_call";
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 case relocInfo::static_call_type: return "static_call";
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 case relocInfo::static_stub_type: return "static_stub";
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 case relocInfo::runtime_call_type: return "runtime_call";
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 case relocInfo::external_word_type: return "external_word";
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 case relocInfo::internal_word_type: return "internal_word";
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 case relocInfo::section_word_type: return "section_word";
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 case relocInfo::poll_type: return "poll";
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 case relocInfo::poll_return_type: return "poll_return";
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 case relocInfo::type_mask: return "type_bit_mask";
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 return have_one ? "other" : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2470
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 // Return a the last scope in (begin..end]
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 ScopeDesc* nmethod::scope_desc_in(address begin, address end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 PcDesc* p = pc_desc_near(begin+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 if (p != NULL && p->real_pc(this) <= end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 return new ScopeDesc(this, p->scope_decode_offset(),
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 1250
diff changeset
2476 p->obj_decode_offset(), p->should_reexecute(),
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 1250
diff changeset
2477 p->return_oop());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2481
1155
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2482 void nmethod::print_nmethod_labels(outputStream* stream, address block_begin) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2483 if (block_begin == entry_point()) stream->print_cr("[Entry Point]");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2484 if (block_begin == verified_entry_point()) stream->print_cr("[Verified Entry Point]");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2485 if (block_begin == exception_begin()) stream->print_cr("[Exception Handler]");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2486 if (block_begin == stub_begin()) stream->print_cr("[Stub Code]");
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
2487 if (block_begin == deopt_handler_begin()) stream->print_cr("[Deopt Handler Code]");
1691
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1644
diff changeset
2488
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1644
diff changeset
2489 if (has_method_handle_invokes())
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1644
diff changeset
2490 if (block_begin == deopt_mh_handler_begin()) stream->print_cr("[Deopt MH Handler Code]");
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1644
diff changeset
2491
1155
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2492 if (block_begin == consts_begin()) stream->print_cr("[Constants]");
1691
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1644
diff changeset
2493
1155
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2494 if (block_begin == entry_point()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2495 methodHandle m = method();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2496 if (m.not_null()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2497 stream->print(" # ");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2498 m->print_value_on(stream);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2499 stream->cr();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2500 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2501 if (m.not_null() && !is_osr_method()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2502 ResourceMark rm;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2503 int sizeargs = m->size_of_parameters();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2504 BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sizeargs);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2505 VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, sizeargs);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2506 {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2507 int sig_index = 0;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2508 if (!m->is_static())
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2509 sig_bt[sig_index++] = T_OBJECT; // 'this'
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2510 for (SignatureStream ss(m->signature()); !ss.at_return_type(); ss.next()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2511 BasicType t = ss.type();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2512 sig_bt[sig_index++] = t;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2513 if (type2size[t] == 2) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2514 sig_bt[sig_index++] = T_VOID;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2515 } else {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2516 assert(type2size[t] == 1, "size is 1 or 2");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2517 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2518 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2519 assert(sig_index == sizeargs, "");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2520 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2521 const char* spname = "sp"; // make arch-specific?
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2522 intptr_t out_preserve = SharedRuntime::java_calling_convention(sig_bt, regs, sizeargs, false);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2523 int stack_slot_offset = this->frame_size() * wordSize;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2524 int tab1 = 14, tab2 = 24;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2525 int sig_index = 0;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2526 int arg_index = (m->is_static() ? 0 : -1);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2527 bool did_old_sp = false;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2528 for (SignatureStream ss(m->signature()); !ss.at_return_type(); ) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2529 bool at_this = (arg_index == -1);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2530 bool at_old_sp = false;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2531 BasicType t = (at_this ? T_OBJECT : ss.type());
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2532 assert(t == sig_bt[sig_index], "sigs in sync");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2533 if (at_this)
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2534 stream->print(" # this: ");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2535 else
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2536 stream->print(" # parm%d: ", arg_index);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2537 stream->move_to(tab1);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2538 VMReg fst = regs[sig_index].first();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2539 VMReg snd = regs[sig_index].second();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2540 if (fst->is_reg()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2541 stream->print("%s", fst->name());
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2542 if (snd->is_valid()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2543 stream->print(":%s", snd->name());
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2544 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2545 } else if (fst->is_stack()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2546 int offset = fst->reg2stack() * VMRegImpl::stack_slot_size + stack_slot_offset;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2547 if (offset == stack_slot_offset) at_old_sp = true;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2548 stream->print("[%s+0x%x]", spname, offset);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2549 } else {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2550 stream->print("reg%d:%d??", (int)(intptr_t)fst, (int)(intptr_t)snd);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2551 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2552 stream->print(" ");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2553 stream->move_to(tab2);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2554 stream->print("= ");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2555 if (at_this) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2556 m->method_holder()->print_value_on(stream);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2557 } else {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2558 bool did_name = false;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2559 if (!at_this && ss.is_object()) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2560 symbolOop name = ss.as_symbol_or_null();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2561 if (name != NULL) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2562 name->print_value_on(stream);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2563 did_name = true;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2564 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2565 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2566 if (!did_name)
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2567 stream->print("%s", type2name(t));
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2568 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2569 if (at_old_sp) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2570 stream->print(" (%s of caller)", spname);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2571 did_old_sp = true;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2572 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2573 stream->cr();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2574 sig_index += type2size[t];
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2575 arg_index += 1;
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2576 if (!at_this) ss.next();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2577 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2578 if (!did_old_sp) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2579 stream->print(" # ");
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2580 stream->move_to(tab1);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2581 stream->print("[%s+0x%x]", spname, stack_slot_offset);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2582 stream->print(" (%s of caller)", spname);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2583 stream->cr();
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2584 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2585 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2586 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2587 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
2588
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 void nmethod::print_code_comment_on(outputStream* st, int column, u_char* begin, u_char* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 // First, find an oopmap in (begin, end].
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 // We use the odd half-closed interval so that oop maps and scope descs
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 // which are tied to the byte after a call are printed with the call itself.
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 address base = instructions_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 OopMapSet* oms = oop_maps();
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 if (oms != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 for (int i = 0, imax = oms->size(); i < imax; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 OopMap* om = oms->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 address pc = base + om->offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 if (pc > begin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 if (pc <= end) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2601 st->move_to(column);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2602 st->print("; ");
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2603 om->print_on(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 }
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2609
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2610 // Print any debug info present at this pc.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 ScopeDesc* sd = scope_desc_in(begin, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 if (sd != NULL) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2613 st->move_to(column);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 if (sd->bci() == SynchronizationEntryBCI) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 st->print(";*synchronization entry");
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 if (sd->method().is_null()) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2618 st->print("method is NULL");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 } else if (sd->method()->is_native()) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2620 st->print("method is native");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 address bcp = sd->method()->bcp_from(sd->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 Bytecodes::Code bc = Bytecodes::java_code_at(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 st->print(";*%s", Bytecodes::name(bc));
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 switch (bc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 case Bytecodes::_invokevirtual:
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 case Bytecodes::_invokespecial:
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 case Bytecodes::_invokestatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 case Bytecodes::_invokeinterface:
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 Bytecode_invoke* invoke = Bytecode_invoke_at(sd->method(), sd->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 if (invoke->name() != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 invoke->name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 else
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 st->print("<UNKNOWN>");
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 case Bytecodes::_getfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 case Bytecodes::_putfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 {
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2644 Bytecode_field* field = Bytecode_field_at(sd->method(), sd->bci());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 st->print(" ");
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2646 if (field->name() != NULL)
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2647 field->name()->print_symbol_on(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 else
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 st->print("<UNKNOWN>");
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 }
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2654
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 // Print all scopes
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 for (;sd != NULL; sd = sd->sender()) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2657 st->move_to(column);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 st->print("; -");
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 if (sd->method().is_null()) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2660 st->print("method is NULL");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 sd->method()->print_short_name(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 int lineno = sd->method()->line_number_from_bci(sd->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 if (lineno != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 st->print("@%d (line %d)", sd->bci(), lineno);
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 st->print("@%d", sd->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 // Print relocation information
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 const char* str = reloc_string_for(begin, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 if (str != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 if (sd != NULL) st->cr();
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2678 st->move_to(column);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 st->print("; {%s}", str);
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 int cont_offset = ImplicitExceptionTable(this).at(begin - instructions_begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 if (cont_offset != 0) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2683 st->move_to(column);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 st->print("; implicit exception: dispatches to " INTPTR_FORMAT, instructions_begin() + cont_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2686
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2688
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2689 #ifndef PRODUCT
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 30
diff changeset
2690
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 void nmethod::print_value_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 print_on(st, "nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2694
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 void nmethod::print_calls(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 RelocIterator iter(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 switch (iter.type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 case relocInfo::virtual_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 case relocInfo::opt_virtual_call_type: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 VerifyMutexLocker mc(CompiledIC_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 CompiledIC_at(iter.reloc())->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 case relocInfo::static_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 st->print_cr("Static call at " INTPTR_FORMAT, iter.reloc()->addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 compiledStaticCall_at(iter.reloc())->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2712
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 void nmethod::print_handler_table() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 ExceptionHandlerTable(this).print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2716
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 void nmethod::print_nul_chk_table() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 ImplicitExceptionTable(this).print(instructions_begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2720
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 void nmethod::print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 if (xtty != NULL) xtty->head("statistics type='nmethod'");
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 nmethod_stats.print_native_nmethod_stats();
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 nmethod_stats.print_nmethod_stats();
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 DebugInformationRecorder::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 nmethod_stats.print_pc_stats();
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 Dependencies::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 if (xtty != NULL) xtty->tail("statistics");
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2731
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 #endif // PRODUCT