annotate src/share/vm/ci/ciMethod.cpp @ 6972:bd7a7ce2e264

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents 18fb7da42534
children bb33c6fdcf0d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
2 * Copyright (c) 1999, 2012, 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: 1251
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1251
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: 1251
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: 1828
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
26 #include "ci/ciCallProfile.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
27 #include "ci/ciExceptionHandler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
28 #include "ci/ciInstanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
29 #include "ci/ciMethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
30 #include "ci/ciMethodBlocks.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
31 #include "ci/ciMethodData.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
32 #include "ci/ciStreams.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
33 #include "ci/ciSymbol.hpp"
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
34 #include "ci/ciReplay.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
35 #include "ci/ciUtilities.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
36 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
37 #include "compiler/abstractCompiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
38 #include "compiler/compilerOracle.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
39 #include "compiler/methodLiveness.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
40 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
41 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
42 #include "interpreter/oopMapCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
43 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
44 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
45 #include "oops/generateOopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
46 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
47 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
48 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
49 #include "utilities/bitMap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
50 #include "utilities/xmlstream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
51 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
52 #include "ci/bcEscapeAnalyzer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
53 #include "ci/ciTypeFlow.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
54 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
55 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
56 #ifdef SHARK
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
57 #include "ci/ciTypeFlow.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
58 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1828
diff changeset
59 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // ciMethod
a61af66fc99e Initial load
duke
parents:
diff changeset
62 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
63 // This class represents a Method* in the HotSpot virtual
0
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // ciMethod::ciMethod
a61af66fc99e Initial load
duke
parents:
diff changeset
69 //
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Loaded method.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
71 ciMethod::ciMethod(methodHandle h_m) : ciMetadata(h_m()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 assert(h_m() != NULL, "no null method");
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // These fields are always filled in in loaded methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _flags = ciFlags(h_m()->access_flags());
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // Easy to compute, so fill them in now.
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _max_stack = h_m()->max_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _max_locals = h_m()->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
80 _code_size = h_m()->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _intrinsic_id = h_m()->intrinsic_id();
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
82 _handler_count = h_m()->exception_table_length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _uses_monitors = h_m()->access_flags().has_monitor_bytecodes();
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _balanced_monitors = !_uses_monitors || h_m()->access_flags().is_monitor_matching();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
85 _is_c1_compilable = !h_m()->is_not_c1_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
86 _is_c2_compilable = !h_m()->is_not_c2_compilable();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Lazy fields, filled in on demand. Require allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _exception_handlers = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _liveness = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _method_blocks = NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
92 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
93 _flow = NULL;
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
94 _bcea = NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
95 #endif // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 710
diff changeset
97 ciEnv *env = CURRENT_ENV;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
98 if (env->jvmti_can_hotswap_or_post_breakpoint() && can_be_compiled()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // 6328518 check hotswap conditions under the right lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
100 MutexLocker locker(Compile_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 if (Dependencies::check_evol_method(h_m()) != NULL) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
102 _is_c1_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
103 _is_c2_compilable = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
109 if (h_m()->method_holder()->is_linked()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 _can_be_statically_bound = h_m()->can_be_statically_bound();
a61af66fc99e Initial load
duke
parents:
diff changeset
111 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Have to use a conservative value in this case.
a61af66fc99e Initial load
duke
parents:
diff changeset
113 _can_be_statically_bound = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Adjust the definition of this condition to be more useful:
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // %%% take these conditions into account in vtable generation
a61af66fc99e Initial load
duke
parents:
diff changeset
118 if (!_can_be_statically_bound && h_m()->is_private())
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _can_be_statically_bound = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (_can_be_statically_bound && h_m()->is_abstract())
a61af66fc99e Initial load
duke
parents:
diff changeset
121 _can_be_statically_bound = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // generating _signature may allow GC and therefore move m.
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // These fields are always filled in.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
125 _name = env->get_symbol(h_m()->name());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
126 _holder = env->get_instance_klass(h_m()->method_holder());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
127 ciSymbol* sig_symbol = env->get_symbol(h_m()->signature());
3785
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 2357
diff changeset
128 constantPoolHandle cpool = h_m()->constants();
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 2357
diff changeset
129 _signature = new (env->arena()) ciSignature(_holder, cpool, sig_symbol);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 _method_data = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Take a snapshot of these values, so they will be commensurate with the MDO.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
132 if (ProfileInterpreter || TieredCompilation) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 int invcnt = h_m()->interpreter_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // if the value overflowed report it as max int
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _interpreter_invocation_count = invcnt < 0 ? max_jint : invcnt ;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _interpreter_throwout_count = h_m()->interpreter_throwout_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
137 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _interpreter_invocation_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 _interpreter_throwout_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 if (_interpreter_invocation_count == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
142 _interpreter_invocation_count = 1;
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
143 _instructions_size = -1;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
144 #ifdef ASSERT
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
145 if (ReplayCompiles) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
146 ciReplay::initialize(this);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
147 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
148 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // ciMethod::ciMethod
a61af66fc99e Initial load
duke
parents:
diff changeset
154 //
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Unloaded method.
a61af66fc99e Initial load
duke
parents:
diff changeset
156 ciMethod::ciMethod(ciInstanceKlass* holder,
4001
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
157 ciSymbol* name,
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
158 ciSymbol* signature,
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
159 ciInstanceKlass* accessor) :
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
160 ciMetadata((Metadata*)NULL),
4001
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
161 _name( name),
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
162 _holder( holder),
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
163 _intrinsic_id( vmIntrinsics::_none),
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
164 _liveness( NULL),
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
165 _can_be_statically_bound(false),
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
166 _method_blocks( NULL),
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
167 _method_data( NULL)
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
168 #if defined(COMPILER2) || defined(SHARK)
4001
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
169 ,
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
170 _flow( NULL),
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
171 _bcea( NULL),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
172 _instructions_size(-1)
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
173 #endif // COMPILER2 || SHARK
4001
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
174 {
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
175 // Usually holder and accessor are the same type but in some cases
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
176 // the holder has the wrong class loader (e.g. invokedynamic call
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
177 // sites) so we pass the accessor.
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
178 _signature = new (CURRENT_ENV->arena()) ciSignature(accessor, constantPoolHandle(), signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // ciMethod::load_code
a61af66fc99e Initial load
duke
parents:
diff changeset
184 //
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Load the bytecodes and exception handler table for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 void ciMethod::load_code() {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 assert(is_loaded(), "only loaded methods have code");
a61af66fc99e Initial load
duke
parents:
diff changeset
189
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
190 Method* me = get_Method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 Arena* arena = CURRENT_THREAD_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Load the bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 _code = (address)arena->Amalloc(code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
195 memcpy(_code, me->code_base(), code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Revert any breakpoint bytecodes in ci's copy
27
1f530c629c7d 6498878: client compiler crashes on windows when dealing with breakpoint instructions
kvn
parents: 0
diff changeset
198 if (me->number_of_breakpoints() > 0) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
199 BreakpointInfo* bp = me->method_holder()->breakpoints();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200 for (; bp != NULL; bp = bp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (bp->match(me)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 code_at_put(bp->bci(), bp->orig_bytecode());
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // And load the exception table.
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
208 ExceptionTable exc_table(me);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Allocate one extra spot in our list of exceptions. This
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // last entry will be used to represent the possibility that
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // an exception escapes the method. See ciExceptionHandlerStream
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
214 _exception_handlers =
a61af66fc99e Initial load
duke
parents:
diff changeset
215 (ciExceptionHandler**)arena->Amalloc(sizeof(ciExceptionHandler*)
a61af66fc99e Initial load
duke
parents:
diff changeset
216 * (_handler_count + 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (_handler_count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 for (int i=0; i<_handler_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 _exception_handlers[i] = new (arena) ciExceptionHandler(
a61af66fc99e Initial load
duke
parents:
diff changeset
220 holder(),
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
221 /* start */ exc_table.start_pc(i),
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
222 /* limit */ exc_table.end_pc(i),
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
223 /* goto pc */ exc_table.handler_pc(i),
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
224 /* cp index */ exc_table.catch_type_index(i));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Put an entry at the end of our list to represent the possibility
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // of exceptional exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 _exception_handlers[_handler_count] =
a61af66fc99e Initial load
duke
parents:
diff changeset
231 new (arena) ciExceptionHandler(holder(), 0, code_size(), -1, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (CIPrintMethodCodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // ciMethod::has_linenumber_table
a61af66fc99e Initial load
duke
parents:
diff changeset
241 //
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // length unknown until decompression
a61af66fc99e Initial load
duke
parents:
diff changeset
243 bool ciMethod::has_linenumber_table() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
246 return get_Method()->has_linenumber_table();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // ciMethod::compressed_linenumber_table
a61af66fc99e Initial load
duke
parents:
diff changeset
252 u_char* ciMethod::compressed_linenumber_table() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
254 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
255 return get_Method()->compressed_linenumber_table();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // ciMethod::line_number_from_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
261 int ciMethod::line_number_from_bci(int bci) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
263 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
264 return get_Method()->line_number_from_bci(bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
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 // ciMethod::vtable_index
a61af66fc99e Initial load
duke
parents:
diff changeset
270 //
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // Get the position of this method's entry in the vtable, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
272 int ciMethod::vtable_index() {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
274 assert(holder()->is_linked(), "must be linked");
a61af66fc99e Initial load
duke
parents:
diff changeset
275 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
276 return get_Method()->vtable_index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
280 #ifdef SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
281 // ------------------------------------------------------------------
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
282 // ciMethod::itable_index
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
283 //
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
284 // Get the position of this method's entry in the itable, if any.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
285 int ciMethod::itable_index() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
286 check_is_loaded();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
287 assert(holder()->is_linked(), "must be linked");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
288 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
289 return klassItable::compute_itable_index(get_Method());
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
290 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
291 #endif // SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
292
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
293
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // ciMethod::native_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
296 //
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Get the address of this method's native code, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
298 address ciMethod::native_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
300 assert(flags().is_native(), "must be native method");
a61af66fc99e Initial load
duke
parents:
diff changeset
301 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
302 Method* method = get_Method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
303 address entry = method->native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
304 assert(entry != NULL, "must be valid entry point");
a61af66fc99e Initial load
duke
parents:
diff changeset
305 return entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // ciMethod::interpreter_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
311 //
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Get the entry point for running this method in the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 address ciMethod::interpreter_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
316 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 return Interpreter::entry_for_method(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // ciMethod::uses_balanced_monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
323 //
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // Does this method use monitors in a strict stack-disciplined manner?
a61af66fc99e Initial load
duke
parents:
diff changeset
325 bool ciMethod::has_balanced_monitors() {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if (_balanced_monitors) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Analyze the method to see if monitors are used properly.
a61af66fc99e Initial load
duke
parents:
diff changeset
330 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
331 methodHandle method(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 assert(method->has_monitor_bytecodes(), "should have checked this");
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Check to see if a previous compilation computed the
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // monitor-matching analysis.
a61af66fc99e Initial load
duke
parents:
diff changeset
336 if (method->guaranteed_monitor_matching()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 _balanced_monitors = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 GeneratePairingInfo gpi(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 gpi.compute_map(CATCH);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 if (!gpi.monitor_safe()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349 method->set_guaranteed_monitor_matching();
a61af66fc99e Initial load
duke
parents:
diff changeset
350 _balanced_monitors = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 }
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // ciMethod::get_flow_analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
358 ciTypeFlow* ciMethod::get_flow_analysis() {
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
359 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
360 if (_flow == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 _flow = new (env->arena()) ciTypeFlow(env, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 _flow->do_flow();
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 return _flow;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
366 #else // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
367 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
368 return NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
369 #endif // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // ciMethod::get_osr_flow_analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
375 ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) {
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
376 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // OSR entry points are always place after a call bytecode of some sort
a61af66fc99e Initial load
duke
parents:
diff changeset
378 assert(osr_bci >= 0, "must supply valid OSR entry point");
a61af66fc99e Initial load
duke
parents:
diff changeset
379 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 ciTypeFlow* flow = new (env->arena()) ciTypeFlow(env, this, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 flow->do_flow();
a61af66fc99e Initial load
duke
parents:
diff changeset
382 return flow;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
383 #else // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
384 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 return NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
386 #endif // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // ------------------------------------------------------------------
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
390 // ciMethod::raw_liveness_at_bci
0
a61af66fc99e Initial load
duke
parents:
diff changeset
391 //
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Which local variables are live at a specific bci?
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
393 MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
394 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
395 if (_liveness == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // Create the liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
397 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 _liveness = new (arena) MethodLiveness(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
399 _liveness->compute_liveness();
a61af66fc99e Initial load
duke
parents:
diff changeset
400 }
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
401 return _liveness->get_liveness_at(bci);
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
402 }
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
403
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
404 // ------------------------------------------------------------------
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
405 // ciMethod::liveness_at_bci
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
406 //
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
407 // Which local variables are live at a specific bci? When debugging
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
408 // will return true for all locals in some cases to improve debug
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
409 // information.
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
410 MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
411 MethodLivenessResult result = raw_liveness_at_bci(bci);
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 710
diff changeset
412 if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // Keep all locals live for the user's edification and amusement.
a61af66fc99e Initial load
duke
parents:
diff changeset
414 result.at_put_range(0, result.size(), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
416 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // ciMethod::live_local_oops_at_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
420 //
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // find all the live oops in the locals array for a particular bci
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Compute what the interpreter believes by using the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // oopmap generator. This is used as a double check during osr to
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // guard against conservative result from MethodLiveness making us
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // think a dead oop is live. MethodLiveness is conservative in the
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // sense that it may consider locals to be live which cannot be live,
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // like in the case where a local could contain an oop or a primitive
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // along different paths. In that case the local must be dead when
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // those paths merge. Since the interpreter's viewpoint is used when
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // gc'ing an interpreter frame we need to use its viewpoint during
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // OSR when loading the locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 BitMap ciMethod::live_local_oops_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 InterpreterOopMap mask;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
436 OopMapCache::compute_one_oop_map(get_Method(), bci, &mask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 int mask_size = max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
438 BitMap result(mask_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 result.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
440 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 for (i = 0; i < mask_size ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (mask.is_oop(i)) result.set_bit(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // ciMethod::bci_block_start
a61af66fc99e Initial load
duke
parents:
diff changeset
451 //
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // Marks all bcis where a new basic block starts
a61af66fc99e Initial load
duke
parents:
diff changeset
453 const BitMap ciMethod::bci_block_start() {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
455 if (_liveness == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Create the liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
457 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
458 _liveness = new (arena) MethodLiveness(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 _liveness->compute_liveness();
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 return _liveness->get_bci_block_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 #endif // COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // ciMethod::call_profile_at_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
469 //
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Get the ciCallProfile for the invocation of this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // Also reports receiver types for non-call type checks (if TypeProfileCasts).
a61af66fc99e Initial load
duke
parents:
diff changeset
472 ciCallProfile ciMethod::call_profile_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 ciCallProfile result;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 if (method_data() != NULL && method_data()->is_mature()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 ciProfileData* data = method_data()->bci_to_data(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 if (data != NULL && data->is_CounterData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // Every profiled call site has a counter.
a61af66fc99e Initial load
duke
parents:
diff changeset
479 int count = data->as_CounterData()->count();
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 if (!data->is_ReceiverTypeData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 result._receiver_count[0] = 0; // that's a definite zero
a61af66fc99e Initial load
duke
parents:
diff changeset
483 } else { // ReceiverTypeData is a subclass of CounterData
a61af66fc99e Initial load
duke
parents:
diff changeset
484 ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData();
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // In addition, virtual call sites have receiver type information
a61af66fc99e Initial load
duke
parents:
diff changeset
486 int receivers_count_total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 int morphism = 0;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
488 // Precompute morphism for the possible fixup
0
a61af66fc99e Initial load
duke
parents:
diff changeset
489 for (uint i = 0; i < call->row_limit(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 ciKlass* receiver = call->receiver(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
491 if (receiver == NULL) continue;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
492 morphism++;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
493 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
494 int epsilon = 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
495 if (TieredCompilation && ProfileInterpreter) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
496 // Interpreter and C1 treat final and special invokes differently.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
497 // C1 will record a type, whereas the interpreter will just
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
498 // increment the count. Detect this case.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
499 if (morphism == 1 && count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
500 epsilon = count;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
501 count = 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
502 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
503 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
504 for (uint i = 0; i < call->row_limit(); i++) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
505 ciKlass* receiver = call->receiver(i);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
506 if (receiver == NULL) continue;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
507 int rcount = call->receiver_count(i) + epsilon;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
508 if (rcount == 0) rcount = 1; // Should be valid value
a61af66fc99e Initial load
duke
parents:
diff changeset
509 receivers_count_total += rcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // Add the receiver to result data.
a61af66fc99e Initial load
duke
parents:
diff changeset
511 result.add_receiver(receiver, rcount);
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // If we extend profiling to record methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // we will set result._method also.
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Determine call site's morphism.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
516 // The call site count is 0 with known morphism (onlt 1 or 2 receivers)
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
517 // or < 0 in the case of a type check failured for checkcast, aastore, instanceof.
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
518 // The call site count is > 0 in the case of a polymorphic virtual call.
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
519 if (morphism > 0 && morphism == result._limit) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
520 // The morphism <= MorphismLimit.
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
521 if ((morphism < ciCallProfile::MorphismLimit) ||
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
522 (morphism == ciCallProfile::MorphismLimit && count == 0)) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
523 #ifdef ASSERT
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
524 if (count > 0) {
1251
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
525 this->print_short_name(tty);
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
526 tty->print_cr(" @ bci:%d", bci);
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
527 this->print_codes();
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
528 assert(false, "this call site should not be polymorphic");
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
529 }
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
530 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531 result._morphism = morphism;
a61af66fc99e Initial load
duke
parents:
diff changeset
532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // Make the count consistent if this is a call profile. If count is
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // zero or less, presume that this is a typecheck profile and
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // do nothing. Otherwise, increase count to be the sum of all
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // receiver's counts.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
538 if (count >= 0) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
539 count += receivers_count_total;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 result._count = count;
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // Add new receiver and sort data by receiver's profile count.
a61af66fc99e Initial load
duke
parents:
diff changeset
550 void ciCallProfile::add_receiver(ciKlass* receiver, int receiver_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // Add new receiver and sort data by receiver's counts when we have space
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // for it otherwise replace the less called receiver (less called receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // is placed to the last array element which is not used).
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // First array's element contains most called receiver.
a61af66fc99e Initial load
duke
parents:
diff changeset
555 int i = _limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 for (; i > 0 && receiver_count > _receiver_count[i-1]; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
557 _receiver[i] = _receiver[i-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
558 _receiver_count[i] = _receiver_count[i-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560 _receiver[i] = receiver;
a61af66fc99e Initial load
duke
parents:
diff changeset
561 _receiver_count[i] = receiver_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
562 if (_limit < MorphismLimit) _limit++;
a61af66fc99e Initial load
duke
parents:
diff changeset
563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // ciMethod::find_monomorphic_target
a61af66fc99e Initial load
duke
parents:
diff changeset
567 //
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // Given a certain calling environment, find the monomorphic target
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // for the call. Return NULL if the call is not monomorphic in
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // its calling environment, or if there are only abstract methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // The returned method is never abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // Note: If caller uses a non-null result, it must inform dependencies
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // via assert_unique_concrete_method or assert_leaf_type.
a61af66fc99e Initial load
duke
parents:
diff changeset
574 ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
575 ciInstanceKlass* callee_holder,
a61af66fc99e Initial load
duke
parents:
diff changeset
576 ciInstanceKlass* actual_recv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 if (actual_recv->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // %%% We cannot trust interface types, yet. See bug 6312651.
a61af66fc99e Initial load
duke
parents:
diff changeset
581 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 ciMethod* root_m = resolve_invoke(caller, actual_recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 if (root_m == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // Something went wrong looking up the actual receiver method.
a61af66fc99e Initial load
duke
parents:
diff changeset
587 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589 assert(!root_m->is_abstract(), "resolve_invoke promise");
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // Make certain quick checks even if UseCHA is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
592
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // Is it private or final?
a61af66fc99e Initial load
duke
parents:
diff changeset
594 if (root_m->can_be_statically_bound()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
595 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 if (actual_recv->is_leaf_type() && actual_recv == root_m->holder()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 // Easy case. There is no other place to put a method, so don't bother
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // to go through the VM_ENTRY_MARK and all the rest.
a61af66fc99e Initial load
duke
parents:
diff changeset
601 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // Array methods (clone, hashCode, etc.) are always statically bound.
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // If we were to see an array type here, we'd return root_m.
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // However, this method processes only ciInstanceKlasses. (See 4962591.)
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // The inline_native_clone intrinsic narrows Object to T[] properly,
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // so there is no need to do the same job here.
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 if (!UseCHA) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 methodHandle target;
a61af66fc99e Initial load
duke
parents:
diff changeset
615 {
a61af66fc99e Initial load
duke
parents:
diff changeset
616 MutexLocker locker(Compile_lock);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
617 Klass* context = actual_recv->get_Klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
618 target = Dependencies::find_unique_concrete_method(context,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
619 root_m->get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 #ifndef PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
624 if (TraceDependencies && target() != NULL && target() != root_m->get_Method()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
625 tty->print("found a non-root unique target method");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
626 tty->print_cr(" context = %s", InstanceKlass::cast(actual_recv->get_Klass())->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
627 tty->print(" method = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
628 target->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
632
a61af66fc99e Initial load
duke
parents:
diff changeset
633 if (target() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
634 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
635 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
636 if (target() == root_m->get_Method()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
639 if (!root_m->is_public() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
640 !root_m->is_protected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // If we are going to reason about inheritance, it's easiest
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // if the method in question is public, protected, or private.
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // If the answer is not root_m, it is conservatively correct
a61af66fc99e Initial load
duke
parents:
diff changeset
644 // to return NULL, even if the CHA encountered irrelevant
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // methods in other packages.
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // %%% TO DO: Work out logic for package-private methods
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // with the same name but different vtable indexes.
a61af66fc99e Initial load
duke
parents:
diff changeset
648 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
650 return CURRENT_THREAD_ENV->get_method(target());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
651 }
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // ciMethod::resolve_invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
655 //
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // Given a known receiver klass, find the target for the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // Return NULL if the call has no target or the target is abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver) {
a61af66fc99e Initial load
duke
parents:
diff changeset
659 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
660 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
661
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
662 KlassHandle caller_klass (THREAD, caller->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
663 KlassHandle h_recv (THREAD, exact_receiver->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
664 KlassHandle h_resolved (THREAD, holder()->get_Klass());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
665 Symbol* h_name = name()->get_symbol();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
666 Symbol* h_signature = signature()->get_symbol();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 methodHandle m;
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // Only do exact lookup if receiver klass has been linked. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // the vtable has not been setup, and the LinkResolver will fail.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
671 if (h_recv->oop_is_array()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
672 ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
673 InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
674 if (holder()->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
676 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 if (m.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
683 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 ciMethod* result = this;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
687 if (m() != get_Method()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
688 result = CURRENT_THREAD_ENV->get_method(m());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 // Don't return abstract methods because they aren't
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // optimizable or interesting.
a61af66fc99e Initial load
duke
parents:
diff changeset
693 if (result->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // ciMethod::resolve_vtable_index
a61af66fc99e Initial load
duke
parents:
diff changeset
702 //
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // Given a known receiver klass, find the vtable index for the call.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
704 // Return Method::invalid_vtable_index if the vtable_index is unknown.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
705 int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
707
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
708 int vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // Only do lookup if receiver klass has been linked. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // the vtable has not been setup, and the LinkResolver will fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
711 if (!receiver->is_interface()
a61af66fc99e Initial load
duke
parents:
diff changeset
712 && (!receiver->is_instance_klass() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
713 receiver->as_instance_klass()->is_linked())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
715
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
716 KlassHandle caller_klass (THREAD, caller->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
717 KlassHandle h_recv (THREAD, receiver->get_Klass());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
718 Symbol* h_name = name()->get_symbol();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
719 Symbol* h_signature = signature()->get_symbol();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, h_recv, h_name, h_signature, caller_klass);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
722 if (vtable_index == Method::nonvirtual_vtable_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // A statically bound method. Return "no such index".
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
724 vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 return vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
732 // ciMethod::interpreter_call_site_count
a61af66fc99e Initial load
duke
parents:
diff changeset
733 int ciMethod::interpreter_call_site_count(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
734 if (method_data() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
736 ciProfileData* data = method_data()->bci_to_data(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
737 if (data != NULL && data->is_CounterData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 return scale_count(data->as_CounterData()->count());
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741 return -1; // unknown
a61af66fc99e Initial load
duke
parents:
diff changeset
742 }
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // Adjust a CounterData count to be commensurate with
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // interpreter_invocation_count. If the MDO exists for
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // only 25% of the time the method exists, then the
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // counts in the MDO should be scaled by 4X, so that
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // they can be usefully and stably compared against the
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // invocation counts in methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
751 int ciMethod::scale_count(int count, float prof_factor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (count > 0 && method_data() != NULL) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
753 int counter_life;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
754 int method_life = interpreter_invocation_count();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
755 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
756 // In tiered the MDO's life is measured directly, so just use the snapshotted counters
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
757 counter_life = MAX2(method_data()->invocation_count(), method_data()->backedge_count());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
758 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
759 int current_mileage = method_data()->current_mileage();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
760 int creation_mileage = method_data()->creation_mileage();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
761 counter_life = current_mileage - creation_mileage;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
762 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
763
0
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // counter_life due to backedge_counter could be > method_life
a61af66fc99e Initial load
duke
parents:
diff changeset
765 if (counter_life > method_life)
a61af66fc99e Initial load
duke
parents:
diff changeset
766 counter_life = method_life;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 if (0 < counter_life && counter_life <= method_life) {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 count = (int)((double)count * prof_factor * method_life / counter_life + 0.5);
a61af66fc99e Initial load
duke
parents:
diff changeset
769 count = (count > 0) ? count : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // ------------------------------------------------------------------
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
776 // invokedynamic support
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
777
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
778 // ------------------------------------------------------------------
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
779 // ciMethod::is_method_handle_intrinsic
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
780 //
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
781 // Return true if the method is an instance of the JVM-generated
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
782 // signature-polymorphic MethodHandle methods, _invokeBasic, _linkToVirtual, etc.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
783 bool ciMethod::is_method_handle_intrinsic() const {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
784 vmIntrinsics::ID iid = _intrinsic_id; // do not check if loaded
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
785 return (MethodHandles::is_signature_polymorphic(iid) &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
786 MethodHandles::is_signature_polymorphic_intrinsic(iid));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
787 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
788
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
789 // ------------------------------------------------------------------
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
790 // ciMethod::is_compiled_lambda_form
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
791 //
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
792 // Return true if the method is a generated MethodHandle adapter.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
793 // These are built by Java code.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
794 bool ciMethod::is_compiled_lambda_form() const {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
795 vmIntrinsics::ID iid = _intrinsic_id; // do not check if loaded
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
796 return iid == vmIntrinsics::_compiledLambdaForm;
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1137
diff changeset
797 }
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1137
diff changeset
798
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
799 // ------------------------------------------------------------------
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
800 // ciMethod::has_member_arg
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
801 //
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
802 // Return true if the method is a linker intrinsic like _linkToVirtual.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
803 // These are built by the JVM.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
804 bool ciMethod::has_member_arg() const {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
805 vmIntrinsics::ID iid = _intrinsic_id; // do not check if loaded
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
806 return (MethodHandles::is_signature_polymorphic(iid) &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
807 MethodHandles::has_member_arg(iid));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
808 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
809
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
810 // ------------------------------------------------------------------
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
811 // ciMethod::ensure_method_data
0
a61af66fc99e Initial load
duke
parents:
diff changeset
812 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
813 // Generate new MethodData* objects at compile time.
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
814 // Return true if allocation was successful or no MDO is required.
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
815 bool ciMethod::ensure_method_data(methodHandle h_m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
816 EXCEPTION_CONTEXT;
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
817 if (is_native() || is_abstract() || h_m()->is_accessor()) return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
818 if (h_m()->method_data() == NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
819 Method::build_interpreter_method_data(h_m, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
820 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
824 if (h_m()->method_data() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
825 _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
826 _method_data->load_data();
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
827 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
828 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
829 _method_data = CURRENT_ENV->get_empty_methodData();
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
830 return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // public, retroactive version
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
835 bool ciMethod::ensure_method_data() {
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
836 bool result = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 if (_method_data == NULL || _method_data->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
838 GUARDED_VM_ENTRY({
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
839 result = ensure_method_data(get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
840 });
a61af66fc99e Initial load
duke
parents:
diff changeset
841 }
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
842 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // ciMethod::method_data
a61af66fc99e Initial load
duke
parents:
diff changeset
848 //
a61af66fc99e Initial load
duke
parents:
diff changeset
849 ciMethodData* ciMethod::method_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
850 if (_method_data != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
855 Thread* my_thread = JavaThread::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
856 methodHandle h_m(my_thread, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 if (h_m()->method_data() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
859 _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
860 _method_data->load_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
861 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 _method_data = CURRENT_ENV->get_empty_methodData();
a61af66fc99e Initial load
duke
parents:
diff changeset
863 }
a61af66fc99e Initial load
duke
parents:
diff changeset
864 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
868 // ------------------------------------------------------------------
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
869 // ciMethod::method_data_or_null
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
870 // Returns a pointer to ciMethodData if MDO exists on the VM side,
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
871 // NULL otherwise.
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
872 ciMethodData* ciMethod::method_data_or_null() {
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
873 ciMethodData *md = method_data();
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
874 if (md->is_empty()) return NULL;
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
875 return md;
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
876 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // ciMethod::will_link
a61af66fc99e Initial load
duke
parents:
diff changeset
880 //
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // Will this method link in a specific calling context?
a61af66fc99e Initial load
duke
parents:
diff changeset
882 bool ciMethod::will_link(ciKlass* accessing_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
883 ciKlass* declared_method_holder,
a61af66fc99e Initial load
duke
parents:
diff changeset
884 Bytecodes::Code bc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
885 if (!is_loaded()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // Method lookup failed.
a61af66fc99e Initial load
duke
parents:
diff changeset
887 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // The link checks have been front-loaded into the get_method
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // call. This method (ciMethod::will_link()) will be removed
a61af66fc99e Initial load
duke
parents:
diff changeset
892 // in the future.
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // ciMethod::should_exclude
a61af66fc99e Initial load
duke
parents:
diff changeset
899 //
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // Should this method be excluded from compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
901 bool ciMethod::should_exclude() {
a61af66fc99e Initial load
duke
parents:
diff changeset
902 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
903 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
904 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
905 bool ignore;
a61af66fc99e Initial load
duke
parents:
diff changeset
906 return CompilerOracle::should_exclude(mh, ignore);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // ciMethod::should_inline
a61af66fc99e Initial load
duke
parents:
diff changeset
911 //
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // Should this method be inlined during compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
913 bool ciMethod::should_inline() {
a61af66fc99e Initial load
duke
parents:
diff changeset
914 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
915 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
916 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
917 return CompilerOracle::should_inline(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // ciMethod::should_not_inline
a61af66fc99e Initial load
duke
parents:
diff changeset
922 //
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // Should this method be disallowed from inlining during compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
924 bool ciMethod::should_not_inline() {
a61af66fc99e Initial load
duke
parents:
diff changeset
925 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
926 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
927 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
928 return CompilerOracle::should_not_inline(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
929 }
a61af66fc99e Initial load
duke
parents:
diff changeset
930
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // ciMethod::should_print_assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
933 //
a61af66fc99e Initial load
duke
parents:
diff changeset
934 // Should the compiler print the generated code for this method?
a61af66fc99e Initial load
duke
parents:
diff changeset
935 bool ciMethod::should_print_assembly() {
a61af66fc99e Initial load
duke
parents:
diff changeset
936 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
937 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
938 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
939 return CompilerOracle::should_print(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
941
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // ciMethod::break_at_execute
a61af66fc99e Initial load
duke
parents:
diff changeset
944 //
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // Should the compiler insert a breakpoint into the generated code
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // method?
a61af66fc99e Initial load
duke
parents:
diff changeset
947 bool ciMethod::break_at_execute() {
a61af66fc99e Initial load
duke
parents:
diff changeset
948 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
949 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
950 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
951 return CompilerOracle::should_break_at(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // ciMethod::has_option
a61af66fc99e Initial load
duke
parents:
diff changeset
956 //
a61af66fc99e Initial load
duke
parents:
diff changeset
957 bool ciMethod::has_option(const char* option) {
a61af66fc99e Initial load
duke
parents:
diff changeset
958 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
959 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
960 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
961 return CompilerOracle::has_option_string(mh, option);
a61af66fc99e Initial load
duke
parents:
diff changeset
962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // ciMethod::can_be_compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
966 //
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // Have previous compilations of this method succeeded?
a61af66fc99e Initial load
duke
parents:
diff changeset
968 bool ciMethod::can_be_compiled() {
a61af66fc99e Initial load
duke
parents:
diff changeset
969 check_is_loaded();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
970 ciEnv* env = CURRENT_ENV;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
971 if (is_c1_compile(env->comp_level())) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
972 return _is_c1_compilable;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
973 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
974 return _is_c2_compilable;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // ciMethod::set_not_compilable
a61af66fc99e Initial load
duke
parents:
diff changeset
979 //
a61af66fc99e Initial load
duke
parents:
diff changeset
980 // Tell the VM that this method cannot be compiled at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
981 void ciMethod::set_not_compilable() {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
983 VM_ENTRY_MARK;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
984 ciEnv* env = CURRENT_ENV;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
985 if (is_c1_compile(env->comp_level())) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
986 _is_c1_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
987 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
988 _is_c2_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
989 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
990 get_Method()->set_not_compilable(env->comp_level());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // ciMethod::can_be_osr_compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
995 //
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // Have previous compilations of this method succeeded?
a61af66fc99e Initial load
duke
parents:
diff changeset
997 //
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // Implementation note: the VM does not currently keep track
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // of failed OSR compilations per bci. The entry_bci parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 // is currently unused.
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 bool ciMethod::can_be_osr_compiled(int entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 VM_ENTRY_MARK;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1004 ciEnv* env = CURRENT_ENV;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1005 return !get_Method()->is_not_osr_compilable(env->comp_level());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 // ciMethod::has_compiled_code
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 bool ciMethod::has_compiled_code() {
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1011 return instructions_size() > 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1014 int ciMethod::comp_level() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1015 check_is_loaded();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1016 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1017 nmethod* nm = get_Method()->code();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1018 if (nm != NULL) return nm->comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1019 return 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1020 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1021
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1022 int ciMethod::highest_osr_comp_level() {
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1023 check_is_loaded();
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1024 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1025 return get_Method()->highest_osr_comp_level();
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1026 }
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1027
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // ------------------------------------------------------------------
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1029 // ciMethod::code_size_for_inlining
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1030 //
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1031 // Code size for inlining decisions. This method returns a code
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1032 // size of 1 for methods which has the ForceInline annotation.
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1033 int ciMethod::code_size_for_inlining() {
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1034 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1035 if (get_Method()->force_inline()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1036 return 1;
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1037 }
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1038 return code_size();
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1039 }
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1040
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1041 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // ciMethod::instructions_size
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1043 //
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1044 // This is a rough metric for "fat" methods, compared before inlining
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1045 // with InlineSmallCode. The CodeBlob::code_size accessor includes
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1046 // junk like exception handler, stubs, and constant table, which are
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1047 // not highly relevant to an inlined method. So we use the more
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1048 // specific accessor nmethod::insts_size.
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1049 int ciMethod::instructions_size() {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1050 if (_instructions_size == -1) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1051 GUARDED_VM_ENTRY(
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1052 nmethod* code = get_Method()->code();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1053 if (code != NULL && (code->comp_level() == CompLevel_full_optimization)) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1054 _instructions_size = code->insts_end() - code->verified_entry_point();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1055 } else {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1056 _instructions_size = 0;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1057 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1058 );
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1059 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1060 return _instructions_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // ciMethod::log_nmethod_identity
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 void ciMethod::log_nmethod_identity(xmlStream* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 GUARDED_VM_ENTRY(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1067 nmethod* code = get_Method()->code();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 if (code != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 code->log_identity(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // ciMethod::is_not_reached
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 bool ciMethod::is_not_reached(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 return Interpreter::is_not_reached(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1080 methodHandle(THREAD, get_Method()), bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // ciMethod::was_never_executed
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 bool ciMethod::was_executed_more_than(int times) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1087 return get_Method()->was_executed_more_than(times);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // ciMethod::has_unloaded_classes_in_signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 bool ciMethod::has_unloaded_classes_in_signature() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 EXCEPTION_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1096 methodHandle m(THREAD, get_Method());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1097 bool has_unloaded = Method::has_unloaded_classes_in_signature(m, (JavaThread *)THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 if( HAS_PENDING_EXCEPTION ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 return true; // Declare that we may have unloaded classes
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 return has_unloaded;
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // ciMethod::is_klass_loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1110 return get_Method()->is_klass_loaded(refinfo_index, must_be_resolved);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1112
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 // ciMethod::check_call
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 bool ciMethod::check_call(int refinfo_index, bool is_static) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 HandleMark hm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1120 constantPoolHandle pool (THREAD, get_Method()->constants());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 methodHandle spec_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 KlassHandle spec_klass;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1123 Bytecodes::Code code = (is_static ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1124 LinkResolver::resolve_method_statically(spec_method, spec_klass, code, pool, refinfo_index, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 return (spec_method->is_static() == is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 return false;
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 // ciMethod::print_codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 // Print the bytecodes for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 void ciMethod::print_codes_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1141 GUARDED_VM_ENTRY(get_Method()->print_codes_on(st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 #define FETCH_FLAG_FROM_VM(flag_accessor) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 check_is_loaded(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 VM_ENTRY_MARK; \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1148 return get_Method()->flag_accessor(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 bool ciMethod::is_empty_method() const { FETCH_FLAG_FROM_VM(is_empty_method); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 bool ciMethod::is_vanilla_constructor() const { FETCH_FLAG_FROM_VM(is_vanilla_constructor); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 bool ciMethod::has_loops () const { FETCH_FLAG_FROM_VM(has_loops); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 bool ciMethod::has_jsrs () const { FETCH_FLAG_FROM_VM(has_jsrs); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 bool ciMethod::is_accessor () const { FETCH_FLAG_FROM_VM(is_accessor); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 bool ciMethod::is_initializer () const { FETCH_FLAG_FROM_VM(is_initializer); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 BCEscapeAnalyzer *ciMethod::get_bcea() {
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1159 #ifdef COMPILER2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 if (_bcea == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 _bcea = new (CURRENT_ENV->arena()) BCEscapeAnalyzer(this, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 return _bcea;
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1164 #else // COMPILER2
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1165 ShouldNotReachHere();
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1166 return NULL;
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1167 #endif // COMPILER2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 ciMethodBlocks *ciMethod::get_method_blocks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 Arena *arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 if (_method_blocks == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 _method_blocks = new (arena) ciMethodBlocks(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 return _method_blocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 #undef FETCH_FLAG_FROM_VM
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1180 void ciMethod::dump_replay_data(outputStream* st) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1181 ASSERT_IN_VM;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1182 Method* method = get_Method();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1183 Klass* holder = method->method_holder();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1184 st->print_cr("ciMethod %s %s %s %d %d %d %d %d",
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1185 holder->name()->as_quoted_ascii(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1186 method->name()->as_quoted_ascii(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1187 method->signature()->as_quoted_ascii(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1188 method->invocation_counter()->raw_counter(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1189 method->backedge_counter()->raw_counter(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1190 interpreter_invocation_count(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1191 interpreter_throwout_count(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1192 _instructions_size);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1193 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // ciMethod::print_codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 // Print a range of the bytecodes for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 void ciMethod::print_codes_on(int from, int to, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1201 GUARDED_VM_ENTRY(get_Method()->print_codes_on(from, to, st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 // ciMethod::print_name
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 // Print the name of this method, including signature and some flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 void ciMethod::print_name(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1210 GUARDED_VM_ENTRY(get_Method()->print_name(st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1212
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // ciMethod::print_short_name
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 // Print the name of this method, without signature.
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 void ciMethod::print_short_name(outputStream* st) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1218 if (is_loaded()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1219 GUARDED_VM_ENTRY(get_Method()->print_short_name(st););
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1220 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1221 // Fall back if method is not loaded.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1222 holder()->print_name_on(st);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1223 st->print("::");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1224 name()->print_symbol_on(st);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1225 if (WizardMode)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1226 signature()->as_symbol()->print_symbol_on(st);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1227 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1229
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 // ciMethod::print_impl
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // Implementation of the print method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 void ciMethod::print_impl(outputStream* st) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1235 ciMetadata::print_impl(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 st->print(" name=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 st->print(" holder=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 holder()->print_name_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 st->print(" signature=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 signature()->as_symbol()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 if (is_loaded()) {
6634
7f813940ac35 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 6266
diff changeset
1243 st->print(" loaded=true");
7f813940ac35 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 6266
diff changeset
1244 st->print(" arg_size=%d", arg_size());
7f813940ac35 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 6266
diff changeset
1245 st->print(" flags=");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 flags().print_member_flags(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 st->print(" loaded=false");
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 }