annotate src/share/vm/ci/ciMethod.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 119875f0fc67
children 6a528388c7da
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();
17980
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17721
diff changeset
83 _size_of_parameters = h_m()->size_of_parameters();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _uses_monitors = h_m()->access_flags().has_monitor_bytecodes();
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _balanced_monitors = !_uses_monitors || h_m()->access_flags().is_monitor_matching();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
86 _is_c1_compilable = !h_m()->is_not_c1_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
87 _is_c2_compilable = !h_m()->is_not_c2_compilable();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Lazy fields, filled in on demand. Require allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _exception_handlers = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _liveness = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 _method_blocks = NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
93 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 _flow = NULL;
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
95 _bcea = NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
96 #endif // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 710
diff changeset
98 ciEnv *env = CURRENT_ENV;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
99 if (env->jvmti_can_hotswap_or_post_breakpoint() && can_be_compiled()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // 6328518 check hotswap conditions under the right lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 MutexLocker locker(Compile_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 if (Dependencies::check_evol_method(h_m()) != NULL) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
103 _is_c1_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
104 _is_c2_compilable = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
110 if (h_m()->method_holder()->is_linked()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 _can_be_statically_bound = h_m()->can_be_statically_bound();
a61af66fc99e Initial load
duke
parents:
diff changeset
112 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Have to use a conservative value in this case.
a61af66fc99e Initial load
duke
parents:
diff changeset
114 _can_be_statically_bound = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Adjust the definition of this condition to be more useful:
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // %%% take these conditions into account in vtable generation
a61af66fc99e Initial load
duke
parents:
diff changeset
119 if (!_can_be_statically_bound && h_m()->is_private())
a61af66fc99e Initial load
duke
parents:
diff changeset
120 _can_be_statically_bound = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 if (_can_be_statically_bound && h_m()->is_abstract())
a61af66fc99e Initial load
duke
parents:
diff changeset
122 _can_be_statically_bound = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // generating _signature may allow GC and therefore move m.
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // These fields are always filled in.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
126 _name = env->get_symbol(h_m()->name());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
127 _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
128 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
129 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
130 _signature = new (env->arena()) ciSignature(_holder, cpool, sig_symbol);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 _method_data = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // Take a snapshot of these values, so they will be commensurate with the MDO.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
133 if (ProfileInterpreter || TieredCompilation) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
134 int invcnt = h_m()->interpreter_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // if the value overflowed report it as max int
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _interpreter_invocation_count = invcnt < 0 ? max_jint : invcnt ;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _interpreter_throwout_count = h_m()->interpreter_throwout_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 _interpreter_invocation_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 _interpreter_throwout_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 if (_interpreter_invocation_count == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
143 _interpreter_invocation_count = 1;
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
144 _instructions_size = -1;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
145 #ifdef ASSERT
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
146 if (ReplayCompiles) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
147 ciReplay::initialize(this);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
148 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
149 #endif
0
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // ciMethod::ciMethod
a61af66fc99e Initial load
duke
parents:
diff changeset
155 //
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Unloaded method.
a61af66fc99e Initial load
duke
parents:
diff changeset
157 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
158 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
159 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
160 ciInstanceKlass* accessor) :
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
161 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
162 _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
163 _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
164 _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
165 _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
166 _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
167 _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
168 _method_data( NULL)
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
169 #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
170 ,
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
171 _flow( NULL),
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
172 _bcea( NULL),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
173 _instructions_size(-1)
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
174 #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
175 {
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 // 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
177 // 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
178 // 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
179 _signature = new (CURRENT_ENV->arena()) ciSignature(accessor, constantPoolHandle(), signature);
0
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // ciMethod::load_code
a61af66fc99e Initial load
duke
parents:
diff changeset
185 //
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Load the bytecodes and exception handler table for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 void ciMethod::load_code() {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 assert(is_loaded(), "only loaded methods have code");
a61af66fc99e Initial load
duke
parents:
diff changeset
190
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
191 Method* me = get_Method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 Arena* arena = CURRENT_THREAD_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Load the bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
195 _code = (address)arena->Amalloc(code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
196 memcpy(_code, me->code_base(), code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // 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
199 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
200 BreakpointInfo* bp = me->method_holder()->breakpoints();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
201 for (; bp != NULL; bp = bp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 if (bp->match(me)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 code_at_put(bp->bci(), bp->orig_bytecode());
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
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // And load the exception table.
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
209 ExceptionTable exc_table(me);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Allocate one extra spot in our list of exceptions. This
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // last entry will be used to represent the possibility that
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // an exception escapes the method. See ciExceptionHandlerStream
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
215 _exception_handlers =
a61af66fc99e Initial load
duke
parents:
diff changeset
216 (ciExceptionHandler**)arena->Amalloc(sizeof(ciExceptionHandler*)
a61af66fc99e Initial load
duke
parents:
diff changeset
217 * (_handler_count + 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
218 if (_handler_count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 for (int i=0; i<_handler_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 _exception_handlers[i] = new (arena) ciExceptionHandler(
a61af66fc99e Initial load
duke
parents:
diff changeset
221 holder(),
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
222 /* start */ exc_table.start_pc(i),
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
223 /* limit */ exc_table.end_pc(i),
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
224 /* goto pc */ exc_table.handler_pc(i),
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 4001
diff changeset
225 /* cp index */ exc_table.catch_type_index(i));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Put an entry at the end of our list to represent the possibility
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // of exceptional exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 _exception_handlers[_handler_count] =
a61af66fc99e Initial load
duke
parents:
diff changeset
232 new (arena) ciExceptionHandler(holder(), 0, code_size(), -1, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (CIPrintMethodCodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 print_codes();
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // ciMethod::has_linenumber_table
a61af66fc99e Initial load
duke
parents:
diff changeset
242 //
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // length unknown until decompression
a61af66fc99e Initial load
duke
parents:
diff changeset
244 bool ciMethod::has_linenumber_table() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
246 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
247 return get_Method()->has_linenumber_table();
0
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // ciMethod::compressed_linenumber_table
a61af66fc99e Initial load
duke
parents:
diff changeset
253 u_char* ciMethod::compressed_linenumber_table() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
255 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
256 return get_Method()->compressed_linenumber_table();
0
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // ciMethod::line_number_from_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
262 int ciMethod::line_number_from_bci(int bci) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
265 return get_Method()->line_number_from_bci(bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // ciMethod::vtable_index
a61af66fc99e Initial load
duke
parents:
diff changeset
271 //
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // Get the position of this method's entry in the vtable, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
273 int ciMethod::vtable_index() {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 assert(holder()->is_linked(), "must be linked");
a61af66fc99e Initial load
duke
parents:
diff changeset
276 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
277 return get_Method()->vtable_index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
281 #ifdef SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
282 // ------------------------------------------------------------------
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
283 // ciMethod::itable_index
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
284 //
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
285 // Get the position of this method's entry in the itable, if any.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
286 int ciMethod::itable_index() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
287 check_is_loaded();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
288 assert(holder()->is_linked(), "must be linked");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
289 VM_ENTRY_MARK;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
290 Method* m = get_Method();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
291 if (!m->has_itable_index())
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
292 return Method::nonvirtual_vtable_index;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10278
diff changeset
293 return m->itable_index();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
294 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
295 #endif // SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
296
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
297
0
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // ciMethod::native_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
300 //
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // Get the address of this method's native code, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
302 address ciMethod::native_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
304 assert(flags().is_native(), "must be native method");
a61af66fc99e Initial load
duke
parents:
diff changeset
305 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
306 Method* method = get_Method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 address entry = method->native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
308 assert(entry != NULL, "must be valid entry point");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 return entry;
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // ciMethod::interpreter_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
315 //
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // Get the entry point for running this method in the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
317 address ciMethod::interpreter_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
320 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
321 return Interpreter::entry_for_method(mh);
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // ciMethod::uses_balanced_monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
327 //
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // Does this method use monitors in a strict stack-disciplined manner?
a61af66fc99e Initial load
duke
parents:
diff changeset
329 bool ciMethod::has_balanced_monitors() {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
331 if (_balanced_monitors) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // Analyze the method to see if monitors are used properly.
a61af66fc99e Initial load
duke
parents:
diff changeset
334 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
335 methodHandle method(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
336 assert(method->has_monitor_bytecodes(), "should have checked this");
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Check to see if a previous compilation computed the
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // monitor-matching analysis.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (method->guaranteed_monitor_matching()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 _balanced_monitors = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 GeneratePairingInfo gpi(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 gpi.compute_map(CATCH);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 if (!gpi.monitor_safe()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 method->set_guaranteed_monitor_matching();
a61af66fc99e Initial load
duke
parents:
diff changeset
354 _balanced_monitors = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 return true;
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // ciMethod::get_flow_analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
362 ciTypeFlow* ciMethod::get_flow_analysis() {
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
363 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
364 if (_flow == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 _flow = new (env->arena()) ciTypeFlow(env, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
367 _flow->do_flow();
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 return _flow;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
370 #else // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
371 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 return NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
373 #endif // COMPILER2 || SHARK
0
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // ciMethod::get_osr_flow_analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
379 ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) {
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
380 #if defined(COMPILER2) || defined(SHARK)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // OSR entry points are always place after a call bytecode of some sort
a61af66fc99e Initial load
duke
parents:
diff changeset
382 assert(osr_bci >= 0, "must supply valid OSR entry point");
a61af66fc99e Initial load
duke
parents:
diff changeset
383 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
384 ciTypeFlow* flow = new (env->arena()) ciTypeFlow(env, this, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
385 flow->do_flow();
a61af66fc99e Initial load
duke
parents:
diff changeset
386 return flow;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
387 #else // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
388 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
389 return NULL;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
390 #endif // COMPILER2 || SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // ------------------------------------------------------------------
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
394 // ciMethod::raw_liveness_at_bci
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395 //
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // 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
397 MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
398 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (_liveness == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Create the liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
401 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
402 _liveness = new (arena) MethodLiveness(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
403 _liveness->compute_liveness();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 }
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
405 return _liveness->get_liveness_at(bci);
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
406 }
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
407
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
408 // ------------------------------------------------------------------
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
409 // ciMethod::liveness_at_bci
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
410 //
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
411 // 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
412 // 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
413 // information.
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
414 MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 780
diff changeset
415 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
416 if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Keep all locals live for the user's edification and amusement.
a61af66fc99e Initial load
duke
parents:
diff changeset
418 result.at_put_range(0, result.size(), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // ciMethod::live_local_oops_at_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
424 //
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // find all the live oops in the locals array for a particular bci
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // Compute what the interpreter believes by using the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // oopmap generator. This is used as a double check during osr to
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // guard against conservative result from MethodLiveness making us
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // think a dead oop is live. MethodLiveness is conservative in the
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // sense that it may consider locals to be live which cannot be live,
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // like in the case where a local could contain an oop or a primitive
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // along different paths. In that case the local must be dead when
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // those paths merge. Since the interpreter's viewpoint is used when
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // gc'ing an interpreter frame we need to use its viewpoint during
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // OSR when loading the locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 BitMap ciMethod::live_local_oops_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
439 InterpreterOopMap mask;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
440 OopMapCache::compute_one_oop_map(get_Method(), bci, &mask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
441 int mask_size = max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
442 BitMap result(mask_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
443 result.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
444 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 for (i = 0; i < mask_size ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 if (mask.is_oop(i)) result.set_bit(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
448 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // ciMethod::bci_block_start
a61af66fc99e Initial load
duke
parents:
diff changeset
455 //
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Marks all bcis where a new basic block starts
a61af66fc99e Initial load
duke
parents:
diff changeset
457 const BitMap ciMethod::bci_block_start() {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
459 if (_liveness == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // Create the liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
461 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
462 _liveness = new (arena) MethodLiveness(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
463 _liveness->compute_liveness();
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 return _liveness->get_bci_block_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468 #endif // COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // ciMethod::call_profile_at_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
473 //
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // Get the ciCallProfile for the invocation of this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // Also reports receiver types for non-call type checks (if TypeProfileCasts).
a61af66fc99e Initial load
duke
parents:
diff changeset
476 ciCallProfile ciMethod::call_profile_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
477 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
478 ciCallProfile result;
a61af66fc99e Initial load
duke
parents:
diff changeset
479 if (method_data() != NULL && method_data()->is_mature()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 ciProfileData* data = method_data()->bci_to_data(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 if (data != NULL && data->is_CounterData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // Every profiled call site has a counter.
a61af66fc99e Initial load
duke
parents:
diff changeset
483 int count = data->as_CounterData()->count();
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 if (!data->is_ReceiverTypeData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 result._receiver_count[0] = 0; // that's a definite zero
a61af66fc99e Initial load
duke
parents:
diff changeset
487 } else { // ReceiverTypeData is a subclass of CounterData
a61af66fc99e Initial load
duke
parents:
diff changeset
488 ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData();
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // In addition, virtual call sites have receiver type information
a61af66fc99e Initial load
duke
parents:
diff changeset
490 int receivers_count_total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 int morphism = 0;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
492 // Precompute morphism for the possible fixup
0
a61af66fc99e Initial load
duke
parents:
diff changeset
493 for (uint i = 0; i < call->row_limit(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 ciKlass* receiver = call->receiver(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if (receiver == NULL) continue;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
496 morphism++;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
497 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
498 int epsilon = 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
499 if (TieredCompilation && ProfileInterpreter) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
500 // Interpreter and C1 treat final and special invokes differently.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
501 // C1 will record a type, whereas the interpreter will just
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
502 // increment the count. Detect this case.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
503 if (morphism == 1 && count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
504 epsilon = count;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
505 count = 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
506 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
507 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
508 for (uint i = 0; i < call->row_limit(); i++) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
509 ciKlass* receiver = call->receiver(i);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
510 if (receiver == NULL) continue;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
511 int rcount = call->receiver_count(i) + epsilon;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
512 if (rcount == 0) rcount = 1; // Should be valid value
a61af66fc99e Initial load
duke
parents:
diff changeset
513 receivers_count_total += rcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // Add the receiver to result data.
a61af66fc99e Initial load
duke
parents:
diff changeset
515 result.add_receiver(receiver, rcount);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // If we extend profiling to record methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // we will set result._method also.
a61af66fc99e Initial load
duke
parents:
diff changeset
518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // Determine call site's morphism.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
520 // 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
521 // 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
522 // 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
523 if (morphism > 0 && morphism == result._limit) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
524 // The morphism <= MorphismLimit.
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
525 if ((morphism < ciCallProfile::MorphismLimit) ||
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
526 (morphism == ciCallProfile::MorphismLimit && count == 0)) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
527 #ifdef ASSERT
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
528 if (count > 0) {
1251
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
529 this->print_short_name(tty);
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
530 tty->print_cr(" @ bci:%d", bci);
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
531 this->print_codes();
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
532 assert(false, "this call site should not be polymorphic");
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
533 }
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
534 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
535 result._morphism = morphism;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Make the count consistent if this is a call profile. If count is
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // zero or less, presume that this is a typecheck profile and
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // do nothing. Otherwise, increase count to be the sum of all
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // receiver's counts.
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
542 if (count >= 0) {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1152
diff changeset
543 count += receivers_count_total;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
546 result._count = count;
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // Add new receiver and sort data by receiver's profile count.
a61af66fc99e Initial load
duke
parents:
diff changeset
554 void ciCallProfile::add_receiver(ciKlass* receiver, int receiver_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // Add new receiver and sort data by receiver's counts when we have space
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // for it otherwise replace the less called receiver (less called receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // is placed to the last array element which is not used).
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // First array's element contains most called receiver.
a61af66fc99e Initial load
duke
parents:
diff changeset
559 int i = _limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
560 for (; i > 0 && receiver_count > _receiver_count[i-1]; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
561 _receiver[i] = _receiver[i-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
562 _receiver_count[i] = _receiver_count[i-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
564 _receiver[i] = receiver;
a61af66fc99e Initial load
duke
parents:
diff changeset
565 _receiver_count[i] = receiver_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
566 if (_limit < MorphismLimit) _limit++;
a61af66fc99e Initial load
duke
parents:
diff changeset
567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
568
12966
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
569
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
570 void ciMethod::assert_virtual_call_type_ok(int bci) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
571 assert(java_code_at_bci(bci) == Bytecodes::_invokevirtual ||
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
572 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
573 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
574
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
575 void ciMethod::assert_call_type_ok(int bci) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
576 assert(java_code_at_bci(bci) == Bytecodes::_invokestatic ||
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
577 java_code_at_bci(bci) == Bytecodes::_invokespecial ||
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
578 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
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 /**
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
582 * 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
583 * call at bci bci
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
584 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
585 * @param bci bci of the call
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
586 * @param i argument number
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
587 * @return profiled type
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
588 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
589 * 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
590 * at least for now.
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
591 */
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
592 ciKlass* ciMethod::argument_profiled_type(int bci, int i) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
593 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
594 ciProfileData* data = method_data()->bci_to_data(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
595 if (data != NULL) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
596 if (data->is_VirtualCallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
597 assert_virtual_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
598 ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
599 if (i >= call->number_of_arguments()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
600 return NULL;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
601 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
602 ciKlass* type = call->valid_argument_type(i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
603 if (type != NULL && !call->argument_maybe_null(i)) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
604 return type;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
605 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
606 } else if (data->is_CallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
607 assert_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
608 ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
609 if (i >= call->number_of_arguments()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
610 return NULL;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
611 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
612 ciKlass* type = call->valid_argument_type(i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
613 if (type != NULL && !call->argument_maybe_null(i)) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
614 return type;
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 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
619 return NULL;
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 /**
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
623 * 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
624 * the call at bci bci
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
625 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
626 * @param bci bci of the call
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
627 * @return profiled type
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
628 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
629 * 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
630 * at least for now.
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
631 */
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
632 ciKlass* ciMethod::return_profiled_type(int bci) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
633 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
634 ciProfileData* data = method_data()->bci_to_data(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
635 if (data != NULL) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
636 if (data->is_VirtualCallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
637 assert_virtual_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
638 ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
639 ciKlass* type = call->valid_return_type();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
640 if (type != NULL && !call->return_maybe_null()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
641 return type;
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
642 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
643 } else if (data->is_CallTypeData()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
644 assert_call_type_ok(bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
645 ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
646 ciKlass* type = call->valid_return_type();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
647 if (type != NULL && !call->return_maybe_null()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
648 return type;
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 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
653 return NULL;
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 /**
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
657 * Check whether profiling provides a type for the parameter i
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
658 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
659 * @param i parameter number
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
660 * @return profiled type
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
661 *
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
662 * 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
663 * at least for now.
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
664 */
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
665 ciKlass* ciMethod::parameter_profiled_type(int i) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
666 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
667 ciParametersTypeData* parameters = method_data()->parameters_type_data();
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
668 if (parameters != NULL && i < parameters->number_of_parameters()) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
669 ciKlass* type = parameters->valid_parameter_type(i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
670 if (type != NULL && !parameters->parameter_maybe_null(i)) {
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
671 return type;
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 }
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
675 return NULL;
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
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
678
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // ciMethod::find_monomorphic_target
a61af66fc99e Initial load
duke
parents:
diff changeset
681 //
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // Given a certain calling environment, find the monomorphic target
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // for the call. Return NULL if the call is not monomorphic in
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // its calling environment, or if there are only abstract methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // The returned method is never abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // Note: If caller uses a non-null result, it must inform dependencies
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // via assert_unique_concrete_method or assert_leaf_type.
a61af66fc99e Initial load
duke
parents:
diff changeset
688 ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
689 ciInstanceKlass* callee_holder,
a61af66fc99e Initial load
duke
parents:
diff changeset
690 ciInstanceKlass* actual_recv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
691 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 if (actual_recv->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // %%% We cannot trust interface types, yet. See bug 6312651.
a61af66fc99e Initial load
duke
parents:
diff changeset
695 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 ciMethod* root_m = resolve_invoke(caller, actual_recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (root_m == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // Something went wrong looking up the actual receiver method.
a61af66fc99e Initial load
duke
parents:
diff changeset
701 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 assert(!root_m->is_abstract(), "resolve_invoke promise");
a61af66fc99e Initial load
duke
parents:
diff changeset
704
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // Make certain quick checks even if UseCHA is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // Is it private or final?
a61af66fc99e Initial load
duke
parents:
diff changeset
708 if (root_m->can_be_statically_bound()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 if (actual_recv->is_leaf_type() && actual_recv == root_m->holder()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // Easy case. There is no other place to put a method, so don't bother
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // to go through the VM_ENTRY_MARK and all the rest.
a61af66fc99e Initial load
duke
parents:
diff changeset
715 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
717
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // Array methods (clone, hashCode, etc.) are always statically bound.
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // If we were to see an array type here, we'd return root_m.
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // However, this method processes only ciInstanceKlasses. (See 4962591.)
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // The inline_native_clone intrinsic narrows Object to T[] properly,
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // so there is no need to do the same job here.
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724 if (!UseCHA) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
727
17521
e46f2ee62e78 8036100: Default method returns true for a while, and then returns false
vlivanov
parents: 12966
diff changeset
728 // Disable CHA for default methods for now
e46f2ee62e78 8036100: Default method returns true for a while, and then returns false
vlivanov
parents: 12966
diff changeset
729 if (root_m->get_Method()->is_default_method()) {
e46f2ee62e78 8036100: Default method returns true for a while, and then returns false
vlivanov
parents: 12966
diff changeset
730 return NULL;
e46f2ee62e78 8036100: Default method returns true for a while, and then returns false
vlivanov
parents: 12966
diff changeset
731 }
e46f2ee62e78 8036100: Default method returns true for a while, and then returns false
vlivanov
parents: 12966
diff changeset
732
0
a61af66fc99e Initial load
duke
parents:
diff changeset
733 methodHandle target;
a61af66fc99e Initial load
duke
parents:
diff changeset
734 {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 MutexLocker locker(Compile_lock);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
736 Klass* context = actual_recv->get_Klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
737 target = Dependencies::find_unique_concrete_method(context,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
738 root_m->get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742 #ifndef PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
743 if (TraceDependencies && target() != NULL && target() != root_m->get_Method()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
744 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
745 tty->print_cr(" context = %s", InstanceKlass::cast(actual_recv->get_Klass())->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
746 tty->print(" method = ");
a61af66fc99e Initial load
duke
parents:
diff changeset
747 target->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
748 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (target() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
755 if (target() == root_m->get_Method()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
756 return root_m;
a61af66fc99e Initial load
duke
parents:
diff changeset
757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
758 if (!root_m->is_public() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
759 !root_m->is_protected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // If we are going to reason about inheritance, it's easiest
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // if the method in question is public, protected, or private.
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // If the answer is not root_m, it is conservatively correct
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // to return NULL, even if the CHA encountered irrelevant
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // methods in other packages.
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // %%% TO DO: Work out logic for package-private methods
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // with the same name but different vtable indexes.
a61af66fc99e Initial load
duke
parents:
diff changeset
767 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
769 return CURRENT_THREAD_ENV->get_method(target());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
771
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // ciMethod::resolve_invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
774 //
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // Given a known receiver klass, find the target for the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // Return NULL if the call has no target or the target is abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
777 ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
779 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
780
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
781 KlassHandle caller_klass (THREAD, caller->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
782 KlassHandle h_recv (THREAD, exact_receiver->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
783 KlassHandle h_resolved (THREAD, holder()->get_Klass());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
784 Symbol* h_name = name()->get_symbol();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
785 Symbol* h_signature = signature()->get_symbol();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 methodHandle m;
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Only do exact lookup if receiver klass has been linked. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
789 // 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
790 if (h_recv->oop_is_array()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
791 ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
792 InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
793 if (holder()->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
794 m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
795 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
796 m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 if (m.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
802 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
804
a61af66fc99e Initial load
duke
parents:
diff changeset
805 ciMethod* result = this;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
806 if (m() != get_Method()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
807 result = CURRENT_THREAD_ENV->get_method(m());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // Don't return abstract methods because they aren't
a61af66fc99e Initial load
duke
parents:
diff changeset
811 // optimizable or interesting.
a61af66fc99e Initial load
duke
parents:
diff changeset
812 if (result->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
813 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // ciMethod::resolve_vtable_index
a61af66fc99e Initial load
duke
parents:
diff changeset
821 //
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // 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
823 // Return Method::invalid_vtable_index if the vtable_index is unknown.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
824 int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
a61af66fc99e Initial load
duke
parents:
diff changeset
825 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
826
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
827 int vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // Only do lookup if receiver klass has been linked. Otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
829 // the vtable has not been setup, and the LinkResolver will fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
830 if (!receiver->is_interface()
a61af66fc99e Initial load
duke
parents:
diff changeset
831 && (!receiver->is_instance_klass() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
832 receiver->as_instance_klass()->is_linked())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
833 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
834
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
835 KlassHandle caller_klass (THREAD, caller->get_Klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
836 KlassHandle h_recv (THREAD, receiver->get_Klass());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
837 Symbol* h_name = name()->get_symbol();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2007
diff changeset
838 Symbol* h_signature = signature()->get_symbol();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 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
841 if (vtable_index == Method::nonvirtual_vtable_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // 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
843 vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 return vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
848 }
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // ciMethod::interpreter_call_site_count
a61af66fc99e Initial load
duke
parents:
diff changeset
852 int ciMethod::interpreter_call_site_count(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 if (method_data() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
854 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
855 ciProfileData* data = method_data()->bci_to_data(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
856 if (data != NULL && data->is_CounterData()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 return scale_count(data->as_CounterData()->count());
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
860 return -1; // unknown
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // ------------------------------------------------------------------
7194
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
864 // ciMethod::get_field_at_bci
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
865 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
866 ciBytecodeStream iter(this);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
867 iter.reset_to_bci(bci);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
868 iter.next();
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
869 return iter.get_field(will_link);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
870 }
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
871
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
872 // ------------------------------------------------------------------
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
873 // ciMethod::get_method_at_bci
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
874 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
875 ciBytecodeStream iter(this);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
876 iter.reset_to_bci(bci);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
877 iter.next();
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
878 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
879 }
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
880
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
881 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 // Adjust a CounterData count to be commensurate with
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // interpreter_invocation_count. If the MDO exists for
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // only 25% of the time the method exists, then the
a61af66fc99e Initial load
duke
parents:
diff changeset
885 // counts in the MDO should be scaled by 4X, so that
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // they can be usefully and stably compared against the
a61af66fc99e Initial load
duke
parents:
diff changeset
887 // invocation counts in methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
888 int ciMethod::scale_count(int count, float prof_factor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
889 if (count > 0 && method_data() != NULL) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
890 int counter_life;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
891 int method_life = interpreter_invocation_count();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
892 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
893 // In tiered the MDO's life is measured directly, so just use the snapshotted counters
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
894 counter_life = MAX2(method_data()->invocation_count(), method_data()->backedge_count());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
895 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
896 int current_mileage = method_data()->current_mileage();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
897 int creation_mileage = method_data()->creation_mileage();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
898 counter_life = current_mileage - creation_mileage;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
899 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
900
0
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // counter_life due to backedge_counter could be > method_life
a61af66fc99e Initial load
duke
parents:
diff changeset
902 if (counter_life > method_life)
a61af66fc99e Initial load
duke
parents:
diff changeset
903 counter_life = method_life;
a61af66fc99e Initial load
duke
parents:
diff changeset
904 if (0 < counter_life && counter_life <= method_life) {
a61af66fc99e Initial load
duke
parents:
diff changeset
905 count = (int)((double)count * prof_factor * method_life / counter_life + 0.5);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 count = (count > 0) ? count : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
911
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
912
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
913 // ------------------------------------------------------------------
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
914 // ciMethod::is_special_get_caller_class_method
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 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
917 check_is_loaded();
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
918 VM_ENTRY_MARK;
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
919 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
920 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
921
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
922
0
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // ------------------------------------------------------------------
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
924 // invokedynamic support
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
925
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
926 // ------------------------------------------------------------------
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
927 // ciMethod::is_method_handle_intrinsic
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
928 //
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
929 // 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
930 // 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
931 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
932 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
933 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
934 MethodHandles::is_signature_polymorphic_intrinsic(iid));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
935 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
936
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
937 // ------------------------------------------------------------------
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
938 // ciMethod::is_compiled_lambda_form
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
939 //
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1251
diff changeset
940 // 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
941 // 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
942 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
943 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
944 return iid == vmIntrinsics::_compiledLambdaForm;
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1137
diff changeset
945 }
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1137
diff changeset
946
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
947 // ------------------------------------------------------------------
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
948 // ciMethod::has_member_arg
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
949 //
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
950 // 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
951 // 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
952 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
953 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
954 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
955 MethodHandles::has_member_arg(iid));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
956 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
957
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 196
diff changeset
958 // ------------------------------------------------------------------
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
959 // ciMethod::ensure_method_data
0
a61af66fc99e Initial load
duke
parents:
diff changeset
960 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
961 // 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
962 // 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
963 bool ciMethod::ensure_method_data(methodHandle h_m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
964 EXCEPTION_CONTEXT;
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
965 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
966 return true;
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
967 }
0
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::build_interpreter_method_data(h_m, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
970 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
971 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
972 }
a61af66fc99e Initial load
duke
parents:
diff changeset
973 }
a61af66fc99e Initial load
duke
parents:
diff changeset
974 if (h_m()->method_data() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
975 _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
976 _method_data->load_data();
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
977 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
978 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
979 _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
980 return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
981 }
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // public, retroactive version
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
985 bool ciMethod::ensure_method_data() {
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
986 bool result = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 if (_method_data == NULL || _method_data->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
988 GUARDED_VM_ENTRY({
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
989 result = ensure_method_data(get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
990 });
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
992 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // ciMethod::method_data
a61af66fc99e Initial load
duke
parents:
diff changeset
998 //
a61af66fc99e Initial load
duke
parents:
diff changeset
999 ciMethodData* ciMethod::method_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 if (_method_data != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 ciEnv* env = CURRENT_ENV;
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 Thread* my_thread = JavaThread::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1006 methodHandle h_m(my_thread, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 if (h_m()->method_data() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1009 _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 _method_data->load_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 _method_data = CURRENT_ENV->get_empty_methodData();
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1017
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1018 // ------------------------------------------------------------------
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1019 // ciMethod::method_data_or_null
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1020 // 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
1021 // NULL otherwise.
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1022 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
1023 ciMethodData *md = method_data();
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1024 if (md->is_empty()) {
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1025 return NULL;
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1026 }
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1027 return md;
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
1028 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // ------------------------------------------------------------------
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1031 // ciMethod::ensure_method_counters
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1032 //
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1033 MethodCounters* ciMethod::ensure_method_counters() {
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1034 check_is_loaded();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1035 VM_ENTRY_MARK;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1036 methodHandle mh(THREAD, get_Method());
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12865
diff changeset
1037 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
1038 return method_counters;
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1039 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1040
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1041 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // ciMethod::should_exclude
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 // Should this method be excluded from compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 bool ciMethod::should_exclude() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1048 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 bool ignore;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 return CompilerOracle::should_exclude(mh, ignore);
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // ciMethod::should_inline
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // Should this method be inlined during compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 bool ciMethod::should_inline() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1060 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 return CompilerOracle::should_inline(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // ciMethod::should_not_inline
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // Should this method be disallowed from inlining during compilation?
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 bool ciMethod::should_not_inline() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1071 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 return CompilerOracle::should_not_inline(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // ciMethod::should_print_assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Should the compiler print the generated code for this method?
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 bool ciMethod::should_print_assembly() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1082 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 return CompilerOracle::should_print(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // ciMethod::break_at_execute
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // Should the compiler insert a breakpoint into the generated code
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // method?
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 bool ciMethod::break_at_execute() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1094 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 return CompilerOracle::should_break_at(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // ciMethod::has_option
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 bool ciMethod::has_option(const char* option) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1104 methodHandle mh(THREAD, get_Method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 return CompilerOracle::has_option_string(mh, option);
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // ------------------------------------------------------------------
20430
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1109 // ciMethod::has_option_value
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1110 //
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1111 template<typename T>
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1112 bool ciMethod::has_option_value(const char* option, T& value) {
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1113 check_is_loaded();
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1114 VM_ENTRY_MARK;
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1115 methodHandle mh(THREAD, get_Method());
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1116 return CompilerOracle::has_option_value(mh, option, value);
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1117 }
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1118 // Explicit instantiation for all OptionTypes supported.
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1119 template bool ciMethod::has_option_value<intx>(const char* option, intx& value);
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1120 template bool ciMethod::has_option_value<uintx>(const char* option, uintx& value);
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1121 template bool ciMethod::has_option_value<bool>(const char* option, bool& value);
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1122 template bool ciMethod::has_option_value<ccstr>(const char* option, ccstr& value);
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1123
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
1124 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // ciMethod::can_be_compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // Have previous compilations of this method succeeded?
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 bool ciMethod::can_be_compiled() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 check_is_loaded();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1130 ciEnv* env = CURRENT_ENV;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1131 if (is_c1_compile(env->comp_level())) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1132 return _is_c1_compilable;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1133 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1134 return _is_c2_compilable;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1136
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 // ciMethod::set_not_compilable
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 // 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
1141 void ciMethod::set_not_compilable(const char* reason) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 VM_ENTRY_MARK;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1144 ciEnv* env = CURRENT_ENV;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1145 if (is_c1_compile(env->comp_level())) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1146 _is_c1_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1147 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1148 _is_c2_compilable = false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1149 }
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7990
diff changeset
1150 get_Method()->set_not_compilable(env->comp_level(), true, reason);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 // ciMethod::can_be_osr_compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // Have previous compilations of this method succeeded?
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 // Implementation note: the VM does not currently keep track
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 // of failed OSR compilations per bci. The entry_bci parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // is currently unused.
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 bool ciMethod::can_be_osr_compiled(int entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 VM_ENTRY_MARK;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1164 ciEnv* env = CURRENT_ENV;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1165 return !get_Method()->is_not_osr_compilable(env->comp_level());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // ciMethod::has_compiled_code
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 bool ciMethod::has_compiled_code() {
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1171 return instructions_size() > 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1174 int ciMethod::comp_level() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1175 check_is_loaded();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1176 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1177 nmethod* nm = get_Method()->code();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1178 if (nm != NULL) return nm->comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1179 return 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1180 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1181
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1182 int ciMethod::highest_osr_comp_level() {
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1183 check_is_loaded();
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1184 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1185 return get_Method()->highest_osr_comp_level();
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1186 }
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3785
diff changeset
1187
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 // ------------------------------------------------------------------
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1189 // ciMethod::code_size_for_inlining
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1190 //
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1191 // 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
1192 // 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
1193 int ciMethod::code_size_for_inlining() {
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1194 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1195 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
1196 return 1;
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1197 }
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1198 return code_size();
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1199 }
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1200
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
1201 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // ciMethod::instructions_size
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1203 //
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1204 // This is a rough metric for "fat" methods, compared before inlining
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1205 // with InlineSmallCode. The CodeBlob::code_size accessor includes
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1206 // junk like exception handler, stubs, and constant table, which are
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1207 // not highly relevant to an inlined method. So we use the more
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1692
diff changeset
1208 // specific accessor nmethod::insts_size.
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1209 int ciMethod::instructions_size() {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1210 if (_instructions_size == -1) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1211 GUARDED_VM_ENTRY(
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1212 nmethod* code = get_Method()->code();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1213 if (code != NULL && (code->comp_level() == CompLevel_full_optimization)) {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1214 _instructions_size = code->insts_end() - code->verified_entry_point();
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1215 } else {
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1216 _instructions_size = 0;
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1217 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1218 );
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1219 }
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1220 return _instructions_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // ciMethod::log_nmethod_identity
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 void ciMethod::log_nmethod_identity(xmlStream* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 GUARDED_VM_ENTRY(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1227 nmethod* code = get_Method()->code();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 if (code != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 code->log_identity(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1233
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // ciMethod::is_not_reached
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 bool ciMethod::is_not_reached(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 check_is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 return Interpreter::is_not_reached(
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1240 methodHandle(THREAD, get_Method()), bci);
0
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 // ciMethod::was_never_executed
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 bool ciMethod::was_executed_more_than(int times) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1247 return get_Method()->was_executed_more_than(times);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1249
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // ciMethod::has_unloaded_classes_in_signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 bool ciMethod::has_unloaded_classes_in_signature() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 EXCEPTION_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1256 methodHandle m(THREAD, get_Method());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1257 bool has_unloaded = Method::has_unloaded_classes_in_signature(m, (JavaThread *)THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 if( HAS_PENDING_EXCEPTION ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 return true; // Declare that we may have unloaded classes
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 return has_unloaded;
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1265
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 // ciMethod::is_klass_loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 VM_ENTRY_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1270 return get_Method()->is_klass_loaded(refinfo_index, must_be_resolved);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 // ciMethod::check_call
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 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
1276 // 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
1277 // 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
1278 // 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
1279 // FIXME: Remove this method and resolve_method_statically; refactor to use the other LinkResolver entry points.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 HandleMark hm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1284 constantPoolHandle pool (THREAD, get_Method()->constants());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 methodHandle spec_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 KlassHandle spec_klass;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1287 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
1288 LinkResolver::resolve_method_statically(spec_method, spec_klass, code, pool, refinfo_index, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 return (spec_method->is_static() == is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1298
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 // ciMethod::print_codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // Print the bytecodes for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 void ciMethod::print_codes_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1305 GUARDED_VM_ENTRY(get_Method()->print_codes_on(st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1307
a61af66fc99e Initial load
duke
parents:
diff changeset
1308
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 #define FETCH_FLAG_FROM_VM(flag_accessor) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 check_is_loaded(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 VM_ENTRY_MARK; \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1312 return get_Method()->flag_accessor(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1314
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 bool ciMethod::is_empty_method() const { FETCH_FLAG_FROM_VM(is_empty_method); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 bool ciMethod::is_vanilla_constructor() const { FETCH_FLAG_FROM_VM(is_vanilla_constructor); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 bool ciMethod::has_loops () const { FETCH_FLAG_FROM_VM(has_loops); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 bool ciMethod::has_jsrs () const { FETCH_FLAG_FROM_VM(has_jsrs); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 bool ciMethod::is_accessor () const { FETCH_FLAG_FROM_VM(is_accessor); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 bool ciMethod::is_initializer () const { FETCH_FLAG_FROM_VM(is_initializer); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1321
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1322 bool ciMethod::is_boxing_method() const {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1323 if (holder()->is_box_klass()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1324 switch (intrinsic_id()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1325 case vmIntrinsics::_Boolean_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1326 case vmIntrinsics::_Byte_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1327 case vmIntrinsics::_Character_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1328 case vmIntrinsics::_Short_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1329 case vmIntrinsics::_Integer_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1330 case vmIntrinsics::_Long_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1331 case vmIntrinsics::_Float_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1332 case vmIntrinsics::_Double_valueOf:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1333 return true;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1334 default:
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 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1338 return false;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1339 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1340
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1341 bool ciMethod::is_unboxing_method() const {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1342 if (holder()->is_box_klass()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1343 switch (intrinsic_id()) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1344 case vmIntrinsics::_booleanValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1345 case vmIntrinsics::_byteValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1346 case vmIntrinsics::_charValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1347 case vmIntrinsics::_shortValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1348 case vmIntrinsics::_intValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1349 case vmIntrinsics::_longValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1350 case vmIntrinsics::_floatValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1351 case vmIntrinsics::_doubleValue:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1352 return true;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1353 default:
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1354 return false;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1355 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1356 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1357 return false;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1358 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10105
diff changeset
1359
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 BCEscapeAnalyzer *ciMethod::get_bcea() {
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1361 #ifdef COMPILER2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 if (_bcea == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 _bcea = new (CURRENT_ENV->arena()) BCEscapeAnalyzer(this, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 return _bcea;
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1366 #else // COMPILER2
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1367 ShouldNotReachHere();
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1368 return NULL;
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1579
diff changeset
1369 #endif // COMPILER2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 ciMethodBlocks *ciMethod::get_method_blocks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 Arena *arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 if (_method_blocks == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 _method_blocks = new (arena) ciMethodBlocks(arena, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 return _method_blocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1379
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 #undef FETCH_FLAG_FROM_VM
a61af66fc99e Initial load
duke
parents:
diff changeset
1381
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1382 void ciMethod::dump_name_as_ascii(outputStream* st) {
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1383 Method* method = get_Method();
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1384 st->print("%s %s %s",
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1385 method->klass_name()->as_quoted_ascii(),
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1386 method->name()->as_quoted_ascii(),
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1387 method->signature()->as_quoted_ascii());
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1388 }
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1389
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1390 void ciMethod::dump_replay_data(outputStream* st) {
7990
fcc9e7681d63 8006410: allocating without ResourceMark when CompileCommand was specified
vlivanov
parents: 7194
diff changeset
1391 ResourceMark rm;
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1392 Method* method = get_Method();
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
1393 MethodCounters* mcs = method->method_counters();
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1394 st->print("ciMethod ");
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1395 dump_name_as_ascii(st);
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
1396 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
1397 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
1398 mcs == NULL ? 0 : mcs->backedge_counter()->raw_counter(),
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1399 interpreter_invocation_count(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1400 interpreter_throwout_count(),
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1401 _instructions_size);
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
1402 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 // ciMethod::print_codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 // Print a range of the bytecodes for this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 void ciMethod::print_codes_on(int from, int to, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1410 GUARDED_VM_ENTRY(get_Method()->print_codes_on(from, to, st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1412
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // ciMethod::print_name
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 // Print the name of this method, including signature and some flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 void ciMethod::print_name(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 check_is_loaded();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1419 GUARDED_VM_ENTRY(get_Method()->print_name(st);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // ciMethod::print_short_name
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 // Print the name of this method, without signature.
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 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
1427 if (is_loaded()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1428 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
1429 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1430 // 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
1431 holder()->print_name_on(st);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1432 st->print("::");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1433 name()->print_symbol_on(st);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1434 if (WizardMode)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6213
diff changeset
1435 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
1436 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1438
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 // ciMethod::print_impl
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 // Implementation of the print method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 void ciMethod::print_impl(outputStream* st) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6634
diff changeset
1444 ciMetadata::print_impl(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 st->print(" name=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 st->print(" holder=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 holder()->print_name_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 st->print(" signature=");
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 signature()->as_symbol()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 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
1452 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
1453 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
1454 st->print(" flags=");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 flags().print_member_flags(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 st->print(" loaded=false");
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 }