annotate src/share/vm/code/nmethod.cpp @ 3992:d1bdeef3e3e2

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