1 | /* |
2 | * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #include "precompiled.hpp" |
26 | #include "ci/ciCallProfile.hpp" |
27 | #include "ci/ciExceptionHandler.hpp" |
28 | #include "ci/ciInstanceKlass.hpp" |
29 | #include "ci/ciMethod.hpp" |
30 | #include "ci/ciMethodBlocks.hpp" |
31 | #include "ci/ciMethodData.hpp" |
32 | #include "ci/ciStreams.hpp" |
33 | #include "ci/ciSymbol.hpp" |
34 | #include "ci/ciReplay.hpp" |
35 | #include "ci/ciUtilities.inline.hpp" |
36 | #include "classfile/systemDictionary.hpp" |
37 | #include "compiler/abstractCompiler.hpp" |
38 | #include "compiler/methodLiveness.hpp" |
39 | #include "interpreter/interpreter.hpp" |
40 | #include "interpreter/linkResolver.hpp" |
41 | #include "interpreter/oopMapCache.hpp" |
42 | #include "memory/allocation.inline.hpp" |
43 | #include "memory/resourceArea.hpp" |
44 | #include "oops/generateOopMap.hpp" |
45 | #include "oops/method.inline.hpp" |
46 | #include "oops/oop.inline.hpp" |
47 | #include "prims/nativeLookup.hpp" |
48 | #include "runtime/deoptimization.hpp" |
49 | #include "runtime/handles.inline.hpp" |
50 | #include "utilities/bitMap.inline.hpp" |
51 | #include "utilities/xmlstream.hpp" |
52 | #ifdef COMPILER2 |
53 | #include "ci/bcEscapeAnalyzer.hpp" |
54 | #include "ci/ciTypeFlow.hpp" |
55 | #include "oops/method.hpp" |
56 | #endif |
57 | |
58 | // ciMethod |
59 | // |
60 | // This class represents a Method* in the HotSpot virtual |
61 | // machine. |
62 | |
63 | |
64 | // ------------------------------------------------------------------ |
65 | // ciMethod::ciMethod |
66 | // |
67 | // Loaded method. |
68 | ciMethod::ciMethod(const methodHandle& h_m, ciInstanceKlass* holder) : |
69 | ciMetadata(h_m()), |
70 | _holder(holder) |
71 | { |
72 | assert(h_m() != NULL, "no null method" ); |
73 | |
74 | if (LogTouchedMethods) { |
75 | h_m()->log_touched(Thread::current()); |
76 | } |
77 | // These fields are always filled in in loaded methods. |
78 | _flags = ciFlags(h_m()->access_flags()); |
79 | |
80 | // Easy to compute, so fill them in now. |
81 | _max_stack = h_m()->max_stack(); |
82 | _max_locals = h_m()->max_locals(); |
83 | _code_size = h_m()->code_size(); |
84 | _intrinsic_id = h_m()->intrinsic_id(); |
85 | _handler_count = h_m()->exception_table_length(); |
86 | _size_of_parameters = h_m()->size_of_parameters(); |
87 | _uses_monitors = h_m()->access_flags().has_monitor_bytecodes(); |
88 | _balanced_monitors = !_uses_monitors || h_m()->access_flags().is_monitor_matching(); |
89 | _is_c1_compilable = !h_m()->is_not_c1_compilable(); |
90 | _is_c2_compilable = !h_m()->is_not_c2_compilable(); |
91 | _can_be_parsed = true; |
92 | _has_reserved_stack_access = h_m()->has_reserved_stack_access(); |
93 | _is_overpass = h_m()->is_overpass(); |
94 | // Lazy fields, filled in on demand. Require allocation. |
95 | _code = NULL; |
96 | _exception_handlers = NULL; |
97 | _liveness = NULL; |
98 | _method_blocks = NULL; |
99 | #if defined(COMPILER2) |
100 | _flow = NULL; |
101 | _bcea = NULL; |
102 | #endif // COMPILER2 |
103 | |
104 | ciEnv *env = CURRENT_ENV; |
105 | if (env->jvmti_can_hotswap_or_post_breakpoint()) { |
106 | // 6328518 check hotswap conditions under the right lock. |
107 | MutexLocker locker(Compile_lock); |
108 | if (Dependencies::check_evol_method(h_m()) != NULL) { |
109 | _is_c1_compilable = false; |
110 | _is_c2_compilable = false; |
111 | _can_be_parsed = false; |
112 | } |
113 | } else { |
114 | CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops()); |
115 | } |
116 | |
117 | if (h_m()->method_holder()->is_linked()) { |
118 | _can_be_statically_bound = h_m()->can_be_statically_bound(); |
119 | } else { |
120 | // Have to use a conservative value in this case. |
121 | _can_be_statically_bound = false; |
122 | } |
123 | |
124 | // Adjust the definition of this condition to be more useful: |
125 | // %%% take these conditions into account in vtable generation |
126 | if (!_can_be_statically_bound && h_m()->is_private()) |
127 | _can_be_statically_bound = true; |
128 | if (_can_be_statically_bound && h_m()->is_abstract()) |
129 | _can_be_statically_bound = false; |
130 | |
131 | // generating _signature may allow GC and therefore move m. |
132 | // These fields are always filled in. |
133 | _name = env->get_symbol(h_m()->name()); |
134 | ciSymbol* sig_symbol = env->get_symbol(h_m()->signature()); |
135 | constantPoolHandle cpool = h_m()->constants(); |
136 | _signature = new (env->arena()) ciSignature(_holder, cpool, sig_symbol); |
137 | _method_data = NULL; |
138 | _nmethod_age = h_m()->nmethod_age(); |
139 | // Take a snapshot of these values, so they will be commensurate with the MDO. |
140 | if (ProfileInterpreter || TieredCompilation) { |
141 | int invcnt = h_m()->interpreter_invocation_count(); |
142 | // if the value overflowed report it as max int |
143 | _interpreter_invocation_count = invcnt < 0 ? max_jint : invcnt ; |
144 | _interpreter_throwout_count = h_m()->interpreter_throwout_count(); |
145 | } else { |
146 | _interpreter_invocation_count = 0; |
147 | _interpreter_throwout_count = 0; |
148 | } |
149 | if (_interpreter_invocation_count == 0) |
150 | _interpreter_invocation_count = 1; |
151 | _instructions_size = -1; |
152 | #ifdef ASSERT |
153 | if (ReplayCompiles) { |
154 | ciReplay::initialize(this); |
155 | } |
156 | #endif |
157 | } |
158 | |
159 | |
160 | // ------------------------------------------------------------------ |
161 | // ciMethod::ciMethod |
162 | // |
163 | // Unloaded method. |
164 | ciMethod::ciMethod(ciInstanceKlass* holder, |
165 | ciSymbol* name, |
166 | ciSymbol* signature, |
167 | ciInstanceKlass* accessor) : |
168 | ciMetadata((Metadata*)NULL), |
169 | _name( name), |
170 | _holder( holder), |
171 | _method_data( NULL), |
172 | _method_blocks( NULL), |
173 | _intrinsic_id( vmIntrinsics::_none), |
174 | _instructions_size(-1), |
175 | _can_be_statically_bound(false), |
176 | _liveness( NULL) |
177 | #if defined(COMPILER2) |
178 | , |
179 | _flow( NULL), |
180 | _bcea( NULL) |
181 | #endif // COMPILER2 |
182 | { |
183 | // Usually holder and accessor are the same type but in some cases |
184 | // the holder has the wrong class loader (e.g. invokedynamic call |
185 | // sites) so we pass the accessor. |
186 | _signature = new (CURRENT_ENV->arena()) ciSignature(accessor, constantPoolHandle(), signature); |
187 | } |
188 | |
189 | |
190 | // ------------------------------------------------------------------ |
191 | // ciMethod::load_code |
192 | // |
193 | // Load the bytecodes and exception handler table for this method. |
194 | void ciMethod::load_code() { |
195 | VM_ENTRY_MARK; |
196 | assert(is_loaded(), "only loaded methods have code" ); |
197 | |
198 | Method* me = get_Method(); |
199 | Arena* arena = CURRENT_THREAD_ENV->arena(); |
200 | |
201 | // Load the bytecodes. |
202 | _code = (address)arena->Amalloc(code_size()); |
203 | memcpy(_code, me->code_base(), code_size()); |
204 | |
205 | #if INCLUDE_JVMTI |
206 | // Revert any breakpoint bytecodes in ci's copy |
207 | if (me->number_of_breakpoints() > 0) { |
208 | BreakpointInfo* bp = me->method_holder()->breakpoints(); |
209 | for (; bp != NULL; bp = bp->next()) { |
210 | if (bp->match(me)) { |
211 | code_at_put(bp->bci(), bp->orig_bytecode()); |
212 | } |
213 | } |
214 | } |
215 | #endif |
216 | |
217 | // And load the exception table. |
218 | ExceptionTable exc_table(me); |
219 | |
220 | // Allocate one extra spot in our list of exceptions. This |
221 | // last entry will be used to represent the possibility that |
222 | // an exception escapes the method. See ciExceptionHandlerStream |
223 | // for details. |
224 | _exception_handlers = |
225 | (ciExceptionHandler**)arena->Amalloc(sizeof(ciExceptionHandler*) |
226 | * (_handler_count + 1)); |
227 | if (_handler_count > 0) { |
228 | for (int i=0; i<_handler_count; i++) { |
229 | _exception_handlers[i] = new (arena) ciExceptionHandler( |
230 | holder(), |
231 | /* start */ exc_table.start_pc(i), |
232 | /* limit */ exc_table.end_pc(i), |
233 | /* goto pc */ exc_table.handler_pc(i), |
234 | /* cp index */ exc_table.catch_type_index(i)); |
235 | } |
236 | } |
237 | |
238 | // Put an entry at the end of our list to represent the possibility |
239 | // of exceptional exit. |
240 | _exception_handlers[_handler_count] = |
241 | new (arena) ciExceptionHandler(holder(), 0, code_size(), -1, 0); |
242 | |
243 | if (CIPrintMethodCodes) { |
244 | print_codes(); |
245 | } |
246 | } |
247 | |
248 | |
249 | // ------------------------------------------------------------------ |
250 | // ciMethod::has_linenumber_table |
251 | // |
252 | // length unknown until decompression |
253 | bool ciMethod::has_linenumber_table() const { |
254 | check_is_loaded(); |
255 | VM_ENTRY_MARK; |
256 | return get_Method()->has_linenumber_table(); |
257 | } |
258 | |
259 | |
260 | // ------------------------------------------------------------------ |
261 | // ciMethod::compressed_linenumber_table |
262 | u_char* ciMethod::compressed_linenumber_table() const { |
263 | check_is_loaded(); |
264 | VM_ENTRY_MARK; |
265 | return get_Method()->compressed_linenumber_table(); |
266 | } |
267 | |
268 | |
269 | // ------------------------------------------------------------------ |
270 | // ciMethod::line_number_from_bci |
271 | int ciMethod::line_number_from_bci(int bci) const { |
272 | check_is_loaded(); |
273 | VM_ENTRY_MARK; |
274 | return get_Method()->line_number_from_bci(bci); |
275 | } |
276 | |
277 | |
278 | // ------------------------------------------------------------------ |
279 | // ciMethod::vtable_index |
280 | // |
281 | // Get the position of this method's entry in the vtable, if any. |
282 | int ciMethod::vtable_index() { |
283 | check_is_loaded(); |
284 | assert(holder()->is_linked(), "must be linked" ); |
285 | VM_ENTRY_MARK; |
286 | return get_Method()->vtable_index(); |
287 | } |
288 | |
289 | |
290 | // ------------------------------------------------------------------ |
291 | // ciMethod::native_entry |
292 | // |
293 | // Get the address of this method's native code, if any. |
294 | address ciMethod::native_entry() { |
295 | check_is_loaded(); |
296 | assert(flags().is_native(), "must be native method" ); |
297 | VM_ENTRY_MARK; |
298 | Method* method = get_Method(); |
299 | address entry = method->native_function(); |
300 | assert(entry != NULL, "must be valid entry point" ); |
301 | return entry; |
302 | } |
303 | |
304 | |
305 | // ------------------------------------------------------------------ |
306 | // ciMethod::interpreter_entry |
307 | // |
308 | // Get the entry point for running this method in the interpreter. |
309 | address ciMethod::interpreter_entry() { |
310 | check_is_loaded(); |
311 | VM_ENTRY_MARK; |
312 | methodHandle mh(THREAD, get_Method()); |
313 | return Interpreter::entry_for_method(mh); |
314 | } |
315 | |
316 | |
317 | // ------------------------------------------------------------------ |
318 | // ciMethod::uses_balanced_monitors |
319 | // |
320 | // Does this method use monitors in a strict stack-disciplined manner? |
321 | bool ciMethod::has_balanced_monitors() { |
322 | check_is_loaded(); |
323 | if (_balanced_monitors) return true; |
324 | |
325 | // Analyze the method to see if monitors are used properly. |
326 | VM_ENTRY_MARK; |
327 | methodHandle method(THREAD, get_Method()); |
328 | assert(method->has_monitor_bytecodes(), "should have checked this" ); |
329 | |
330 | // Check to see if a previous compilation computed the |
331 | // monitor-matching analysis. |
332 | if (method->guaranteed_monitor_matching()) { |
333 | _balanced_monitors = true; |
334 | return true; |
335 | } |
336 | |
337 | { |
338 | EXCEPTION_MARK; |
339 | ResourceMark rm(THREAD); |
340 | GeneratePairingInfo gpi(method); |
341 | gpi.compute_map(CATCH); |
342 | if (!gpi.monitor_safe()) { |
343 | return false; |
344 | } |
345 | method->set_guaranteed_monitor_matching(); |
346 | _balanced_monitors = true; |
347 | } |
348 | return true; |
349 | } |
350 | |
351 | |
352 | // ------------------------------------------------------------------ |
353 | // ciMethod::get_flow_analysis |
354 | ciTypeFlow* ciMethod::get_flow_analysis() { |
355 | #if defined(COMPILER2) |
356 | if (_flow == NULL) { |
357 | ciEnv* env = CURRENT_ENV; |
358 | _flow = new (env->arena()) ciTypeFlow(env, this); |
359 | _flow->do_flow(); |
360 | } |
361 | return _flow; |
362 | #else // COMPILER2 |
363 | ShouldNotReachHere(); |
364 | return NULL; |
365 | #endif // COMPILER2 |
366 | } |
367 | |
368 | |
369 | // ------------------------------------------------------------------ |
370 | // ciMethod::get_osr_flow_analysis |
371 | ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) { |
372 | #if defined(COMPILER2) |
373 | // OSR entry points are always place after a call bytecode of some sort |
374 | assert(osr_bci >= 0, "must supply valid OSR entry point" ); |
375 | ciEnv* env = CURRENT_ENV; |
376 | ciTypeFlow* flow = new (env->arena()) ciTypeFlow(env, this, osr_bci); |
377 | flow->do_flow(); |
378 | return flow; |
379 | #else // COMPILER2 |
380 | ShouldNotReachHere(); |
381 | return NULL; |
382 | #endif // COMPILER2 |
383 | } |
384 | |
385 | // ------------------------------------------------------------------ |
386 | // ciMethod::raw_liveness_at_bci |
387 | // |
388 | // Which local variables are live at a specific bci? |
389 | MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) { |
390 | check_is_loaded(); |
391 | if (_liveness == NULL) { |
392 | // Create the liveness analyzer. |
393 | Arena* arena = CURRENT_ENV->arena(); |
394 | _liveness = new (arena) MethodLiveness(arena, this); |
395 | _liveness->compute_liveness(); |
396 | } |
397 | return _liveness->get_liveness_at(bci); |
398 | } |
399 | |
400 | // ------------------------------------------------------------------ |
401 | // ciMethod::liveness_at_bci |
402 | // |
403 | // Which local variables are live at a specific bci? When debugging |
404 | // will return true for all locals in some cases to improve debug |
405 | // information. |
406 | MethodLivenessResult ciMethod::liveness_at_bci(int bci) { |
407 | if (CURRENT_ENV->should_retain_local_variables() || DeoptimizeALot) { |
408 | // Keep all locals live for the user's edification and amusement. |
409 | MethodLivenessResult result(_max_locals); |
410 | result.set_range(0, _max_locals); |
411 | result.set_is_valid(); |
412 | return result; |
413 | } |
414 | return raw_liveness_at_bci(bci); |
415 | } |
416 | |
417 | // ciMethod::live_local_oops_at_bci |
418 | // |
419 | // find all the live oops in the locals array for a particular bci |
420 | // Compute what the interpreter believes by using the interpreter |
421 | // oopmap generator. This is used as a double check during osr to |
422 | // guard against conservative result from MethodLiveness making us |
423 | // think a dead oop is live. MethodLiveness is conservative in the |
424 | // sense that it may consider locals to be live which cannot be live, |
425 | // like in the case where a local could contain an oop or a primitive |
426 | // along different paths. In that case the local must be dead when |
427 | // those paths merge. Since the interpreter's viewpoint is used when |
428 | // gc'ing an interpreter frame we need to use its viewpoint during |
429 | // OSR when loading the locals. |
430 | |
431 | ResourceBitMap ciMethod::live_local_oops_at_bci(int bci) { |
432 | VM_ENTRY_MARK; |
433 | InterpreterOopMap mask; |
434 | OopMapCache::compute_one_oop_map(get_Method(), bci, &mask); |
435 | int mask_size = max_locals(); |
436 | ResourceBitMap result(mask_size); |
437 | int i; |
438 | for (i = 0; i < mask_size ; i++ ) { |
439 | if (mask.is_oop(i)) result.set_bit(i); |
440 | } |
441 | return result; |
442 | } |
443 | |
444 | |
445 | #ifdef COMPILER1 |
446 | // ------------------------------------------------------------------ |
447 | // ciMethod::bci_block_start |
448 | // |
449 | // Marks all bcis where a new basic block starts |
450 | const BitMap& ciMethod::bci_block_start() { |
451 | check_is_loaded(); |
452 | if (_liveness == NULL) { |
453 | // Create the liveness analyzer. |
454 | Arena* arena = CURRENT_ENV->arena(); |
455 | _liveness = new (arena) MethodLiveness(arena, this); |
456 | _liveness->compute_liveness(); |
457 | } |
458 | |
459 | return _liveness->get_bci_block_start(); |
460 | } |
461 | #endif // COMPILER1 |
462 | |
463 | |
464 | // ------------------------------------------------------------------ |
465 | // ciMethod::check_overflow |
466 | // |
467 | // Check whether the profile counter is overflowed and adjust if true. |
468 | // For invoke* it will turn negative values into max_jint, |
469 | // and for checkcast/aastore/instanceof turn positive values into min_jint. |
470 | int ciMethod::check_overflow(int c, Bytecodes::Code code) { |
471 | switch (code) { |
472 | case Bytecodes::_aastore: // fall-through |
473 | case Bytecodes::_checkcast: // fall-through |
474 | case Bytecodes::_instanceof: { |
475 | return (c > 0 ? min_jint : c); // always non-positive |
476 | } |
477 | default: { |
478 | assert(Bytecodes::is_invoke(code), "%s" , Bytecodes::name(code)); |
479 | return (c < 0 ? max_jint : c); // always non-negative |
480 | } |
481 | } |
482 | } |
483 | |
484 | |
485 | // ------------------------------------------------------------------ |
486 | // ciMethod::call_profile_at_bci |
487 | // |
488 | // Get the ciCallProfile for the invocation of this method. |
489 | // Also reports receiver types for non-call type checks (if TypeProfileCasts). |
490 | ciCallProfile ciMethod::call_profile_at_bci(int bci) { |
491 | ResourceMark rm; |
492 | ciCallProfile result; |
493 | if (method_data() != NULL && method_data()->is_mature()) { |
494 | ciProfileData* data = method_data()->bci_to_data(bci); |
495 | if (data != NULL && data->is_CounterData()) { |
496 | // Every profiled call site has a counter. |
497 | int count = check_overflow(data->as_CounterData()->count(), java_code_at_bci(bci)); |
498 | |
499 | if (!data->is_ReceiverTypeData()) { |
500 | result._receiver_count[0] = 0; // that's a definite zero |
501 | } else { // ReceiverTypeData is a subclass of CounterData |
502 | ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData(); |
503 | // In addition, virtual call sites have receiver type information |
504 | int receivers_count_total = 0; |
505 | int morphism = 0; |
506 | // Precompute morphism for the possible fixup |
507 | for (uint i = 0; i < call->row_limit(); i++) { |
508 | ciKlass* receiver = call->receiver(i); |
509 | if (receiver == NULL) continue; |
510 | morphism++; |
511 | } |
512 | int epsilon = 0; |
513 | if (TieredCompilation) { |
514 | // For a call, it is assumed that either the type of the receiver(s) |
515 | // is recorded or an associated counter is incremented, but not both. With |
516 | // tiered compilation, however, both can happen due to the interpreter and |
517 | // C1 profiling invocations differently. Address that inconsistency here. |
518 | if (morphism == 1 && count > 0) { |
519 | epsilon = count; |
520 | count = 0; |
521 | } |
522 | } |
523 | for (uint i = 0; i < call->row_limit(); i++) { |
524 | ciKlass* receiver = call->receiver(i); |
525 | if (receiver == NULL) continue; |
526 | int rcount = saturated_add(call->receiver_count(i), epsilon); |
527 | if (rcount == 0) rcount = 1; // Should be valid value |
528 | receivers_count_total = saturated_add(receivers_count_total, rcount); |
529 | // Add the receiver to result data. |
530 | result.add_receiver(receiver, rcount); |
531 | // If we extend profiling to record methods, |
532 | // we will set result._method also. |
533 | } |
534 | // Determine call site's morphism. |
535 | // The call site count is 0 with known morphism (only 1 or 2 receivers) |
536 | // or < 0 in the case of a type check failure for checkcast, aastore, instanceof. |
537 | // The call site count is > 0 in the case of a polymorphic virtual call. |
538 | if (morphism > 0 && morphism == result._limit) { |
539 | // The morphism <= MorphismLimit. |
540 | if ((morphism < ciCallProfile::MorphismLimit) || |
541 | (morphism == ciCallProfile::MorphismLimit && count == 0)) { |
542 | #ifdef ASSERT |
543 | if (count > 0) { |
544 | this->print_short_name(tty); |
545 | tty->print_cr(" @ bci:%d" , bci); |
546 | this->print_codes(); |
547 | assert(false, "this call site should not be polymorphic" ); |
548 | } |
549 | #endif |
550 | result._morphism = morphism; |
551 | } |
552 | } |
553 | // Make the count consistent if this is a call profile. If count is |
554 | // zero or less, presume that this is a typecheck profile and |
555 | // do nothing. Otherwise, increase count to be the sum of all |
556 | // receiver's counts. |
557 | if (count >= 0) { |
558 | count = saturated_add(count, receivers_count_total); |
559 | } |
560 | } |
561 | result._count = count; |
562 | } |
563 | } |
564 | return result; |
565 | } |
566 | |
567 | // ------------------------------------------------------------------ |
568 | // Add new receiver and sort data by receiver's profile count. |
569 | void ciCallProfile::add_receiver(ciKlass* receiver, int receiver_count) { |
570 | // Add new receiver and sort data by receiver's counts when we have space |
571 | // for it otherwise replace the less called receiver (less called receiver |
572 | // is placed to the last array element which is not used). |
573 | // First array's element contains most called receiver. |
574 | int i = _limit; |
575 | for (; i > 0 && receiver_count > _receiver_count[i-1]; i--) { |
576 | _receiver[i] = _receiver[i-1]; |
577 | _receiver_count[i] = _receiver_count[i-1]; |
578 | } |
579 | _receiver[i] = receiver; |
580 | _receiver_count[i] = receiver_count; |
581 | if (_limit < MorphismLimit) _limit++; |
582 | } |
583 | |
584 | |
585 | void ciMethod::assert_virtual_call_type_ok(int bci) { |
586 | assert(java_code_at_bci(bci) == Bytecodes::_invokevirtual || |
587 | java_code_at_bci(bci) == Bytecodes::_invokeinterface, "unexpected bytecode %s" , Bytecodes::name(java_code_at_bci(bci))); |
588 | } |
589 | |
590 | void ciMethod::assert_call_type_ok(int bci) { |
591 | assert(java_code_at_bci(bci) == Bytecodes::_invokestatic || |
592 | java_code_at_bci(bci) == Bytecodes::_invokespecial || |
593 | java_code_at_bci(bci) == Bytecodes::_invokedynamic, "unexpected bytecode %s" , Bytecodes::name(java_code_at_bci(bci))); |
594 | } |
595 | |
596 | /** |
597 | * Check whether profiling provides a type for the argument i to the |
598 | * call at bci bci |
599 | * |
600 | * @param [in]bci bci of the call |
601 | * @param [in]i argument number |
602 | * @param [out]type profiled type of argument, NULL if none |
603 | * @param [out]ptr_kind whether always null, never null or maybe null |
604 | * @return true if profiling exists |
605 | * |
606 | */ |
607 | bool ciMethod::argument_profiled_type(int bci, int i, ciKlass*& type, ProfilePtrKind& ptr_kind) { |
608 | if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) { |
609 | ciProfileData* data = method_data()->bci_to_data(bci); |
610 | if (data != NULL) { |
611 | if (data->is_VirtualCallTypeData()) { |
612 | assert_virtual_call_type_ok(bci); |
613 | ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData(); |
614 | if (i >= call->number_of_arguments()) { |
615 | return false; |
616 | } |
617 | type = call->valid_argument_type(i); |
618 | ptr_kind = call->argument_ptr_kind(i); |
619 | return true; |
620 | } else if (data->is_CallTypeData()) { |
621 | assert_call_type_ok(bci); |
622 | ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData(); |
623 | if (i >= call->number_of_arguments()) { |
624 | return false; |
625 | } |
626 | type = call->valid_argument_type(i); |
627 | ptr_kind = call->argument_ptr_kind(i); |
628 | return true; |
629 | } |
630 | } |
631 | } |
632 | return false; |
633 | } |
634 | |
635 | /** |
636 | * Check whether profiling provides a type for the return value from |
637 | * the call at bci bci |
638 | * |
639 | * @param [in]bci bci of the call |
640 | * @param [out]type profiled type of argument, NULL if none |
641 | * @param [out]ptr_kind whether always null, never null or maybe null |
642 | * @return true if profiling exists |
643 | * |
644 | */ |
645 | bool ciMethod::return_profiled_type(int bci, ciKlass*& type, ProfilePtrKind& ptr_kind) { |
646 | if (MethodData::profile_return() && method_data() != NULL && method_data()->is_mature()) { |
647 | ciProfileData* data = method_data()->bci_to_data(bci); |
648 | if (data != NULL) { |
649 | if (data->is_VirtualCallTypeData()) { |
650 | assert_virtual_call_type_ok(bci); |
651 | ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData(); |
652 | if (call->has_return()) { |
653 | type = call->valid_return_type(); |
654 | ptr_kind = call->return_ptr_kind(); |
655 | return true; |
656 | } |
657 | } else if (data->is_CallTypeData()) { |
658 | assert_call_type_ok(bci); |
659 | ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData(); |
660 | if (call->has_return()) { |
661 | type = call->valid_return_type(); |
662 | ptr_kind = call->return_ptr_kind(); |
663 | } |
664 | return true; |
665 | } |
666 | } |
667 | } |
668 | return false; |
669 | } |
670 | |
671 | /** |
672 | * Check whether profiling provides a type for the parameter i |
673 | * |
674 | * @param [in]i parameter number |
675 | * @param [out]type profiled type of parameter, NULL if none |
676 | * @param [out]ptr_kind whether always null, never null or maybe null |
677 | * @return true if profiling exists |
678 | * |
679 | */ |
680 | bool ciMethod::parameter_profiled_type(int i, ciKlass*& type, ProfilePtrKind& ptr_kind) { |
681 | if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) { |
682 | ciParametersTypeData* parameters = method_data()->parameters_type_data(); |
683 | if (parameters != NULL && i < parameters->number_of_parameters()) { |
684 | type = parameters->valid_parameter_type(i); |
685 | ptr_kind = parameters->parameter_ptr_kind(i); |
686 | return true; |
687 | } |
688 | } |
689 | return false; |
690 | } |
691 | |
692 | |
693 | // ------------------------------------------------------------------ |
694 | // ciMethod::find_monomorphic_target |
695 | // |
696 | // Given a certain calling environment, find the monomorphic target |
697 | // for the call. Return NULL if the call is not monomorphic in |
698 | // its calling environment, or if there are only abstract methods. |
699 | // The returned method is never abstract. |
700 | // Note: If caller uses a non-null result, it must inform dependencies |
701 | // via assert_unique_concrete_method or assert_leaf_type. |
702 | ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller, |
703 | ciInstanceKlass* callee_holder, |
704 | ciInstanceKlass* actual_recv, |
705 | bool check_access) { |
706 | check_is_loaded(); |
707 | |
708 | if (actual_recv->is_interface()) { |
709 | // %%% We cannot trust interface types, yet. See bug 6312651. |
710 | return NULL; |
711 | } |
712 | |
713 | ciMethod* root_m = resolve_invoke(caller, actual_recv, check_access); |
714 | if (root_m == NULL) { |
715 | // Something went wrong looking up the actual receiver method. |
716 | return NULL; |
717 | } |
718 | assert(!root_m->is_abstract(), "resolve_invoke promise" ); |
719 | |
720 | // Make certain quick checks even if UseCHA is false. |
721 | |
722 | // Is it private or final? |
723 | if (root_m->can_be_statically_bound()) { |
724 | return root_m; |
725 | } |
726 | |
727 | if (actual_recv->is_leaf_type() && actual_recv == root_m->holder()) { |
728 | // Easy case. There is no other place to put a method, so don't bother |
729 | // to go through the VM_ENTRY_MARK and all the rest. |
730 | return root_m; |
731 | } |
732 | |
733 | // Array methods (clone, hashCode, etc.) are always statically bound. |
734 | // If we were to see an array type here, we'd return root_m. |
735 | // However, this method processes only ciInstanceKlasses. (See 4962591.) |
736 | // The inline_native_clone intrinsic narrows Object to T[] properly, |
737 | // so there is no need to do the same job here. |
738 | |
739 | if (!UseCHA) return NULL; |
740 | |
741 | VM_ENTRY_MARK; |
742 | |
743 | // Disable CHA for default methods for now |
744 | if (root_m->is_default_method()) { |
745 | return NULL; |
746 | } |
747 | |
748 | methodHandle target; |
749 | { |
750 | MutexLocker locker(Compile_lock); |
751 | Klass* context = actual_recv->get_Klass(); |
752 | target = Dependencies::find_unique_concrete_method(context, |
753 | root_m->get_Method()); |
754 | // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods. |
755 | } |
756 | |
757 | #ifndef PRODUCT |
758 | if (TraceDependencies && target() != NULL && target() != root_m->get_Method()) { |
759 | tty->print("found a non-root unique target method" ); |
760 | tty->print_cr(" context = %s" , actual_recv->get_Klass()->external_name()); |
761 | tty->print(" method = " ); |
762 | target->print_short_name(tty); |
763 | tty->cr(); |
764 | } |
765 | #endif //PRODUCT |
766 | |
767 | if (target() == NULL) { |
768 | return NULL; |
769 | } |
770 | if (target() == root_m->get_Method()) { |
771 | return root_m; |
772 | } |
773 | if (!root_m->is_public() && |
774 | !root_m->is_protected()) { |
775 | // If we are going to reason about inheritance, it's easiest |
776 | // if the method in question is public, protected, or private. |
777 | // If the answer is not root_m, it is conservatively correct |
778 | // to return NULL, even if the CHA encountered irrelevant |
779 | // methods in other packages. |
780 | // %%% TO DO: Work out logic for package-private methods |
781 | // with the same name but different vtable indexes. |
782 | return NULL; |
783 | } |
784 | assert(!target()->is_abstract(), "not allowed" ); |
785 | return CURRENT_THREAD_ENV->get_method(target()); |
786 | } |
787 | |
788 | // ------------------------------------------------------------------ |
789 | // ciMethod::can_be_statically_bound |
790 | // |
791 | // Tries to determine whether a method can be statically bound in some context. |
792 | bool ciMethod::can_be_statically_bound(ciInstanceKlass* context) const { |
793 | return (holder() == context) && can_be_statically_bound(); |
794 | } |
795 | |
796 | // ------------------------------------------------------------------ |
797 | // ciMethod::resolve_invoke |
798 | // |
799 | // Given a known receiver klass, find the target for the call. |
800 | // Return NULL if the call has no target or the target is abstract. |
801 | ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access) { |
802 | check_is_loaded(); |
803 | VM_ENTRY_MARK; |
804 | |
805 | Klass* caller_klass = caller->get_Klass(); |
806 | Klass* recv = exact_receiver->get_Klass(); |
807 | Klass* resolved = holder()->get_Klass(); |
808 | Symbol* h_name = name()->get_symbol(); |
809 | Symbol* h_signature = signature()->get_symbol(); |
810 | |
811 | LinkInfo link_info(resolved, h_name, h_signature, caller_klass, |
812 | check_access ? LinkInfo::needs_access_check : LinkInfo::skip_access_check); |
813 | methodHandle m; |
814 | // Only do exact lookup if receiver klass has been linked. Otherwise, |
815 | // the vtable has not been setup, and the LinkResolver will fail. |
816 | if (recv->is_array_klass() |
817 | || |
818 | (InstanceKlass::cast(recv)->is_linked() && !exact_receiver->is_interface())) { |
819 | if (holder()->is_interface()) { |
820 | m = LinkResolver::resolve_interface_call_or_null(recv, link_info); |
821 | } else { |
822 | m = LinkResolver::resolve_virtual_call_or_null(recv, link_info); |
823 | } |
824 | } |
825 | |
826 | if (m.is_null()) { |
827 | // Return NULL only if there was a problem with lookup (uninitialized class, etc.) |
828 | return NULL; |
829 | } |
830 | |
831 | ciMethod* result = this; |
832 | if (m() != get_Method()) { |
833 | result = CURRENT_THREAD_ENV->get_method(m()); |
834 | } |
835 | |
836 | // Don't return abstract methods because they aren't |
837 | // optimizable or interesting. |
838 | if (result->is_abstract()) { |
839 | return NULL; |
840 | } else { |
841 | return result; |
842 | } |
843 | } |
844 | |
845 | // ------------------------------------------------------------------ |
846 | // ciMethod::resolve_vtable_index |
847 | // |
848 | // Given a known receiver klass, find the vtable index for the call. |
849 | // Return Method::invalid_vtable_index if the vtable_index is unknown. |
850 | int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) { |
851 | check_is_loaded(); |
852 | |
853 | int vtable_index = Method::invalid_vtable_index; |
854 | // Only do lookup if receiver klass has been linked. Otherwise, |
855 | // the vtable has not been setup, and the LinkResolver will fail. |
856 | if (!receiver->is_interface() |
857 | && (!receiver->is_instance_klass() || |
858 | receiver->as_instance_klass()->is_linked())) { |
859 | VM_ENTRY_MARK; |
860 | |
861 | Klass* caller_klass = caller->get_Klass(); |
862 | Klass* recv = receiver->get_Klass(); |
863 | Symbol* h_name = name()->get_symbol(); |
864 | Symbol* h_signature = signature()->get_symbol(); |
865 | |
866 | LinkInfo link_info(recv, h_name, h_signature, caller_klass); |
867 | vtable_index = LinkResolver::resolve_virtual_vtable_index(recv, link_info); |
868 | if (vtable_index == Method::nonvirtual_vtable_index) { |
869 | // A statically bound method. Return "no such index". |
870 | vtable_index = Method::invalid_vtable_index; |
871 | } |
872 | } |
873 | |
874 | return vtable_index; |
875 | } |
876 | |
877 | // ------------------------------------------------------------------ |
878 | // ciMethod::interpreter_call_site_count |
879 | int ciMethod::interpreter_call_site_count(int bci) { |
880 | if (method_data() != NULL) { |
881 | ResourceMark rm; |
882 | ciProfileData* data = method_data()->bci_to_data(bci); |
883 | if (data != NULL && data->is_CounterData()) { |
884 | return scale_count(data->as_CounterData()->count()); |
885 | } |
886 | } |
887 | return -1; // unknown |
888 | } |
889 | |
890 | // ------------------------------------------------------------------ |
891 | // ciMethod::get_field_at_bci |
892 | ciField* ciMethod::get_field_at_bci(int bci, bool &will_link) { |
893 | ciBytecodeStream iter(this); |
894 | iter.reset_to_bci(bci); |
895 | iter.next(); |
896 | return iter.get_field(will_link); |
897 | } |
898 | |
899 | // ------------------------------------------------------------------ |
900 | // ciMethod::get_method_at_bci |
901 | ciMethod* ciMethod::get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature) { |
902 | ciBytecodeStream iter(this); |
903 | iter.reset_to_bci(bci); |
904 | iter.next(); |
905 | return iter.get_method(will_link, declared_signature); |
906 | } |
907 | |
908 | // ------------------------------------------------------------------ |
909 | ciKlass* ciMethod::get_declared_method_holder_at_bci(int bci) { |
910 | ciBytecodeStream iter(this); |
911 | iter.reset_to_bci(bci); |
912 | iter.next(); |
913 | return iter.get_declared_method_holder(); |
914 | } |
915 | |
916 | // ------------------------------------------------------------------ |
917 | // Adjust a CounterData count to be commensurate with |
918 | // interpreter_invocation_count. If the MDO exists for |
919 | // only 25% of the time the method exists, then the |
920 | // counts in the MDO should be scaled by 4X, so that |
921 | // they can be usefully and stably compared against the |
922 | // invocation counts in methods. |
923 | int ciMethod::scale_count(int count, float prof_factor) { |
924 | if (count > 0 && method_data() != NULL) { |
925 | int counter_life; |
926 | int method_life = interpreter_invocation_count(); |
927 | if (TieredCompilation) { |
928 | // In tiered the MDO's life is measured directly, so just use the snapshotted counters |
929 | counter_life = MAX2(method_data()->invocation_count(), method_data()->backedge_count()); |
930 | } else { |
931 | int current_mileage = method_data()->current_mileage(); |
932 | int creation_mileage = method_data()->creation_mileage(); |
933 | counter_life = current_mileage - creation_mileage; |
934 | } |
935 | |
936 | // counter_life due to backedge_counter could be > method_life |
937 | if (counter_life > method_life) |
938 | counter_life = method_life; |
939 | if (0 < counter_life && counter_life <= method_life) { |
940 | count = (int)((double)count * prof_factor * method_life / counter_life + 0.5); |
941 | count = (count > 0) ? count : 1; |
942 | } |
943 | } |
944 | return count; |
945 | } |
946 | |
947 | |
948 | // ------------------------------------------------------------------ |
949 | // ciMethod::is_special_get_caller_class_method |
950 | // |
951 | bool ciMethod::is_ignored_by_security_stack_walk() const { |
952 | check_is_loaded(); |
953 | VM_ENTRY_MARK; |
954 | return get_Method()->is_ignored_by_security_stack_walk(); |
955 | } |
956 | |
957 | // ------------------------------------------------------------------ |
958 | // ciMethod::needs_clinit_barrier |
959 | // |
960 | bool ciMethod::needs_clinit_barrier() const { |
961 | check_is_loaded(); |
962 | return is_static() && !holder()->is_initialized(); |
963 | } |
964 | |
965 | // ------------------------------------------------------------------ |
966 | // invokedynamic support |
967 | |
968 | // ------------------------------------------------------------------ |
969 | // ciMethod::is_method_handle_intrinsic |
970 | // |
971 | // Return true if the method is an instance of the JVM-generated |
972 | // signature-polymorphic MethodHandle methods, _invokeBasic, _linkToVirtual, etc. |
973 | bool ciMethod::is_method_handle_intrinsic() const { |
974 | vmIntrinsics::ID iid = _intrinsic_id; // do not check if loaded |
975 | return (MethodHandles::is_signature_polymorphic(iid) && |
976 | MethodHandles::is_signature_polymorphic_intrinsic(iid)); |
977 | } |
978 | |
979 | // ------------------------------------------------------------------ |
980 | // ciMethod::is_compiled_lambda_form |
981 | // |
982 | // Return true if the method is a generated MethodHandle adapter. |
983 | // These are built by Java code. |
984 | bool ciMethod::is_compiled_lambda_form() const { |
985 | vmIntrinsics::ID iid = _intrinsic_id; // do not check if loaded |
986 | return iid == vmIntrinsics::_compiledLambdaForm; |
987 | } |
988 | |
989 | // ------------------------------------------------------------------ |
990 | // ciMethod::is_object_initializer |
991 | // |
992 | bool ciMethod::is_object_initializer() const { |
993 | return name() == ciSymbol::object_initializer_name(); |
994 | } |
995 | |
996 | // ------------------------------------------------------------------ |
997 | // ciMethod::has_member_arg |
998 | // |
999 | // Return true if the method is a linker intrinsic like _linkToVirtual. |
1000 | // These are built by the JVM. |
1001 | bool ciMethod::has_member_arg() const { |
1002 | vmIntrinsics::ID iid = _intrinsic_id; // do not check if loaded |
1003 | return (MethodHandles::is_signature_polymorphic(iid) && |
1004 | MethodHandles::has_member_arg(iid)); |
1005 | } |
1006 | |
1007 | // ------------------------------------------------------------------ |
1008 | // ciMethod::ensure_method_data |
1009 | // |
1010 | // Generate new MethodData* objects at compile time. |
1011 | // Return true if allocation was successful or no MDO is required. |
1012 | bool ciMethod::ensure_method_data(const methodHandle& h_m) { |
1013 | EXCEPTION_CONTEXT; |
1014 | if (is_native() || is_abstract() || h_m()->is_accessor()) { |
1015 | return true; |
1016 | } |
1017 | if (h_m()->method_data() == NULL) { |
1018 | Method::build_interpreter_method_data(h_m, THREAD); |
1019 | if (HAS_PENDING_EXCEPTION) { |
1020 | CLEAR_PENDING_EXCEPTION; |
1021 | } |
1022 | } |
1023 | if (h_m()->method_data() != NULL) { |
1024 | _method_data = CURRENT_ENV->get_method_data(h_m()->method_data()); |
1025 | _method_data->load_data(); |
1026 | return true; |
1027 | } else { |
1028 | _method_data = CURRENT_ENV->get_empty_methodData(); |
1029 | return false; |
1030 | } |
1031 | } |
1032 | |
1033 | // public, retroactive version |
1034 | bool ciMethod::ensure_method_data() { |
1035 | bool result = true; |
1036 | if (_method_data == NULL || _method_data->is_empty()) { |
1037 | GUARDED_VM_ENTRY({ |
1038 | result = ensure_method_data(get_Method()); |
1039 | }); |
1040 | } |
1041 | return result; |
1042 | } |
1043 | |
1044 | |
1045 | // ------------------------------------------------------------------ |
1046 | // ciMethod::method_data |
1047 | // |
1048 | ciMethodData* ciMethod::method_data() { |
1049 | if (_method_data != NULL) { |
1050 | return _method_data; |
1051 | } |
1052 | VM_ENTRY_MARK; |
1053 | ciEnv* env = CURRENT_ENV; |
1054 | Thread* my_thread = JavaThread::current(); |
1055 | methodHandle h_m(my_thread, get_Method()); |
1056 | |
1057 | if (h_m()->method_data() != NULL) { |
1058 | _method_data = CURRENT_ENV->get_method_data(h_m()->method_data()); |
1059 | _method_data->load_data(); |
1060 | } else { |
1061 | _method_data = CURRENT_ENV->get_empty_methodData(); |
1062 | } |
1063 | return _method_data; |
1064 | |
1065 | } |
1066 | |
1067 | // ------------------------------------------------------------------ |
1068 | // ciMethod::method_data_or_null |
1069 | // Returns a pointer to ciMethodData if MDO exists on the VM side, |
1070 | // NULL otherwise. |
1071 | ciMethodData* ciMethod::method_data_or_null() { |
1072 | ciMethodData *md = method_data(); |
1073 | if (md->is_empty()) { |
1074 | return NULL; |
1075 | } |
1076 | return md; |
1077 | } |
1078 | |
1079 | // ------------------------------------------------------------------ |
1080 | // ciMethod::ensure_method_counters |
1081 | // |
1082 | MethodCounters* ciMethod::ensure_method_counters() { |
1083 | check_is_loaded(); |
1084 | VM_ENTRY_MARK; |
1085 | methodHandle mh(THREAD, get_Method()); |
1086 | MethodCounters* method_counters = mh->get_method_counters(CHECK_NULL); |
1087 | return method_counters; |
1088 | } |
1089 | |
1090 | // ------------------------------------------------------------------ |
1091 | // ciMethod::has_option |
1092 | // |
1093 | bool ciMethod::has_option(const char* option) { |
1094 | check_is_loaded(); |
1095 | VM_ENTRY_MARK; |
1096 | methodHandle mh(THREAD, get_Method()); |
1097 | return CompilerOracle::has_option_string(mh, option); |
1098 | } |
1099 | |
1100 | // ------------------------------------------------------------------ |
1101 | // ciMethod::has_option_value |
1102 | // |
1103 | bool ciMethod::has_option_value(const char* option, double& value) { |
1104 | check_is_loaded(); |
1105 | VM_ENTRY_MARK; |
1106 | methodHandle mh(THREAD, get_Method()); |
1107 | return CompilerOracle::has_option_value(mh, option, value); |
1108 | } |
1109 | // ------------------------------------------------------------------ |
1110 | // ciMethod::can_be_compiled |
1111 | // |
1112 | // Have previous compilations of this method succeeded? |
1113 | bool ciMethod::can_be_compiled() { |
1114 | check_is_loaded(); |
1115 | ciEnv* env = CURRENT_ENV; |
1116 | if (is_c1_compile(env->comp_level())) { |
1117 | return _is_c1_compilable; |
1118 | } |
1119 | return _is_c2_compilable; |
1120 | } |
1121 | |
1122 | // ------------------------------------------------------------------ |
1123 | // ciMethod::set_not_compilable |
1124 | // |
1125 | // Tell the VM that this method cannot be compiled at all. |
1126 | void ciMethod::set_not_compilable(const char* reason) { |
1127 | check_is_loaded(); |
1128 | VM_ENTRY_MARK; |
1129 | ciEnv* env = CURRENT_ENV; |
1130 | if (is_c1_compile(env->comp_level())) { |
1131 | _is_c1_compilable = false; |
1132 | } else { |
1133 | _is_c2_compilable = false; |
1134 | } |
1135 | get_Method()->set_not_compilable(reason, env->comp_level()); |
1136 | } |
1137 | |
1138 | // ------------------------------------------------------------------ |
1139 | // ciMethod::can_be_osr_compiled |
1140 | // |
1141 | // Have previous compilations of this method succeeded? |
1142 | // |
1143 | // Implementation note: the VM does not currently keep track |
1144 | // of failed OSR compilations per bci. The entry_bci parameter |
1145 | // is currently unused. |
1146 | bool ciMethod::can_be_osr_compiled(int entry_bci) { |
1147 | check_is_loaded(); |
1148 | VM_ENTRY_MARK; |
1149 | ciEnv* env = CURRENT_ENV; |
1150 | return !get_Method()->is_not_osr_compilable(env->comp_level()); |
1151 | } |
1152 | |
1153 | // ------------------------------------------------------------------ |
1154 | // ciMethod::has_compiled_code |
1155 | bool ciMethod::has_compiled_code() { |
1156 | return instructions_size() > 0; |
1157 | } |
1158 | |
1159 | int ciMethod::comp_level() { |
1160 | check_is_loaded(); |
1161 | VM_ENTRY_MARK; |
1162 | CompiledMethod* nm = get_Method()->code(); |
1163 | if (nm != NULL) return nm->comp_level(); |
1164 | return 0; |
1165 | } |
1166 | |
1167 | int ciMethod::highest_osr_comp_level() { |
1168 | check_is_loaded(); |
1169 | VM_ENTRY_MARK; |
1170 | return get_Method()->highest_osr_comp_level(); |
1171 | } |
1172 | |
1173 | // ------------------------------------------------------------------ |
1174 | // ciMethod::code_size_for_inlining |
1175 | // |
1176 | // Code size for inlining decisions. This method returns a code |
1177 | // size of 1 for methods which has the ForceInline annotation. |
1178 | int ciMethod::code_size_for_inlining() { |
1179 | check_is_loaded(); |
1180 | if (get_Method()->force_inline()) { |
1181 | return 1; |
1182 | } |
1183 | return code_size(); |
1184 | } |
1185 | |
1186 | // ------------------------------------------------------------------ |
1187 | // ciMethod::instructions_size |
1188 | // |
1189 | // This is a rough metric for "fat" methods, compared before inlining |
1190 | // with InlineSmallCode. The CodeBlob::code_size accessor includes |
1191 | // junk like exception handler, stubs, and constant table, which are |
1192 | // not highly relevant to an inlined method. So we use the more |
1193 | // specific accessor nmethod::insts_size. |
1194 | int ciMethod::instructions_size() { |
1195 | if (_instructions_size == -1) { |
1196 | GUARDED_VM_ENTRY( |
1197 | CompiledMethod* code = get_Method()->code(); |
1198 | if (code != NULL && (code->comp_level() == CompLevel_full_optimization)) { |
1199 | _instructions_size = code->insts_end() - code->verified_entry_point(); |
1200 | } else { |
1201 | _instructions_size = 0; |
1202 | } |
1203 | ); |
1204 | } |
1205 | return _instructions_size; |
1206 | } |
1207 | |
1208 | // ------------------------------------------------------------------ |
1209 | // ciMethod::log_nmethod_identity |
1210 | void ciMethod::log_nmethod_identity(xmlStream* log) { |
1211 | GUARDED_VM_ENTRY( |
1212 | CompiledMethod* code = get_Method()->code(); |
1213 | if (code != NULL) { |
1214 | code->log_identity(log); |
1215 | } |
1216 | ) |
1217 | } |
1218 | |
1219 | // ------------------------------------------------------------------ |
1220 | // ciMethod::is_not_reached |
1221 | bool ciMethod::is_not_reached(int bci) { |
1222 | check_is_loaded(); |
1223 | VM_ENTRY_MARK; |
1224 | return Interpreter::is_not_reached( |
1225 | methodHandle(THREAD, get_Method()), bci); |
1226 | } |
1227 | |
1228 | // ------------------------------------------------------------------ |
1229 | // ciMethod::was_never_executed |
1230 | bool ciMethod::was_executed_more_than(int times) { |
1231 | VM_ENTRY_MARK; |
1232 | return get_Method()->was_executed_more_than(times); |
1233 | } |
1234 | |
1235 | // ------------------------------------------------------------------ |
1236 | // ciMethod::has_unloaded_classes_in_signature |
1237 | bool ciMethod::has_unloaded_classes_in_signature() { |
1238 | VM_ENTRY_MARK; |
1239 | { |
1240 | EXCEPTION_MARK; |
1241 | methodHandle m(THREAD, get_Method()); |
1242 | bool has_unloaded = Method::has_unloaded_classes_in_signature(m, (JavaThread *)THREAD); |
1243 | if( HAS_PENDING_EXCEPTION ) { |
1244 | CLEAR_PENDING_EXCEPTION; |
1245 | return true; // Declare that we may have unloaded classes |
1246 | } |
1247 | return has_unloaded; |
1248 | } |
1249 | } |
1250 | |
1251 | // ------------------------------------------------------------------ |
1252 | // ciMethod::is_klass_loaded |
1253 | bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const { |
1254 | VM_ENTRY_MARK; |
1255 | return get_Method()->is_klass_loaded(refinfo_index, must_be_resolved); |
1256 | } |
1257 | |
1258 | // ------------------------------------------------------------------ |
1259 | // ciMethod::check_call |
1260 | bool ciMethod::check_call(int refinfo_index, bool is_static) const { |
1261 | // This method is used only in C2 from InlineTree::ok_to_inline, |
1262 | // and is only used under -Xcomp. |
1263 | // It appears to fail when applied to an invokeinterface call site. |
1264 | // FIXME: Remove this method and resolve_method_statically; refactor to use the other LinkResolver entry points. |
1265 | VM_ENTRY_MARK; |
1266 | { |
1267 | EXCEPTION_MARK; |
1268 | HandleMark hm(THREAD); |
1269 | constantPoolHandle pool (THREAD, get_Method()->constants()); |
1270 | Bytecodes::Code code = (is_static ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual); |
1271 | methodHandle spec_method = LinkResolver::resolve_method_statically(code, pool, refinfo_index, THREAD); |
1272 | if (HAS_PENDING_EXCEPTION) { |
1273 | CLEAR_PENDING_EXCEPTION; |
1274 | return false; |
1275 | } else { |
1276 | return (spec_method->is_static() == is_static); |
1277 | } |
1278 | } |
1279 | return false; |
1280 | } |
1281 | |
1282 | // ------------------------------------------------------------------ |
1283 | // ciMethod::profile_aging |
1284 | // |
1285 | // Should the method be compiled with an age counter? |
1286 | bool ciMethod::profile_aging() const { |
1287 | return UseCodeAging && (!MethodCounters::is_nmethod_hot(nmethod_age()) && |
1288 | !MethodCounters::is_nmethod_age_unset(nmethod_age())); |
1289 | } |
1290 | // ------------------------------------------------------------------ |
1291 | // ciMethod::print_codes |
1292 | // |
1293 | // Print the bytecodes for this method. |
1294 | void ciMethod::print_codes_on(outputStream* st) { |
1295 | check_is_loaded(); |
1296 | GUARDED_VM_ENTRY(get_Method()->print_codes_on(st);) |
1297 | } |
1298 | |
1299 | |
1300 | #define FETCH_FLAG_FROM_VM(flag_accessor) { \ |
1301 | check_is_loaded(); \ |
1302 | VM_ENTRY_MARK; \ |
1303 | return get_Method()->flag_accessor(); \ |
1304 | } |
1305 | |
1306 | bool ciMethod::is_empty_method() const { FETCH_FLAG_FROM_VM(is_empty_method); } |
1307 | bool ciMethod::is_vanilla_constructor() const { FETCH_FLAG_FROM_VM(is_vanilla_constructor); } |
1308 | bool ciMethod::has_loops () const { FETCH_FLAG_FROM_VM(has_loops); } |
1309 | bool ciMethod::has_jsrs () const { FETCH_FLAG_FROM_VM(has_jsrs); } |
1310 | bool ciMethod::is_getter () const { FETCH_FLAG_FROM_VM(is_getter); } |
1311 | bool ciMethod::is_setter () const { FETCH_FLAG_FROM_VM(is_setter); } |
1312 | bool ciMethod::is_accessor () const { FETCH_FLAG_FROM_VM(is_accessor); } |
1313 | bool ciMethod::is_initializer () const { FETCH_FLAG_FROM_VM(is_initializer); } |
1314 | |
1315 | bool ciMethod::is_boxing_method() const { |
1316 | if (holder()->is_box_klass()) { |
1317 | switch (intrinsic_id()) { |
1318 | case vmIntrinsics::_Boolean_valueOf: |
1319 | case vmIntrinsics::_Byte_valueOf: |
1320 | case vmIntrinsics::_Character_valueOf: |
1321 | case vmIntrinsics::_Short_valueOf: |
1322 | case vmIntrinsics::_Integer_valueOf: |
1323 | case vmIntrinsics::_Long_valueOf: |
1324 | case vmIntrinsics::_Float_valueOf: |
1325 | case vmIntrinsics::_Double_valueOf: |
1326 | return true; |
1327 | default: |
1328 | return false; |
1329 | } |
1330 | } |
1331 | return false; |
1332 | } |
1333 | |
1334 | bool ciMethod::is_unboxing_method() const { |
1335 | if (holder()->is_box_klass()) { |
1336 | switch (intrinsic_id()) { |
1337 | case vmIntrinsics::_booleanValue: |
1338 | case vmIntrinsics::_byteValue: |
1339 | case vmIntrinsics::_charValue: |
1340 | case vmIntrinsics::_shortValue: |
1341 | case vmIntrinsics::_intValue: |
1342 | case vmIntrinsics::_longValue: |
1343 | case vmIntrinsics::_floatValue: |
1344 | case vmIntrinsics::_doubleValue: |
1345 | return true; |
1346 | default: |
1347 | return false; |
1348 | } |
1349 | } |
1350 | return false; |
1351 | } |
1352 | |
1353 | BCEscapeAnalyzer *ciMethod::get_bcea() { |
1354 | #ifdef COMPILER2 |
1355 | if (_bcea == NULL) { |
1356 | _bcea = new (CURRENT_ENV->arena()) BCEscapeAnalyzer(this, NULL); |
1357 | } |
1358 | return _bcea; |
1359 | #else // COMPILER2 |
1360 | ShouldNotReachHere(); |
1361 | return NULL; |
1362 | #endif // COMPILER2 |
1363 | } |
1364 | |
1365 | ciMethodBlocks *ciMethod::get_method_blocks() { |
1366 | Arena *arena = CURRENT_ENV->arena(); |
1367 | if (_method_blocks == NULL) { |
1368 | _method_blocks = new (arena) ciMethodBlocks(arena, this); |
1369 | } |
1370 | return _method_blocks; |
1371 | } |
1372 | |
1373 | #undef FETCH_FLAG_FROM_VM |
1374 | |
1375 | void ciMethod::dump_name_as_ascii(outputStream* st) { |
1376 | Method* method = get_Method(); |
1377 | st->print("%s %s %s" , |
1378 | method->klass_name()->as_quoted_ascii(), |
1379 | method->name()->as_quoted_ascii(), |
1380 | method->signature()->as_quoted_ascii()); |
1381 | } |
1382 | |
1383 | void ciMethod::dump_replay_data(outputStream* st) { |
1384 | ResourceMark rm; |
1385 | Method* method = get_Method(); |
1386 | MethodCounters* mcs = method->method_counters(); |
1387 | st->print("ciMethod " ); |
1388 | dump_name_as_ascii(st); |
1389 | st->print_cr(" %d %d %d %d %d" , |
1390 | mcs == NULL ? 0 : mcs->invocation_counter()->raw_counter(), |
1391 | mcs == NULL ? 0 : mcs->backedge_counter()->raw_counter(), |
1392 | interpreter_invocation_count(), |
1393 | interpreter_throwout_count(), |
1394 | _instructions_size); |
1395 | } |
1396 | |
1397 | // ------------------------------------------------------------------ |
1398 | // ciMethod::print_codes |
1399 | // |
1400 | // Print a range of the bytecodes for this method. |
1401 | void ciMethod::print_codes_on(int from, int to, outputStream* st) { |
1402 | check_is_loaded(); |
1403 | GUARDED_VM_ENTRY(get_Method()->print_codes_on(from, to, st);) |
1404 | } |
1405 | |
1406 | // ------------------------------------------------------------------ |
1407 | // ciMethod::print_name |
1408 | // |
1409 | // Print the name of this method, including signature and some flags. |
1410 | void ciMethod::print_name(outputStream* st) { |
1411 | check_is_loaded(); |
1412 | GUARDED_VM_ENTRY(get_Method()->print_name(st);) |
1413 | } |
1414 | |
1415 | // ------------------------------------------------------------------ |
1416 | // ciMethod::print_short_name |
1417 | // |
1418 | // Print the name of this method, without signature. |
1419 | void ciMethod::print_short_name(outputStream* st) { |
1420 | if (is_loaded()) { |
1421 | GUARDED_VM_ENTRY(get_Method()->print_short_name(st);); |
1422 | } else { |
1423 | // Fall back if method is not loaded. |
1424 | holder()->print_name_on(st); |
1425 | st->print("::" ); |
1426 | name()->print_symbol_on(st); |
1427 | if (WizardMode) |
1428 | signature()->as_symbol()->print_symbol_on(st); |
1429 | } |
1430 | } |
1431 | |
1432 | // ------------------------------------------------------------------ |
1433 | // ciMethod::print_impl |
1434 | // |
1435 | // Implementation of the print method. |
1436 | void ciMethod::print_impl(outputStream* st) { |
1437 | ciMetadata::print_impl(st); |
1438 | st->print(" name=" ); |
1439 | name()->print_symbol_on(st); |
1440 | st->print(" holder=" ); |
1441 | holder()->print_name_on(st); |
1442 | st->print(" signature=" ); |
1443 | signature()->as_symbol()->print_symbol_on(st); |
1444 | if (is_loaded()) { |
1445 | st->print(" loaded=true" ); |
1446 | st->print(" arg_size=%d" , arg_size()); |
1447 | st->print(" flags=" ); |
1448 | flags().print_member_flags(st); |
1449 | } else { |
1450 | st->print(" loaded=false" ); |
1451 | } |
1452 | } |
1453 | |
1454 | // ------------------------------------------------------------------ |
1455 | |
1456 | static BasicType erase_to_word_type(BasicType bt) { |
1457 | if (is_subword_type(bt)) return T_INT; |
1458 | if (bt == T_ARRAY) return T_OBJECT; |
1459 | return bt; |
1460 | } |
1461 | |
1462 | static bool basic_types_match(ciType* t1, ciType* t2) { |
1463 | if (t1 == t2) return true; |
1464 | return erase_to_word_type(t1->basic_type()) == erase_to_word_type(t2->basic_type()); |
1465 | } |
1466 | |
1467 | bool ciMethod::is_consistent_info(ciMethod* declared_method, ciMethod* resolved_method) { |
1468 | bool invoke_through_mh_intrinsic = declared_method->is_method_handle_intrinsic() && |
1469 | !resolved_method->is_method_handle_intrinsic(); |
1470 | |
1471 | if (!invoke_through_mh_intrinsic) { |
1472 | // Method name & descriptor should stay the same. |
1473 | // Signatures may reference unloaded types and thus they may be not strictly equal. |
1474 | ciSymbol* declared_signature = declared_method->signature()->as_symbol(); |
1475 | ciSymbol* resolved_signature = resolved_method->signature()->as_symbol(); |
1476 | |
1477 | return (declared_method->name()->equals(resolved_method->name())) && |
1478 | (declared_signature->equals(resolved_signature)); |
1479 | } |
1480 | |
1481 | ciMethod* linker = declared_method; |
1482 | ciMethod* target = resolved_method; |
1483 | // Linkers have appendix argument which is not passed to callee. |
1484 | int has_appendix = MethodHandles::has_member_arg(linker->intrinsic_id()) ? 1 : 0; |
1485 | if (linker->arg_size() != (target->arg_size() + has_appendix)) { |
1486 | return false; // argument slot count mismatch |
1487 | } |
1488 | |
1489 | ciSignature* linker_sig = linker->signature(); |
1490 | ciSignature* target_sig = target->signature(); |
1491 | |
1492 | if (linker_sig->count() + (linker->is_static() ? 0 : 1) != |
1493 | target_sig->count() + (target->is_static() ? 0 : 1) + has_appendix) { |
1494 | return false; // argument count mismatch |
1495 | } |
1496 | |
1497 | int sbase = 0, rbase = 0; |
1498 | switch (linker->intrinsic_id()) { |
1499 | case vmIntrinsics::_linkToVirtual: |
1500 | case vmIntrinsics::_linkToInterface: |
1501 | case vmIntrinsics::_linkToSpecial: { |
1502 | if (target->is_static()) { |
1503 | return false; |
1504 | } |
1505 | if (linker_sig->type_at(0)->is_primitive_type()) { |
1506 | return false; // receiver should be an oop |
1507 | } |
1508 | sbase = 1; // skip receiver |
1509 | break; |
1510 | } |
1511 | case vmIntrinsics::_linkToStatic: { |
1512 | if (!target->is_static()) { |
1513 | return false; |
1514 | } |
1515 | break; |
1516 | } |
1517 | case vmIntrinsics::_invokeBasic: { |
1518 | if (target->is_static()) { |
1519 | if (target_sig->type_at(0)->is_primitive_type()) { |
1520 | return false; // receiver should be an oop |
1521 | } |
1522 | rbase = 1; // skip receiver |
1523 | } |
1524 | break; |
1525 | } |
1526 | default: |
1527 | break; |
1528 | } |
1529 | assert(target_sig->count() - rbase == linker_sig->count() - sbase - has_appendix, "argument count mismatch" ); |
1530 | int arg_count = target_sig->count() - rbase; |
1531 | for (int i = 0; i < arg_count; i++) { |
1532 | if (!basic_types_match(linker_sig->type_at(sbase + i), target_sig->type_at(rbase + i))) { |
1533 | return false; |
1534 | } |
1535 | } |
1536 | // Only check the return type if the symbolic info has non-void return type. |
1537 | // I.e. the return value of the resolved method can be dropped. |
1538 | if (!linker->return_type()->is_void() && |
1539 | !basic_types_match(linker->return_type(), target->return_type())) { |
1540 | return false; |
1541 | } |
1542 | return true; // no mismatch found |
1543 | } |
1544 | |
1545 | // ------------------------------------------------------------------ |
1546 | |