annotate src/share/vm/ci/ciMethod.cpp @ 2007:5ddfcf4b079e

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