annotate src/share/vm/ci/ciMethod.cpp @ 17716:cdb71841f4bc

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents 849eb7bfceac
children 96d2c94bbdd0 d8a0bb6f62a5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
2 * Copyright (c) 1999, 2013, 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;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
289 Method* m = get_Method();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
290 if (!m->has_itable_index())
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
291 return Method::nonvirtual_vtable_index;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
292 return m->itable_index();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
293 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
294 #endif // SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
295
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
296
0
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // ciMethod::native_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
299 //
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // Get the address of this method's native code, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
301 address ciMethod::native_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
303 assert(flags().is_native(), "must be native method");
a61af66fc99e Initial load
duke
parents:
diff changeset
304 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
305 Method* method = get_Method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 address entry = method->native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 assert(entry != NULL, "must be valid entry point");
a61af66fc99e Initial load
duke
parents:
diff changeset
308 return entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // ciMethod::interpreter_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
314 //
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Get the entry point for running this method in the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
316 address ciMethod::interpreter_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
318 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
319 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
320 return Interpreter::entry_for_method(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // ciMethod::uses_balanced_monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
326 //
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // Does this method use monitors in a strict stack-disciplined manner?
a61af66fc99e Initial load
duke
parents:
diff changeset
328 bool ciMethod::has_balanced_monitors() {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
330 if (_balanced_monitors) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Analyze the method to see if monitors are used properly.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
334 methodHandle method(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335 assert(method->has_monitor_bytecodes(), "should have checked this");
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // Check to see if a previous compilation computed the
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // monitor-matching analysis.
a61af66fc99e Initial load
duke
parents:
diff changeset
339 if (method->guaranteed_monitor_matching()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 _balanced_monitors = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
347 GeneratePairingInfo gpi(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 gpi.compute_map(CATCH);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 if (!gpi.monitor_safe()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352 method->set_guaranteed_monitor_matching();
a61af66fc99e Initial load
duke
parents:
diff changeset
353 _balanced_monitors = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // ciMethod::get_flow_analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
361 ciTypeFlow* ciMethod::get_flow_analysis() {
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
362 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
363 if (_flow == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 _flow = new (env->arena()) ciTypeFlow(env, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 _flow->do_flow();
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 return _flow;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
369 #else // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
370 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
371 return NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
372 #endif // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // ciMethod::get_osr_flow_analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
378 ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) {
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
379 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // OSR entry points are always place after a call bytecode of some sort
a61af66fc99e Initial load
duke
parents:
diff changeset
381 assert(osr_bci >= 0, "must supply valid OSR entry point");
a61af66fc99e Initial load
duke
parents:
diff changeset
382 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 ciTypeFlow* flow = new (env->arena()) ciTypeFlow(env, this, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 flow->do_flow();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 return flow;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
386 #else // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
388 return NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
389 #endif // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // ------------------------------------------------------------------
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
393 // ciMethod::raw_liveness_at_bci
0
a61af66fc99e Initial load
duke
parents:
diff changeset
394 //
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // 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
396 MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
397 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 if (_liveness == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // Create the liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
400 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
401 _liveness = new (arena) MethodLiveness(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
402 _liveness->compute_liveness();
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
404 return _liveness->get_liveness_at(bci);
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
405 }
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 // ------------------------------------------------------------------
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
408 // ciMethod::liveness_at_bci
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
409 //
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
410 // 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
411 // 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
412 // information.
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
413 MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
414 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
415 if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Keep all locals live for the user's edification and amusement.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 result.at_put_range(0, result.size(), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
419 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // ciMethod::live_local_oops_at_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
423 //
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // find all the live oops in the locals array for a particular bci
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Compute what the interpreter believes by using the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // oopmap generator. This is used as a double check during osr to
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // guard against conservative result from MethodLiveness making us
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // think a dead oop is live. MethodLiveness is conservative in the
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // sense that it may consider locals to be live which cannot be live,
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // like in the case where a local could contain an oop or a primitive
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // along different paths. In that case the local must be dead when
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // those paths merge. Since the interpreter's viewpoint is used when
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // gc'ing an interpreter frame we need to use its viewpoint during
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // OSR when loading the locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 BitMap ciMethod::live_local_oops_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 InterpreterOopMap mask;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
439 OopMapCache::compute_one_oop_map(get_Method(), bci, &mask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
440 int mask_size = max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
441 BitMap result(mask_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
442 result.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
443 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
444 for (i = 0; i < mask_size ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 if (mask.is_oop(i)) result.set_bit(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
447 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // ciMethod::bci_block_start
a61af66fc99e Initial load
duke
parents:
diff changeset
454 //
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Marks all bcis where a new basic block starts
a61af66fc99e Initial load
duke
parents:
diff changeset
456 const BitMap ciMethod::bci_block_start() {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
458 if (_liveness == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // Create the liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
460 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
461 _liveness = new (arena) MethodLiveness(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 _liveness->compute_liveness();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 return _liveness->get_bci_block_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 #endif // COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // ciMethod::call_profile_at_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
472 //
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // Get the ciCallProfile for the invocation of this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // Also reports receiver types for non-call type checks (if TypeProfileCasts).
a61af66fc99e Initial load
duke
parents:
diff changeset
475 ciCallProfile ciMethod::call_profile_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 ciCallProfile result;
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (method_data() != NULL && method_data()->is_mature()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 ciProfileData* data = method_data()->bci_to_data(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
480 if (data != NULL && data->is_CounterData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // Every profiled call site has a counter.
a61af66fc99e Initial load
duke
parents:
diff changeset
482 int count = data->as_CounterData()->count();
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 if (!data->is_ReceiverTypeData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 result._receiver_count[0] = 0; // that's a definite zero
a61af66fc99e Initial load
duke
parents:
diff changeset
486 } else { // ReceiverTypeData is a subclass of CounterData
a61af66fc99e Initial load
duke
parents:
diff changeset
487 ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData();
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // In addition, virtual call sites have receiver type information
a61af66fc99e Initial load
duke
parents:
diff changeset
489 int receivers_count_total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
490 int morphism = 0;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
491 // Precompute morphism for the possible fixup
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 for (uint i = 0; i < call->row_limit(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
493 ciKlass* receiver = call->receiver(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 if (receiver == NULL) continue;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
495 morphism++;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
496 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
497 int epsilon = 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
498 if (TieredCompilation && ProfileInterpreter) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
499 // Interpreter and C1 treat final and special invokes differently.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
500 // C1 will record a type, whereas the interpreter will just
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
501 // increment the count. Detect this case.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
502 if (morphism == 1 && count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
503 epsilon = count;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
504 count = 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
505 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
506 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
507 for (uint i = 0; i < call->row_limit(); i++) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
508 ciKlass* receiver = call->receiver(i);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
509 if (receiver == NULL) continue;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
510 int rcount = call->receiver_count(i) + epsilon;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
511 if (rcount == 0) rcount = 1; // Should be valid value
a61af66fc99e Initial load
duke
parents:
diff changeset
512 receivers_count_total += rcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // Add the receiver to result data.
a61af66fc99e Initial load
duke
parents:
diff changeset
514 result.add_receiver(receiver, rcount);
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // If we extend profiling to record methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // we will set result._method also.
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // Determine call site's morphism.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
519 // 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
520 // 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
521 // 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
522 if (morphism > 0 && morphism == result._limit) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
523 // The morphism <= MorphismLimit.
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
524 if ((morphism < ciCallProfile::MorphismLimit) ||
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
525 (morphism == ciCallProfile::MorphismLimit && count == 0)) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
526 #ifdef ASSERT
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
527 if (count > 0) {
1251
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
528 this->print_short_name(tty);
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
529 tty->print_cr(" @ bci:%d", bci);
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
530 this->print_codes();
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
531 assert(false, "this call site should not be polymorphic");
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
532 }
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
533 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
534 result._morphism = morphism;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // Make the count consistent if this is a call profile. If count is
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // zero or less, presume that this is a typecheck profile and
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // do nothing. Otherwise, increase count to be the sum of all
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // receiver's counts.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
541 if (count >= 0) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
542 count += receivers_count_total;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 result._count = count;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // Add new receiver and sort data by receiver's profile count.
a61af66fc99e Initial load
duke
parents:
diff changeset
553 void ciCallProfile::add_receiver(ciKlass* receiver, int receiver_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // Add new receiver and sort data by receiver's counts when we have space
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // for it otherwise replace the less called receiver (less called receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // is placed to the last array element which is not used).
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // First array's element contains most called receiver.
a61af66fc99e Initial load
duke
parents:
diff changeset
558 int i = _limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 for (; i > 0 && receiver_count > _receiver_count[i-1]; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 _receiver[i] = _receiver[i-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
561 _receiver_count[i] = _receiver_count[i-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 _receiver[i] = receiver;
a61af66fc99e Initial load
duke
parents:
diff changeset
564 _receiver_count[i] = receiver_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
565 if (_limit < MorphismLimit) _limit++;
a61af66fc99e Initial load
duke
parents:
diff changeset
566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
567
12966
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
568
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
569 void ciMethod::assert_virtual_call_type_ok(int bci) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
570 assert(java_code_at_bci(bci) == Bytecodes::_invokevirtual ||
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
571 java_code_at_bci(bci) == Bytecodes::_invokeinterface, err_msg("unexpected bytecode %s", Bytecodes::name(java_code_at_bci(bci))));
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
572 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
573
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
574 void ciMethod::assert_call_type_ok(int bci) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
575 assert(java_code_at_bci(bci) == Bytecodes::_invokestatic ||
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
576 java_code_at_bci(bci) == Bytecodes::_invokespecial ||
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
577 java_code_at_bci(bci) == Bytecodes::_invokedynamic, err_msg("unexpected bytecode %s", Bytecodes::name(java_code_at_bci(bci))));
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
578 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
579
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
580 /**
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
581 * Check whether profiling provides a type for the argument i to the
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
582 * call at bci bci
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
583 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
584 * @param bci bci of the call
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
585 * @param i argument number
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
586 * @return profiled type
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
587 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
588 * If the profile reports that the argument may be null, return false
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
589 * at least for now.
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
590 */
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
591 ciKlass* ciMethod::argument_profiled_type(int bci, int i) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
592 if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
593 ciProfileData* data = method_data()->bci_to_data(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
594 if (data != NULL) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
595 if (data->is_VirtualCallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
596 assert_virtual_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
597 ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
598 if (i >= call->number_of_arguments()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
599 return NULL;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
600 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
601 ciKlass* type = call->valid_argument_type(i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
602 if (type != NULL && !call->argument_maybe_null(i)) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
603 return type;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
604 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
605 } else if (data->is_CallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
606 assert_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
607 ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
608 if (i >= call->number_of_arguments()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
609 return NULL;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
610 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
611 ciKlass* type = call->valid_argument_type(i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
612 if (type != NULL && !call->argument_maybe_null(i)) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
613 return type;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
614 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
615 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
616 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
617 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
618 return NULL;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
619 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
620
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
621 /**
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
622 * Check whether profiling provides a type for the return value from
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
623 * the call at bci bci
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
624 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
625 * @param bci bci of the call
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
626 * @return profiled type
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
627 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
628 * If the profile reports that the argument may be null, return false
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
629 * at least for now.
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
630 */
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
631 ciKlass* ciMethod::return_profiled_type(int bci) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
632 if (MethodData::profile_return() && method_data() != NULL && method_data()->is_mature()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
633 ciProfileData* data = method_data()->bci_to_data(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
634 if (data != NULL) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
635 if (data->is_VirtualCallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
636 assert_virtual_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
637 ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
638 ciKlass* type = call->valid_return_type();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
639 if (type != NULL && !call->return_maybe_null()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
640 return type;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
641 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
642 } else if (data->is_CallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
643 assert_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
644 ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
645 ciKlass* type = call->valid_return_type();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
646 if (type != NULL && !call->return_maybe_null()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
647 return type;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
648 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
649 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
650 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
651 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
652 return NULL;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
653 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
654
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
655 /**
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
656 * Check whether profiling provides a type for the parameter i
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
657 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
658 * @param i parameter number
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
659 * @return profiled type
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
660 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
661 * If the profile reports that the argument may be null, return false
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
662 * at least for now.
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
663 */
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
664 ciKlass* ciMethod::parameter_profiled_type(int i) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
665 if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
666 ciParametersTypeData* parameters = method_data()->parameters_type_data();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
667 if (parameters != NULL && i < parameters->number_of_parameters()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
668 ciKlass* type = parameters->valid_parameter_type(i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
669 if (type != NULL && !parameters->parameter_maybe_null(i)) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
670 return type;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
671 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
672 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
673 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
674 return NULL;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
675 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
676
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
677
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // ciMethod::find_monomorphic_target
a61af66fc99e Initial load
duke
parents:
diff changeset
680 //
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // Given a certain calling environment, find the monomorphic target
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // for the call. Return NULL if the call is not monomorphic in
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // its calling environment, or if there are only abstract methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // The returned method is never abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Note: If caller uses a non-null result, it must inform dependencies
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // via assert_unique_concrete_method or assert_leaf_type.
a61af66fc99e Initial load
duke
parents:
diff changeset
687 ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
688 ciInstanceKlass* callee_holder,
a61af66fc99e Initial load
duke
parents:
diff changeset
689 ciInstanceKlass* actual_recv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
690 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 if (actual_recv->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // %%% We cannot trust interface types, yet. See bug 6312651.
a61af66fc99e Initial load
duke
parents:
diff changeset
694 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 ciMethod* root_m = resolve_invoke(caller, actual_recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
698 if (root_m == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // Something went wrong looking up the actual receiver method.
a61af66fc99e Initial load
duke
parents:
diff changeset
700 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702 assert(!root_m->is_abstract(), "resolve_invoke promise");
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Make certain quick checks even if UseCHA is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
705
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // Is it private or final?
a61af66fc99e Initial load
duke
parents:
diff changeset
707 if (root_m->can_be_statically_bound()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711 if (actual_recv->is_leaf_type() && actual_recv == root_m->holder()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // Easy case. There is no other place to put a method, so don't bother
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // to go through the VM_ENTRY_MARK and all the rest.
a61af66fc99e Initial load
duke
parents:
diff changeset
714 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // Array methods (clone, hashCode, etc.) are always statically bound.
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // If we were to see an array type here, we'd return root_m.
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // However, this method processes only ciInstanceKlasses. (See 4962591.)
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // The inline_native_clone intrinsic narrows Object to T[] properly,
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // so there is no need to do the same job here.
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 if (!UseCHA) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
724
a61af66fc99e Initial load
duke
parents:
diff changeset
725 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 methodHandle target;
a61af66fc99e Initial load
duke
parents:
diff changeset
728 {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 MutexLocker locker(Compile_lock);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
730 Klass* context = actual_recv->get_Klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
731 target = Dependencies::find_unique_concrete_method(context,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
732 root_m->get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
734 }
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 #ifndef PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
737 if (TraceDependencies && target() != NULL && target() != root_m->get_Method()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
738 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
739 tty->print_cr(" context = %s", InstanceKlass::cast(actual_recv->get_Klass())->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
740 tty->print(" method = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
741 target->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
742 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
744 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 if (target() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
747 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
749 if (target() == root_m->get_Method()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
750 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (!root_m->is_public() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
753 !root_m->is_protected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // If we are going to reason about inheritance, it's easiest
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // if the method in question is public, protected, or private.
a61af66fc99e Initial load
duke
parents:
diff changeset
756 // If the answer is not root_m, it is conservatively correct
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // to return NULL, even if the CHA encountered irrelevant
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // methods in other packages.
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // %%% TO DO: Work out logic for package-private methods
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // with the same name but different vtable indexes.
a61af66fc99e Initial load
duke
parents:
diff changeset
761 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
763 return CURRENT_THREAD_ENV->get_method(target());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
764 }
a61af66fc99e Initial load
duke
parents:
diff changeset
765
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // ciMethod::resolve_invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
768 //
a61af66fc99e Initial load
duke
parents:
diff changeset
769 // Given a known receiver klass, find the target for the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // Return NULL if the call has no target or the target is abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
771 ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver) {
a61af66fc99e Initial load
duke
parents:
diff changeset
772 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
773 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
774
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
775 KlassHandle caller_klass (THREAD, caller->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
776 KlassHandle h_recv (THREAD, exact_receiver->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
777 KlassHandle h_resolved (THREAD, holder()->get_Klass());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
778 Symbol* h_name = name()->get_symbol();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
779 Symbol* h_signature = signature()->get_symbol();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
780
a61af66fc99e Initial load
duke
parents:
diff changeset
781 methodHandle m;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 // Only do exact lookup if receiver klass has been linked. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // 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
784 if (h_recv->oop_is_array()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
785 ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
786 InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
787 if (holder()->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
789 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 if (m.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
796 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 ciMethod* result = this;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
800 if (m() != get_Method()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
801 result = CURRENT_THREAD_ENV->get_method(m());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
802 }
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // Don't return abstract methods because they aren't
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // optimizable or interesting.
a61af66fc99e Initial load
duke
parents:
diff changeset
806 if (result->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
807 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
809 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // ciMethod::resolve_vtable_index
a61af66fc99e Initial load
duke
parents:
diff changeset
815 //
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // 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
817 // Return Method::invalid_vtable_index if the vtable_index is unknown.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
818 int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
820
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
821 int vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // Only do lookup if receiver klass has been linked. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // the vtable has not been setup, and the LinkResolver will fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
824 if (!receiver->is_interface()
a61af66fc99e Initial load
duke
parents:
diff changeset
825 && (!receiver->is_instance_klass() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
826 receiver->as_instance_klass()->is_linked())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
828
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
829 KlassHandle caller_klass (THREAD, caller->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
830 KlassHandle h_recv (THREAD, receiver->get_Klass());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
831 Symbol* h_name = name()->get_symbol();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
832 Symbol* h_signature = signature()->get_symbol();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 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
835 if (vtable_index == Method::nonvirtual_vtable_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // 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
837 vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 return vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
845 // ciMethod::interpreter_call_site_count
a61af66fc99e Initial load
duke
parents:
diff changeset
846 int ciMethod::interpreter_call_site_count(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
847 if (method_data() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 ciProfileData* data = method_data()->bci_to_data(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
850 if (data != NULL && data->is_CounterData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 return scale_count(data->as_CounterData()->count());
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854 return -1; // unknown
a61af66fc99e Initial load
duke
parents:
diff changeset
855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // ------------------------------------------------------------------
7194
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
858 // ciMethod::get_field_at_bci
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
859 ciField* ciMethod::get_field_at_bci(int bci, bool &will_link) {
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
860 ciBytecodeStream iter(this);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
861 iter.reset_to_bci(bci);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
862 iter.next();
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
863 return iter.get_field(will_link);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
864 }
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
865
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
866 // ------------------------------------------------------------------
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
867 // ciMethod::get_method_at_bci
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
868 ciMethod* ciMethod::get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature) {
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
869 ciBytecodeStream iter(this);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
870 iter.reset_to_bci(bci);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
871 iter.next();
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
872 return iter.get_method(will_link, declared_signature);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
873 }
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
874
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
875 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // Adjust a CounterData count to be commensurate with
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // interpreter_invocation_count. If the MDO exists for
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // only 25% of the time the method exists, then the
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // counts in the MDO should be scaled by 4X, so that
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // they can be usefully and stably compared against the
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // invocation counts in methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
882 int ciMethod::scale_count(int count, float prof_factor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
883 if (count > 0 && method_data() != NULL) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
884 int counter_life;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 int method_life = interpreter_invocation_count();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
886 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
887 // In tiered the MDO's life is measured directly, so just use the snapshotted counters
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
888 counter_life = MAX2(method_data()->invocation_count(), method_data()->backedge_count());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
889 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
890 int current_mileage = method_data()->current_mileage();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
891 int creation_mileage = method_data()->creation_mileage();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
892 counter_life = current_mileage - creation_mileage;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
893 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
894
0
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // counter_life due to backedge_counter could be > method_life
a61af66fc99e Initial load
duke
parents:
diff changeset
896 if (counter_life > method_life)
a61af66fc99e Initial load
duke
parents:
diff changeset
897 counter_life = method_life;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 if (0 < counter_life && counter_life <= method_life) {
a61af66fc99e Initial load
duke
parents:
diff changeset
899 count = (int)((double)count * prof_factor * method_life / counter_life + 0.5);
a61af66fc99e Initial load
duke
parents:
diff changeset
900 count = (count > 0) ? count : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
905
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
906
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
907 // ------------------------------------------------------------------
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
908 // ciMethod::is_special_get_caller_class_method
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
909 //
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
910 bool ciMethod::is_ignored_by_security_stack_walk() const {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
911 check_is_loaded();
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
912 VM_ENTRY_MARK;
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
913 return get_Method()->is_ignored_by_security_stack_walk();
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
914 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
915
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
916
0
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // ------------------------------------------------------------------
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
918 // invokedynamic support
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
919
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
920 // ------------------------------------------------------------------
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
921 // ciMethod::is_method_handle_intrinsic
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
922 //
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
923 // 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
924 // 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
925 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
926 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
927 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
928 MethodHandles::is_signature_polymorphic_intrinsic(iid));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
929 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
930
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
931 // ------------------------------------------------------------------
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
932 // ciMethod::is_compiled_lambda_form
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
933 //
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
934 // 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
935 // 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
936 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
937 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
938 return iid == vmIntrinsics::_compiledLambdaForm;
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1137
diff changeset
939 }
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1137
diff changeset
940
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
941 // ------------------------------------------------------------------
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
942 // ciMethod::has_member_arg
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
943 //
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
944 // 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
945 // 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
946 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
947 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
948 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
949 MethodHandles::has_member_arg(iid));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
950 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
951
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
952 // ------------------------------------------------------------------
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
953 // ciMethod::ensure_method_data
0
a61af66fc99e Initial load
duke
parents:
diff changeset
954 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
955 // 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
956 // 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
957 bool ciMethod::ensure_method_data(methodHandle h_m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
958 EXCEPTION_CONTEXT;
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
959 if (is_native() || is_abstract() || h_m()->is_accessor()) {
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
960 return true;
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
961 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
962 if (h_m()->method_data() == NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
963 Method::build_interpreter_method_data(h_m, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
964 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
965 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
967 }
a61af66fc99e Initial load
duke
parents:
diff changeset
968 if (h_m()->method_data() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
969 _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
970 _method_data->load_data();
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
971 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
972 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 _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
974 return false;
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 // public, retroactive version
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
979 bool ciMethod::ensure_method_data() {
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
980 bool result = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
981 if (_method_data == NULL || _method_data->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 GUARDED_VM_ENTRY({
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
983 result = ensure_method_data(get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
984 });
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
986 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 }
a61af66fc99e Initial load
duke
parents:
diff changeset
988
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // ciMethod::method_data
a61af66fc99e Initial load
duke
parents:
diff changeset
992 //
a61af66fc99e Initial load
duke
parents:
diff changeset
993 ciMethodData* ciMethod::method_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
994 if (_method_data != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
995 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
996 }
a61af66fc99e Initial load
duke
parents:
diff changeset
997 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
998 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 Thread* my_thread = JavaThread::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1000 methodHandle h_m(my_thread, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1001
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 if (h_m()->method_data() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1003 _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 _method_data->load_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 _method_data = CURRENT_ENV->get_empty_methodData();
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1012 // ------------------------------------------------------------------
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1013 // ciMethod::method_data_or_null
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1014 // 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
1015 // NULL otherwise.
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1016 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
1017 ciMethodData *md = method_data();
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1018 if (md->is_empty()) {
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1019 return NULL;
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1020 }
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1021 return md;
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1022 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // ------------------------------------------------------------------
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1025 // ciMethod::ensure_method_counters
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1026 //
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1027 MethodCounters* ciMethod::ensure_method_counters() {
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1028 check_is_loaded();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1029 VM_ENTRY_MARK;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1030 methodHandle mh(THREAD, get_Method());
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1031 MethodCounters* method_counters = mh->get_method_counters(CHECK_NULL);
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1032 return method_counters;
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1033 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1034
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1035 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 // ciMethod::should_exclude
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // Should this method be excluded from compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 bool ciMethod::should_exclude() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1042 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 bool ignore;
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 return CompilerOracle::should_exclude(mh, ignore);
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 // ciMethod::should_inline
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 // Should this method be inlined during compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 bool ciMethod::should_inline() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1054 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 return CompilerOracle::should_inline(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 // ciMethod::should_not_inline
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 // Should this method be disallowed from inlining during compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 bool ciMethod::should_not_inline() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1065 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 return CompilerOracle::should_not_inline(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 // ciMethod::should_print_assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // Should the compiler print the generated code for this method?
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 bool ciMethod::should_print_assembly() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1076 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 return CompilerOracle::should_print(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1079
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 // ciMethod::break_at_execute
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 // Should the compiler insert a breakpoint into the generated code
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // method?
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 bool ciMethod::break_at_execute() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1088 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 return CompilerOracle::should_break_at(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1091
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // ciMethod::has_option
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 bool ciMethod::has_option(const char* option) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1098 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 return CompilerOracle::has_option_string(mh, option);
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1101
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // ciMethod::can_be_compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // Have previous compilations of this method succeeded?
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 bool ciMethod::can_be_compiled() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 check_is_loaded();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1108 ciEnv* env = CURRENT_ENV;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1109 if (is_c1_compile(env->comp_level())) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1110 return _is_c1_compilable;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1111 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1112 return _is_c2_compilable;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // ciMethod::set_not_compilable
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // Tell the VM that this method cannot be compiled at all.
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7990
diff changeset
1119 void ciMethod::set_not_compilable(const char* reason) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 VM_ENTRY_MARK;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1122 ciEnv* env = CURRENT_ENV;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1123 if (is_c1_compile(env->comp_level())) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1124 _is_c1_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1125 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1126 _is_c2_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1127 }
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7990
diff changeset
1128 get_Method()->set_not_compilable(env->comp_level(), true, reason);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // ciMethod::can_be_osr_compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 // Have previous compilations of this method succeeded?
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // Implementation note: the VM does not currently keep track
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // of failed OSR compilations per bci. The entry_bci parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 // is currently unused.
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 bool ciMethod::can_be_osr_compiled(int entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 VM_ENTRY_MARK;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1142 ciEnv* env = CURRENT_ENV;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1143 return !get_Method()->is_not_osr_compilable(env->comp_level());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1145
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 // ciMethod::has_compiled_code
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 bool ciMethod::has_compiled_code() {
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1149 return instructions_size() > 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1151
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1152 int ciMethod::comp_level() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1153 check_is_loaded();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1154 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1155 nmethod* nm = get_Method()->code();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1156 if (nm != NULL) return nm->comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1157 return 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1158 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1159
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1160 int ciMethod::highest_osr_comp_level() {
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1161 check_is_loaded();
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1162 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1163 return get_Method()->highest_osr_comp_level();
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1164 }
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1165
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // ------------------------------------------------------------------
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1167 // ciMethod::code_size_for_inlining
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1168 //
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1169 // 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
1170 // 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
1171 int ciMethod::code_size_for_inlining() {
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1172 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1173 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
1174 return 1;
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1175 }
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1176 return code_size();
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1177 }
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1178
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1179 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // ciMethod::instructions_size
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1181 //
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1182 // This is a rough metric for "fat" methods, compared before inlining
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1183 // with InlineSmallCode. The CodeBlob::code_size accessor includes
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1184 // junk like exception handler, stubs, and constant table, which are
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1185 // not highly relevant to an inlined method. So we use the more
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1186 // specific accessor nmethod::insts_size.
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1187 int ciMethod::instructions_size() {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1188 if (_instructions_size == -1) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1189 GUARDED_VM_ENTRY(
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1190 nmethod* code = get_Method()->code();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1191 if (code != NULL && (code->comp_level() == CompLevel_full_optimization)) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1192 _instructions_size = code->insts_end() - code->verified_entry_point();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1193 } else {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1194 _instructions_size = 0;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1195 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1196 );
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1197 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1198 return _instructions_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // ciMethod::log_nmethod_identity
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 void ciMethod::log_nmethod_identity(xmlStream* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 GUARDED_VM_ENTRY(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1205 nmethod* code = get_Method()->code();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 if (code != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 code->log_identity(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // ciMethod::is_not_reached
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 bool ciMethod::is_not_reached(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 return Interpreter::is_not_reached(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1218 methodHandle(THREAD, get_Method()), bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 // ciMethod::was_never_executed
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 bool ciMethod::was_executed_more_than(int times) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1225 return get_Method()->was_executed_more_than(times);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // ciMethod::has_unloaded_classes_in_signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 bool ciMethod::has_unloaded_classes_in_signature() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 EXCEPTION_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1234 methodHandle m(THREAD, get_Method());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1235 bool has_unloaded = Method::has_unloaded_classes_in_signature(m, (JavaThread *)THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if( HAS_PENDING_EXCEPTION ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 return true; // Declare that we may have unloaded classes
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 return has_unloaded;
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1243
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // ciMethod::is_klass_loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1248 return get_Method()->is_klass_loaded(refinfo_index, must_be_resolved);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // ciMethod::check_call
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 bool ciMethod::check_call(int refinfo_index, bool is_static) const {
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
1254 // This method is used only in C2 from InlineTree::ok_to_inline,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
1255 // and is only used under -Xcomp or -XX:CompileTheWorld.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
1256 // It appears to fail when applied to an invokeinterface call site.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
1257 // FIXME: Remove this method and resolve_method_statically; refactor to use the other LinkResolver entry points.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 HandleMark hm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1262 constantPoolHandle pool (THREAD, get_Method()->constants());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 methodHandle spec_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 KlassHandle spec_klass;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1265 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
1266 LinkResolver::resolve_method_statically(spec_method, spec_klass, code, pool, refinfo_index, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 return (spec_method->is_static() == is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 // ciMethod::print_codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 // Print the bytecodes for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 void ciMethod::print_codes_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1283 GUARDED_VM_ENTRY(get_Method()->print_codes_on(st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
a61af66fc99e Initial load
duke
parents:
diff changeset
1286
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 #define FETCH_FLAG_FROM_VM(flag_accessor) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 check_is_loaded(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 VM_ENTRY_MARK; \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1290 return get_Method()->flag_accessor(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1292
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 bool ciMethod::is_empty_method() const { FETCH_FLAG_FROM_VM(is_empty_method); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 bool ciMethod::is_vanilla_constructor() const { FETCH_FLAG_FROM_VM(is_vanilla_constructor); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 bool ciMethod::has_loops () const { FETCH_FLAG_FROM_VM(has_loops); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 bool ciMethod::has_jsrs () const { FETCH_FLAG_FROM_VM(has_jsrs); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 bool ciMethod::is_accessor () const { FETCH_FLAG_FROM_VM(is_accessor); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 bool ciMethod::is_initializer () const { FETCH_FLAG_FROM_VM(is_initializer); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1299
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1300 bool ciMethod::is_boxing_method() const {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1301 if (holder()->is_box_klass()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1302 switch (intrinsic_id()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1303 case vmIntrinsics::_Boolean_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1304 case vmIntrinsics::_Byte_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1305 case vmIntrinsics::_Character_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1306 case vmIntrinsics::_Short_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1307 case vmIntrinsics::_Integer_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1308 case vmIntrinsics::_Long_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1309 case vmIntrinsics::_Float_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1310 case vmIntrinsics::_Double_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1311 return true;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1312 default:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1313 return false;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1314 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1315 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1316 return false;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1317 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1318
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1319 bool ciMethod::is_unboxing_method() const {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1320 if (holder()->is_box_klass()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1321 switch (intrinsic_id()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1322 case vmIntrinsics::_booleanValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1323 case vmIntrinsics::_byteValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1324 case vmIntrinsics::_charValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1325 case vmIntrinsics::_shortValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1326 case vmIntrinsics::_intValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1327 case vmIntrinsics::_longValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1328 case vmIntrinsics::_floatValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1329 case vmIntrinsics::_doubleValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1330 return true;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1331 default:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1332 return false;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1333 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1334 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1335 return false;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1336 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1337
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 BCEscapeAnalyzer *ciMethod::get_bcea() {
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1339 #ifdef COMPILER2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 if (_bcea == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 _bcea = new (CURRENT_ENV->arena()) BCEscapeAnalyzer(this, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 return _bcea;
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1344 #else // COMPILER2
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1345 ShouldNotReachHere();
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1346 return NULL;
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1347 #endif // COMPILER2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1349
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 ciMethodBlocks *ciMethod::get_method_blocks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 Arena *arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 if (_method_blocks == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 _method_blocks = new (arena) ciMethodBlocks(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 return _method_blocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 #undef FETCH_FLAG_FROM_VM
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1360 void ciMethod::dump_name_as_ascii(outputStream* st) {
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1361 Method* method = get_Method();
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1362 st->print("%s %s %s",
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1363 method->klass_name()->as_quoted_ascii(),
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1364 method->name()->as_quoted_ascii(),
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1365 method->signature()->as_quoted_ascii());
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1366 }
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1367
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1368 void ciMethod::dump_replay_data(outputStream* st) {
7990
fcc9e7681d63 8006410: allocating without ResourceMark when CompileCommand was specified
vlivanov
parents: 7194
diff changeset
1369 ResourceMark rm;
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1370 Method* method = get_Method();
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1371 MethodCounters* mcs = method->method_counters();
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1372 st->print("ciMethod ");
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1373 dump_name_as_ascii(st);
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1374 st->print_cr(" %d %d %d %d %d",
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1375 mcs == NULL ? 0 : mcs->invocation_counter()->raw_counter(),
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1376 mcs == NULL ? 0 : mcs->backedge_counter()->raw_counter(),
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1377 interpreter_invocation_count(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1378 interpreter_throwout_count(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1379 _instructions_size);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1380 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1381
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 // ciMethod::print_codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 // Print a range of the bytecodes for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 void ciMethod::print_codes_on(int from, int to, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1388 GUARDED_VM_ENTRY(get_Method()->print_codes_on(from, to, st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1390
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 // ciMethod::print_name
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // Print the name of this method, including signature and some flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 void ciMethod::print_name(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1397 GUARDED_VM_ENTRY(get_Method()->print_name(st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1399
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 // ciMethod::print_short_name
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 // Print the name of this method, without signature.
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 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
1405 if (is_loaded()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1406 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
1407 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1408 // 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
1409 holder()->print_name_on(st);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1410 st->print("::");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1411 name()->print_symbol_on(st);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1412 if (WizardMode)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1413 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
1414 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1416
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // ciMethod::print_impl
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // Implementation of the print method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 void ciMethod::print_impl(outputStream* st) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1422 ciMetadata::print_impl(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 st->print(" name=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 st->print(" holder=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 holder()->print_name_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 st->print(" signature=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 signature()->as_symbol()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 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
1430 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
1431 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
1432 st->print(" flags=");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 flags().print_member_flags(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 st->print(" loaded=false");
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 }