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