Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/jdk17u
Path: blob/master/src/hotspot/share/ci/ciEnv.cpp
64441 views
1
/*
2
* Copyright (c) 1999, 2021, 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 "jvm.h"
27
#include "ci/ciConstant.hpp"
28
#include "ci/ciEnv.hpp"
29
#include "ci/ciField.hpp"
30
#include "ci/ciInstance.hpp"
31
#include "ci/ciInstanceKlass.hpp"
32
#include "ci/ciMethod.hpp"
33
#include "ci/ciNullObject.hpp"
34
#include "ci/ciReplay.hpp"
35
#include "ci/ciSymbols.hpp"
36
#include "ci/ciUtilities.inline.hpp"
37
#include "classfile/javaClasses.hpp"
38
#include "classfile/symbolTable.hpp"
39
#include "classfile/systemDictionary.hpp"
40
#include "classfile/vmClasses.hpp"
41
#include "classfile/vmSymbols.hpp"
42
#include "code/codeCache.hpp"
43
#include "code/scopeDesc.hpp"
44
#include "compiler/compilationPolicy.hpp"
45
#include "compiler/compileBroker.hpp"
46
#include "compiler/compilerEvent.hpp"
47
#include "compiler/compileLog.hpp"
48
#include "compiler/compileTask.hpp"
49
#include "compiler/disassembler.hpp"
50
#include "gc/shared/collectedHeap.inline.hpp"
51
#include "interpreter/linkResolver.hpp"
52
#include "jfr/jfrEvents.hpp"
53
#include "logging/log.hpp"
54
#include "memory/allocation.inline.hpp"
55
#include "memory/oopFactory.hpp"
56
#include "memory/resourceArea.hpp"
57
#include "memory/universe.hpp"
58
#include "oops/constantPool.inline.hpp"
59
#include "oops/cpCache.inline.hpp"
60
#include "oops/method.inline.hpp"
61
#include "oops/methodData.hpp"
62
#include "oops/objArrayKlass.hpp"
63
#include "oops/objArrayOop.inline.hpp"
64
#include "oops/oop.inline.hpp"
65
#include "prims/jvmtiExport.hpp"
66
#include "prims/methodHandles.hpp"
67
#include "runtime/handles.inline.hpp"
68
#include "runtime/init.hpp"
69
#include "runtime/reflection.hpp"
70
#include "runtime/jniHandles.inline.hpp"
71
#include "runtime/safepointVerifiers.hpp"
72
#include "runtime/sharedRuntime.hpp"
73
#include "runtime/thread.inline.hpp"
74
#include "utilities/dtrace.hpp"
75
#include "utilities/macros.hpp"
76
#ifdef COMPILER1
77
#include "c1/c1_Runtime1.hpp"
78
#endif
79
#ifdef COMPILER2
80
#include "opto/runtime.hpp"
81
#endif
82
83
// ciEnv
84
//
85
// This class is the top level broker for requests from the compiler
86
// to the VM.
87
88
ciObject* ciEnv::_null_object_instance;
89
90
#define VM_CLASS_DEFN(name, ignore_s) ciInstanceKlass* ciEnv::_##name = NULL;
91
VM_CLASSES_DO(VM_CLASS_DEFN)
92
#undef VM_CLASS_DEFN
93
94
ciSymbol* ciEnv::_unloaded_cisymbol = NULL;
95
ciInstanceKlass* ciEnv::_unloaded_ciinstance_klass = NULL;
96
ciObjArrayKlass* ciEnv::_unloaded_ciobjarrayklass = NULL;
97
98
jobject ciEnv::_ArrayIndexOutOfBoundsException_handle = NULL;
99
jobject ciEnv::_ArrayStoreException_handle = NULL;
100
jobject ciEnv::_ClassCastException_handle = NULL;
101
102
#ifndef PRODUCT
103
static bool firstEnv = true;
104
#endif /* PRODUCT */
105
106
// ------------------------------------------------------------------
107
// ciEnv::ciEnv
108
ciEnv::ciEnv(CompileTask* task)
109
: _ciEnv_arena(mtCompiler) {
110
VM_ENTRY_MARK;
111
112
// Set up ciEnv::current immediately, for the sake of ciObjectFactory, etc.
113
thread->set_env(this);
114
assert(ciEnv::current() == this, "sanity");
115
116
_oop_recorder = NULL;
117
_debug_info = NULL;
118
_dependencies = NULL;
119
_failure_reason = NULL;
120
_inc_decompile_count_on_failure = true;
121
_compilable = MethodCompilable;
122
_break_at_compile = false;
123
_compiler_data = NULL;
124
#ifndef PRODUCT
125
assert(!firstEnv, "not initialized properly");
126
#endif /* !PRODUCT */
127
128
_num_inlined_bytecodes = 0;
129
assert(task == NULL || thread->task() == task, "sanity");
130
if (task != NULL) {
131
task->mark_started(os::elapsed_counter());
132
}
133
_task = task;
134
_log = NULL;
135
136
// Temporary buffer for creating symbols and such.
137
_name_buffer = NULL;
138
_name_buffer_len = 0;
139
140
_arena = &_ciEnv_arena;
141
_factory = new (_arena) ciObjectFactory(_arena, 128);
142
143
// Preload commonly referenced system ciObjects.
144
145
// During VM initialization, these instances have not yet been created.
146
// Assertions ensure that these instances are not accessed before
147
// their initialization.
148
149
assert(Universe::is_fully_initialized(), "should be complete");
150
151
oop o = Universe::null_ptr_exception_instance();
152
assert(o != NULL, "should have been initialized");
153
_NullPointerException_instance = get_object(o)->as_instance();
154
o = Universe::arithmetic_exception_instance();
155
assert(o != NULL, "should have been initialized");
156
_ArithmeticException_instance = get_object(o)->as_instance();
157
158
_ArrayIndexOutOfBoundsException_instance = NULL;
159
_ArrayStoreException_instance = NULL;
160
_ClassCastException_instance = NULL;
161
_the_null_string = NULL;
162
_the_min_jint_string = NULL;
163
164
_jvmti_redefinition_count = 0;
165
_jvmti_can_hotswap_or_post_breakpoint = false;
166
_jvmti_can_access_local_variables = false;
167
_jvmti_can_post_on_exceptions = false;
168
_jvmti_can_pop_frame = false;
169
}
170
171
ciEnv::ciEnv(Arena* arena) : _ciEnv_arena(mtCompiler) {
172
ASSERT_IN_VM;
173
174
// Set up ciEnv::current immediately, for the sake of ciObjectFactory, etc.
175
CompilerThread* current_thread = CompilerThread::current();
176
assert(current_thread->env() == NULL, "must be");
177
current_thread->set_env(this);
178
assert(ciEnv::current() == this, "sanity");
179
180
_oop_recorder = NULL;
181
_debug_info = NULL;
182
_dependencies = NULL;
183
_failure_reason = NULL;
184
_inc_decompile_count_on_failure = true;
185
_compilable = MethodCompilable_never;
186
_break_at_compile = false;
187
_compiler_data = NULL;
188
#ifndef PRODUCT
189
assert(firstEnv, "must be first");
190
firstEnv = false;
191
#endif /* !PRODUCT */
192
193
_num_inlined_bytecodes = 0;
194
_task = NULL;
195
_log = NULL;
196
197
// Temporary buffer for creating symbols and such.
198
_name_buffer = NULL;
199
_name_buffer_len = 0;
200
201
_arena = arena;
202
_factory = new (_arena) ciObjectFactory(_arena, 128);
203
204
// Preload commonly referenced system ciObjects.
205
206
// During VM initialization, these instances have not yet been created.
207
// Assertions ensure that these instances are not accessed before
208
// their initialization.
209
210
assert(Universe::is_fully_initialized(), "must be");
211
212
_NullPointerException_instance = NULL;
213
_ArithmeticException_instance = NULL;
214
_ArrayIndexOutOfBoundsException_instance = NULL;
215
_ArrayStoreException_instance = NULL;
216
_ClassCastException_instance = NULL;
217
_the_null_string = NULL;
218
_the_min_jint_string = NULL;
219
220
_jvmti_redefinition_count = 0;
221
_jvmti_can_hotswap_or_post_breakpoint = false;
222
_jvmti_can_access_local_variables = false;
223
_jvmti_can_post_on_exceptions = false;
224
_jvmti_can_pop_frame = false;
225
}
226
227
ciEnv::~ciEnv() {
228
GUARDED_VM_ENTRY(
229
CompilerThread* current_thread = CompilerThread::current();
230
_factory->remove_symbols();
231
// Need safepoint to clear the env on the thread. RedefineClasses might
232
// be reading it.
233
current_thread->set_env(NULL);
234
)
235
}
236
237
// ------------------------------------------------------------------
238
// Cache Jvmti state
239
bool ciEnv::cache_jvmti_state() {
240
VM_ENTRY_MARK;
241
// Get Jvmti capabilities under lock to get consistant values.
242
MutexLocker mu(JvmtiThreadState_lock);
243
_jvmti_redefinition_count = JvmtiExport::redefinition_count();
244
_jvmti_can_hotswap_or_post_breakpoint = JvmtiExport::can_hotswap_or_post_breakpoint();
245
_jvmti_can_access_local_variables = JvmtiExport::can_access_local_variables();
246
_jvmti_can_post_on_exceptions = JvmtiExport::can_post_on_exceptions();
247
_jvmti_can_pop_frame = JvmtiExport::can_pop_frame();
248
_jvmti_can_get_owned_monitor_info = JvmtiExport::can_get_owned_monitor_info();
249
_jvmti_can_walk_any_space = JvmtiExport::can_walk_any_space();
250
return _task != NULL && _task->method()->is_old();
251
}
252
253
bool ciEnv::jvmti_state_changed() const {
254
// Some classes were redefined
255
if (_jvmti_redefinition_count != JvmtiExport::redefinition_count()) {
256
return true;
257
}
258
259
if (!_jvmti_can_access_local_variables &&
260
JvmtiExport::can_access_local_variables()) {
261
return true;
262
}
263
if (!_jvmti_can_hotswap_or_post_breakpoint &&
264
JvmtiExport::can_hotswap_or_post_breakpoint()) {
265
return true;
266
}
267
if (!_jvmti_can_post_on_exceptions &&
268
JvmtiExport::can_post_on_exceptions()) {
269
return true;
270
}
271
if (!_jvmti_can_pop_frame &&
272
JvmtiExport::can_pop_frame()) {
273
return true;
274
}
275
if (!_jvmti_can_get_owned_monitor_info &&
276
JvmtiExport::can_get_owned_monitor_info()) {
277
return true;
278
}
279
if (!_jvmti_can_walk_any_space &&
280
JvmtiExport::can_walk_any_space()) {
281
return true;
282
}
283
284
return false;
285
}
286
287
// ------------------------------------------------------------------
288
// Cache DTrace flags
289
void ciEnv::cache_dtrace_flags() {
290
// Need lock?
291
_dtrace_extended_probes = ExtendedDTraceProbes;
292
if (_dtrace_extended_probes) {
293
_dtrace_method_probes = true;
294
_dtrace_alloc_probes = true;
295
} else {
296
_dtrace_method_probes = DTraceMethodProbes;
297
_dtrace_alloc_probes = DTraceAllocProbes;
298
}
299
}
300
301
// ------------------------------------------------------------------
302
// helper for lazy exception creation
303
ciInstance* ciEnv::get_or_create_exception(jobject& handle, Symbol* name) {
304
VM_ENTRY_MARK;
305
if (handle == NULL) {
306
// Cf. universe.cpp, creation of Universe::_null_ptr_exception_instance.
307
InstanceKlass* ik = SystemDictionary::find_instance_klass(name, Handle(), Handle());
308
jobject objh = NULL;
309
if (ik != NULL) {
310
oop obj = ik->allocate_instance(THREAD);
311
if (!HAS_PENDING_EXCEPTION)
312
objh = JNIHandles::make_global(Handle(THREAD, obj));
313
}
314
if (HAS_PENDING_EXCEPTION) {
315
CLEAR_PENDING_EXCEPTION;
316
} else {
317
handle = objh;
318
}
319
}
320
oop obj = JNIHandles::resolve(handle);
321
return obj == NULL? NULL: get_object(obj)->as_instance();
322
}
323
324
ciInstance* ciEnv::ArrayIndexOutOfBoundsException_instance() {
325
if (_ArrayIndexOutOfBoundsException_instance == NULL) {
326
_ArrayIndexOutOfBoundsException_instance
327
= get_or_create_exception(_ArrayIndexOutOfBoundsException_handle,
328
vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
329
}
330
return _ArrayIndexOutOfBoundsException_instance;
331
}
332
ciInstance* ciEnv::ArrayStoreException_instance() {
333
if (_ArrayStoreException_instance == NULL) {
334
_ArrayStoreException_instance
335
= get_or_create_exception(_ArrayStoreException_handle,
336
vmSymbols::java_lang_ArrayStoreException());
337
}
338
return _ArrayStoreException_instance;
339
}
340
ciInstance* ciEnv::ClassCastException_instance() {
341
if (_ClassCastException_instance == NULL) {
342
_ClassCastException_instance
343
= get_or_create_exception(_ClassCastException_handle,
344
vmSymbols::java_lang_ClassCastException());
345
}
346
return _ClassCastException_instance;
347
}
348
349
ciInstance* ciEnv::the_null_string() {
350
if (_the_null_string == NULL) {
351
VM_ENTRY_MARK;
352
_the_null_string = get_object(Universe::the_null_string())->as_instance();
353
}
354
return _the_null_string;
355
}
356
357
ciInstance* ciEnv::the_min_jint_string() {
358
if (_the_min_jint_string == NULL) {
359
VM_ENTRY_MARK;
360
_the_min_jint_string = get_object(Universe::the_min_jint_string())->as_instance();
361
}
362
return _the_min_jint_string;
363
}
364
365
// ------------------------------------------------------------------
366
// ciEnv::get_method_from_handle
367
ciMethod* ciEnv::get_method_from_handle(Method* method) {
368
VM_ENTRY_MARK;
369
return get_metadata(method)->as_method();
370
}
371
372
// ------------------------------------------------------------------
373
// ciEnv::check_klass_accessiblity
374
//
375
// Note: the logic of this method should mirror the logic of
376
// ConstantPool::verify_constant_pool_resolve.
377
bool ciEnv::check_klass_accessibility(ciKlass* accessing_klass,
378
Klass* resolved_klass) {
379
if (accessing_klass == NULL || !accessing_klass->is_loaded()) {
380
return true;
381
}
382
if (accessing_klass->is_obj_array_klass()) {
383
accessing_klass = accessing_klass->as_obj_array_klass()->base_element_klass();
384
}
385
if (!accessing_klass->is_instance_klass()) {
386
return true;
387
}
388
389
if (resolved_klass->is_objArray_klass()) {
390
// Find the element klass, if this is an array.
391
resolved_klass = ObjArrayKlass::cast(resolved_klass)->bottom_klass();
392
}
393
if (resolved_klass->is_instance_klass()) {
394
return (Reflection::verify_class_access(accessing_klass->get_Klass(),
395
InstanceKlass::cast(resolved_klass),
396
true) == Reflection::ACCESS_OK);
397
}
398
return true;
399
}
400
401
// ------------------------------------------------------------------
402
// ciEnv::get_klass_by_name_impl
403
ciKlass* ciEnv::get_klass_by_name_impl(ciKlass* accessing_klass,
404
const constantPoolHandle& cpool,
405
ciSymbol* name,
406
bool require_local) {
407
ASSERT_IN_VM;
408
Thread* current = Thread::current();
409
410
// Now we need to check the SystemDictionary
411
Symbol* sym = name->get_symbol();
412
if (Signature::has_envelope(sym)) {
413
// This is a name from a signature. Strip off the trimmings.
414
// Call recursive to keep scope of strippedsym.
415
TempNewSymbol strippedsym = Signature::strip_envelope(sym);
416
ciSymbol* strippedname = get_symbol(strippedsym);
417
return get_klass_by_name_impl(accessing_klass, cpool, strippedname, require_local);
418
}
419
420
// Check for prior unloaded klass. The SystemDictionary's answers
421
// can vary over time but the compiler needs consistency.
422
ciKlass* unloaded_klass = check_get_unloaded_klass(accessing_klass, name);
423
if (unloaded_klass != NULL) {
424
if (require_local) return NULL;
425
return unloaded_klass;
426
}
427
428
Handle loader;
429
Handle domain;
430
if (accessing_klass != NULL) {
431
loader = Handle(current, accessing_klass->loader());
432
domain = Handle(current, accessing_klass->protection_domain());
433
}
434
435
Klass* found_klass;
436
{
437
ttyUnlocker ttyul; // release tty lock to avoid ordering problems
438
MutexLocker ml(current, Compile_lock);
439
Klass* kls;
440
if (!require_local) {
441
kls = SystemDictionary::find_constrained_instance_or_array_klass(current, sym, loader);
442
} else {
443
kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain);
444
}
445
found_klass = kls;
446
}
447
448
// If we fail to find an array klass, look again for its element type.
449
// The element type may be available either locally or via constraints.
450
// In either case, if we can find the element type in the system dictionary,
451
// we must build an array type around it. The CI requires array klasses
452
// to be loaded if their element klasses are loaded, except when memory
453
// is exhausted.
454
if (Signature::is_array(sym) &&
455
(sym->char_at(1) == JVM_SIGNATURE_ARRAY || sym->char_at(1) == JVM_SIGNATURE_CLASS)) {
456
// We have an unloaded array.
457
// Build it on the fly if the element class exists.
458
SignatureStream ss(sym, false);
459
ss.skip_array_prefix(1);
460
// Get element ciKlass recursively.
461
ciKlass* elem_klass =
462
get_klass_by_name_impl(accessing_klass,
463
cpool,
464
get_symbol(ss.as_symbol()),
465
require_local);
466
if (elem_klass != NULL && elem_klass->is_loaded()) {
467
// Now make an array for it
468
return ciObjArrayKlass::make_impl(elem_klass);
469
}
470
}
471
472
if (found_klass == NULL && !cpool.is_null() && cpool->has_preresolution()) {
473
// Look inside the constant pool for pre-resolved class entries.
474
for (int i = cpool->length() - 1; i >= 1; i--) {
475
if (cpool->tag_at(i).is_klass()) {
476
Klass* kls = cpool->resolved_klass_at(i);
477
if (kls->name() == sym) {
478
found_klass = kls;
479
break;
480
}
481
}
482
}
483
}
484
485
if (found_klass != NULL) {
486
// Found it. Build a CI handle.
487
return get_klass(found_klass);
488
}
489
490
if (require_local) return NULL;
491
492
// Not yet loaded into the VM, or not governed by loader constraints.
493
// Make a CI representative for it.
494
return get_unloaded_klass(accessing_klass, name);
495
}
496
497
// ------------------------------------------------------------------
498
// ciEnv::get_klass_by_name
499
ciKlass* ciEnv::get_klass_by_name(ciKlass* accessing_klass,
500
ciSymbol* klass_name,
501
bool require_local) {
502
GUARDED_VM_ENTRY(return get_klass_by_name_impl(accessing_klass,
503
constantPoolHandle(),
504
klass_name,
505
require_local);)
506
}
507
508
// ------------------------------------------------------------------
509
// ciEnv::get_klass_by_index_impl
510
//
511
// Implementation of get_klass_by_index.
512
ciKlass* ciEnv::get_klass_by_index_impl(const constantPoolHandle& cpool,
513
int index,
514
bool& is_accessible,
515
ciInstanceKlass* accessor) {
516
Klass* klass = NULL;
517
Symbol* klass_name = NULL;
518
519
if (cpool->tag_at(index).is_symbol()) {
520
klass_name = cpool->symbol_at(index);
521
} else {
522
// Check if it's resolved if it's not a symbol constant pool entry.
523
klass = ConstantPool::klass_at_if_loaded(cpool, index);
524
// Try to look it up by name.
525
if (klass == NULL) {
526
klass_name = cpool->klass_name_at(index);
527
}
528
}
529
530
if (klass == NULL) {
531
// Not found in constant pool. Use the name to do the lookup.
532
ciKlass* k = get_klass_by_name_impl(accessor,
533
cpool,
534
get_symbol(klass_name),
535
false);
536
// Calculate accessibility the hard way.
537
if (!k->is_loaded()) {
538
is_accessible = false;
539
} else if (k->loader() != accessor->loader() &&
540
get_klass_by_name_impl(accessor, cpool, k->name(), true) == NULL) {
541
// Loaded only remotely. Not linked yet.
542
is_accessible = false;
543
} else {
544
// Linked locally, and we must also check public/private, etc.
545
is_accessible = check_klass_accessibility(accessor, k->get_Klass());
546
}
547
return k;
548
}
549
550
// Check for prior unloaded klass. The SystemDictionary's answers
551
// can vary over time but the compiler needs consistency.
552
ciSymbol* name = get_symbol(klass->name());
553
ciKlass* unloaded_klass = check_get_unloaded_klass(accessor, name);
554
if (unloaded_klass != NULL) {
555
is_accessible = false;
556
return unloaded_klass;
557
}
558
559
// It is known to be accessible, since it was found in the constant pool.
560
is_accessible = true;
561
return get_klass(klass);
562
}
563
564
// ------------------------------------------------------------------
565
// ciEnv::get_klass_by_index
566
//
567
// Get a klass from the constant pool.
568
ciKlass* ciEnv::get_klass_by_index(const constantPoolHandle& cpool,
569
int index,
570
bool& is_accessible,
571
ciInstanceKlass* accessor) {
572
GUARDED_VM_ENTRY(return get_klass_by_index_impl(cpool, index, is_accessible, accessor);)
573
}
574
575
// ------------------------------------------------------------------
576
// ciEnv::get_constant_by_index_impl
577
//
578
// Implementation of get_constant_by_index().
579
ciConstant ciEnv::get_constant_by_index_impl(const constantPoolHandle& cpool,
580
int pool_index, int cache_index,
581
ciInstanceKlass* accessor) {
582
int index = pool_index;
583
if (cache_index >= 0) {
584
assert(index < 0, "only one kind of index at a time");
585
index = cpool->object_to_cp_index(cache_index);
586
oop obj = cpool->resolved_references()->obj_at(cache_index);
587
if (obj != NULL) {
588
if (obj == Universe::the_null_sentinel()) {
589
return ciConstant(T_OBJECT, get_object(NULL));
590
}
591
BasicType bt = T_OBJECT;
592
if (cpool->tag_at(index).is_dynamic_constant()) {
593
bt = Signature::basic_type(cpool->uncached_signature_ref_at(index));
594
}
595
if (!is_reference_type(bt)) {
596
// we have to unbox the primitive value
597
if (!is_java_primitive(bt)) {
598
return ciConstant();
599
}
600
jvalue value;
601
BasicType bt2 = java_lang_boxing_object::get_value(obj, &value);
602
assert(bt2 == bt, "");
603
switch (bt2) {
604
case T_DOUBLE: return ciConstant(value.d);
605
case T_FLOAT: return ciConstant(value.f);
606
case T_LONG: return ciConstant(value.j);
607
case T_INT: return ciConstant(bt2, value.i);
608
case T_SHORT: return ciConstant(bt2, value.s);
609
case T_BYTE: return ciConstant(bt2, value.b);
610
case T_CHAR: return ciConstant(bt2, value.c);
611
case T_BOOLEAN: return ciConstant(bt2, value.z);
612
default: return ciConstant();
613
}
614
}
615
ciObject* ciobj = get_object(obj);
616
if (ciobj->is_array()) {
617
return ciConstant(T_ARRAY, ciobj);
618
} else {
619
assert(ciobj->is_instance(), "should be an instance");
620
return ciConstant(T_OBJECT, ciobj);
621
}
622
}
623
}
624
constantTag tag = cpool->tag_at(index);
625
if (tag.is_int()) {
626
return ciConstant(T_INT, (jint)cpool->int_at(index));
627
} else if (tag.is_long()) {
628
return ciConstant((jlong)cpool->long_at(index));
629
} else if (tag.is_float()) {
630
return ciConstant((jfloat)cpool->float_at(index));
631
} else if (tag.is_double()) {
632
return ciConstant((jdouble)cpool->double_at(index));
633
} else if (tag.is_string()) {
634
EXCEPTION_CONTEXT;
635
oop string = NULL;
636
assert(cache_index >= 0, "should have a cache index");
637
string = cpool->string_at(index, cache_index, THREAD);
638
if (HAS_PENDING_EXCEPTION) {
639
CLEAR_PENDING_EXCEPTION;
640
record_out_of_memory_failure();
641
return ciConstant();
642
}
643
ciObject* constant = get_object(string);
644
if (constant->is_array()) {
645
return ciConstant(T_ARRAY, constant);
646
} else {
647
assert (constant->is_instance(), "must be an instance, or not? ");
648
return ciConstant(T_OBJECT, constant);
649
}
650
} else if (tag.is_unresolved_klass_in_error()) {
651
return ciConstant(T_OBJECT, get_unloaded_klass_mirror(NULL));
652
} else if (tag.is_klass() || tag.is_unresolved_klass()) {
653
bool will_link;
654
ciKlass* klass = get_klass_by_index_impl(cpool, index, will_link, accessor);
655
assert (klass->is_instance_klass() || klass->is_array_klass(),
656
"must be an instance or array klass ");
657
ciInstance* mirror = (will_link ? klass->java_mirror() : get_unloaded_klass_mirror(klass));
658
return ciConstant(T_OBJECT, mirror);
659
} else if (tag.is_method_type() || tag.is_method_type_in_error()) {
660
// must execute Java code to link this CP entry into cache[i].f1
661
ciSymbol* signature = get_symbol(cpool->method_type_signature_at(index));
662
ciObject* ciobj = get_unloaded_method_type_constant(signature);
663
return ciConstant(T_OBJECT, ciobj);
664
} else if (tag.is_method_handle() || tag.is_method_handle_in_error()) {
665
// must execute Java code to link this CP entry into cache[i].f1
666
bool ignore_will_link;
667
int ref_kind = cpool->method_handle_ref_kind_at(index);
668
int callee_index = cpool->method_handle_klass_index_at(index);
669
ciKlass* callee = get_klass_by_index_impl(cpool, callee_index, ignore_will_link, accessor);
670
ciSymbol* name = get_symbol(cpool->method_handle_name_ref_at(index));
671
ciSymbol* signature = get_symbol(cpool->method_handle_signature_ref_at(index));
672
ciObject* ciobj = get_unloaded_method_handle_constant(callee, name, signature, ref_kind);
673
return ciConstant(T_OBJECT, ciobj);
674
} else if (tag.is_dynamic_constant() || tag.is_dynamic_constant_in_error()) {
675
return ciConstant(); // not supported
676
} else {
677
assert(false, "unknown tag: %d (%s)", tag.value(), tag.internal_name());
678
return ciConstant();
679
}
680
}
681
682
// ------------------------------------------------------------------
683
// ciEnv::get_constant_by_index
684
//
685
// Pull a constant out of the constant pool. How appropriate.
686
//
687
// Implementation note: this query is currently in no way cached.
688
ciConstant ciEnv::get_constant_by_index(const constantPoolHandle& cpool,
689
int pool_index, int cache_index,
690
ciInstanceKlass* accessor) {
691
GUARDED_VM_ENTRY(return get_constant_by_index_impl(cpool, pool_index, cache_index, accessor);)
692
}
693
694
// ------------------------------------------------------------------
695
// ciEnv::get_field_by_index_impl
696
//
697
// Implementation of get_field_by_index.
698
//
699
// Implementation note: the results of field lookups are cached
700
// in the accessor klass.
701
ciField* ciEnv::get_field_by_index_impl(ciInstanceKlass* accessor,
702
int index) {
703
ciConstantPoolCache* cache = accessor->field_cache();
704
if (cache == NULL) {
705
ciField* field = new (arena()) ciField(accessor, index);
706
return field;
707
} else {
708
ciField* field = (ciField*)cache->get(index);
709
if (field == NULL) {
710
field = new (arena()) ciField(accessor, index);
711
cache->insert(index, field);
712
}
713
return field;
714
}
715
}
716
717
// ------------------------------------------------------------------
718
// ciEnv::get_field_by_index
719
//
720
// Get a field by index from a klass's constant pool.
721
ciField* ciEnv::get_field_by_index(ciInstanceKlass* accessor,
722
int index) {
723
GUARDED_VM_ENTRY(return get_field_by_index_impl(accessor, index);)
724
}
725
726
// ------------------------------------------------------------------
727
// ciEnv::lookup_method
728
//
729
// Perform an appropriate method lookup based on accessor, holder,
730
// name, signature, and bytecode.
731
Method* ciEnv::lookup_method(ciInstanceKlass* accessor,
732
ciKlass* holder,
733
Symbol* name,
734
Symbol* sig,
735
Bytecodes::Code bc,
736
constantTag tag) {
737
InstanceKlass* accessor_klass = accessor->get_instanceKlass();
738
Klass* holder_klass = holder->get_Klass();
739
740
// Accessibility checks are performed in ciEnv::get_method_by_index_impl.
741
assert(check_klass_accessibility(accessor, holder_klass), "holder not accessible");
742
743
LinkInfo link_info(holder_klass, name, sig, accessor_klass,
744
LinkInfo::AccessCheck::required,
745
LinkInfo::LoaderConstraintCheck::required,
746
tag);
747
switch (bc) {
748
case Bytecodes::_invokestatic:
749
return LinkResolver::resolve_static_call_or_null(link_info);
750
case Bytecodes::_invokespecial:
751
return LinkResolver::resolve_special_call_or_null(link_info);
752
case Bytecodes::_invokeinterface:
753
return LinkResolver::linktime_resolve_interface_method_or_null(link_info);
754
case Bytecodes::_invokevirtual:
755
return LinkResolver::linktime_resolve_virtual_method_or_null(link_info);
756
default:
757
fatal("Unhandled bytecode: %s", Bytecodes::name(bc));
758
return NULL; // silence compiler warnings
759
}
760
}
761
762
763
// ------------------------------------------------------------------
764
// ciEnv::get_method_by_index_impl
765
ciMethod* ciEnv::get_method_by_index_impl(const constantPoolHandle& cpool,
766
int index, Bytecodes::Code bc,
767
ciInstanceKlass* accessor) {
768
assert(cpool.not_null(), "need constant pool");
769
assert(accessor != NULL, "need origin of access");
770
if (bc == Bytecodes::_invokedynamic) {
771
ConstantPoolCacheEntry* cpce = cpool->invokedynamic_cp_cache_entry_at(index);
772
bool is_resolved = !cpce->is_f1_null();
773
// FIXME: code generation could allow for null (unlinked) call site
774
// The call site could be made patchable as follows:
775
// Load the appendix argument from the constant pool.
776
// Test the appendix argument and jump to a known deopt routine if it is null.
777
// Jump through a patchable call site, which is initially a deopt routine.
778
// Patch the call site to the nmethod entry point of the static compiled lambda form.
779
// As with other two-component call sites, both values must be independently verified.
780
781
if (is_resolved) {
782
// Get the invoker Method* from the constant pool.
783
// (The appendix argument, if any, will be noted in the method's signature.)
784
Method* adapter = cpce->f1_as_method();
785
return get_method(adapter);
786
}
787
788
// Fake a method that is equivalent to a declared method.
789
ciInstanceKlass* holder = get_instance_klass(vmClasses::MethodHandle_klass());
790
ciSymbol* name = ciSymbols::invokeBasic_name();
791
ciSymbol* signature = get_symbol(cpool->signature_ref_at(index));
792
return get_unloaded_method(holder, name, signature, accessor);
793
} else {
794
const int holder_index = cpool->klass_ref_index_at(index);
795
bool holder_is_accessible;
796
ciKlass* holder = get_klass_by_index_impl(cpool, holder_index, holder_is_accessible, accessor);
797
798
// Get the method's name and signature.
799
Symbol* name_sym = cpool->name_ref_at(index);
800
Symbol* sig_sym = cpool->signature_ref_at(index);
801
802
if (cpool->has_preresolution()
803
|| ((holder == ciEnv::MethodHandle_klass() || holder == ciEnv::VarHandle_klass()) &&
804
MethodHandles::is_signature_polymorphic_name(holder->get_Klass(), name_sym))) {
805
// Short-circuit lookups for JSR 292-related call sites.
806
// That is, do not rely only on name-based lookups, because they may fail
807
// if the names are not resolvable in the boot class loader (7056328).
808
switch (bc) {
809
case Bytecodes::_invokevirtual:
810
case Bytecodes::_invokeinterface:
811
case Bytecodes::_invokespecial:
812
case Bytecodes::_invokestatic:
813
{
814
Method* m = ConstantPool::method_at_if_loaded(cpool, index);
815
if (m != NULL) {
816
return get_method(m);
817
}
818
}
819
break;
820
default:
821
break;
822
}
823
}
824
825
if (holder_is_accessible) { // Our declared holder is loaded.
826
constantTag tag = cpool->tag_ref_at(index);
827
assert(accessor->get_instanceKlass() == cpool->pool_holder(), "not the pool holder?");
828
Method* m = lookup_method(accessor, holder, name_sym, sig_sym, bc, tag);
829
if (m != NULL &&
830
(bc == Bytecodes::_invokestatic
831
? m->method_holder()->is_not_initialized()
832
: !m->method_holder()->is_loaded())) {
833
m = NULL;
834
}
835
#ifdef ASSERT
836
if (m != NULL && ReplayCompiles && !ciReplay::is_loaded(m)) {
837
m = NULL;
838
}
839
#endif
840
if (m != NULL) {
841
// We found the method.
842
return get_method(m);
843
}
844
}
845
846
// Either the declared holder was not loaded, or the method could
847
// not be found. Create a dummy ciMethod to represent the failed
848
// lookup.
849
ciSymbol* name = get_symbol(name_sym);
850
ciSymbol* signature = get_symbol(sig_sym);
851
return get_unloaded_method(holder, name, signature, accessor);
852
}
853
}
854
855
856
// ------------------------------------------------------------------
857
// ciEnv::get_instance_klass_for_declared_method_holder
858
ciInstanceKlass* ciEnv::get_instance_klass_for_declared_method_holder(ciKlass* method_holder) {
859
// For the case of <array>.clone(), the method holder can be a ciArrayKlass
860
// instead of a ciInstanceKlass. For that case simply pretend that the
861
// declared holder is Object.clone since that's where the call will bottom out.
862
// A more correct fix would trickle out through many interfaces in CI,
863
// requiring ciInstanceKlass* to become ciKlass* and many more places would
864
// require checks to make sure the expected type was found. Given that this
865
// only occurs for clone() the more extensive fix seems like overkill so
866
// instead we simply smear the array type into Object.
867
guarantee(method_holder != NULL, "no method holder");
868
if (method_holder->is_instance_klass()) {
869
return method_holder->as_instance_klass();
870
} else if (method_holder->is_array_klass()) {
871
return current()->Object_klass();
872
} else {
873
ShouldNotReachHere();
874
}
875
return NULL;
876
}
877
878
879
// ------------------------------------------------------------------
880
// ciEnv::get_method_by_index
881
ciMethod* ciEnv::get_method_by_index(const constantPoolHandle& cpool,
882
int index, Bytecodes::Code bc,
883
ciInstanceKlass* accessor) {
884
GUARDED_VM_ENTRY(return get_method_by_index_impl(cpool, index, bc, accessor);)
885
}
886
887
888
// ------------------------------------------------------------------
889
// ciEnv::name_buffer
890
char *ciEnv::name_buffer(int req_len) {
891
if (_name_buffer_len < req_len) {
892
if (_name_buffer == NULL) {
893
_name_buffer = (char*)arena()->Amalloc(sizeof(char)*req_len);
894
_name_buffer_len = req_len;
895
} else {
896
_name_buffer =
897
(char*)arena()->Arealloc(_name_buffer, _name_buffer_len, req_len);
898
_name_buffer_len = req_len;
899
}
900
}
901
return _name_buffer;
902
}
903
904
// ------------------------------------------------------------------
905
// ciEnv::is_in_vm
906
bool ciEnv::is_in_vm() {
907
return JavaThread::current()->thread_state() == _thread_in_vm;
908
}
909
910
// ------------------------------------------------------------------
911
// ciEnv::validate_compile_task_dependencies
912
//
913
// Check for changes during compilation (e.g. class loads, evolution,
914
// breakpoints, call site invalidation).
915
void ciEnv::validate_compile_task_dependencies(ciMethod* target) {
916
if (failing()) return; // no need for further checks
917
918
Dependencies::DepType result = dependencies()->validate_dependencies(_task);
919
if (result != Dependencies::end_marker) {
920
if (result == Dependencies::call_site_target_value) {
921
_inc_decompile_count_on_failure = false;
922
record_failure("call site target change");
923
} else if (Dependencies::is_klass_type(result)) {
924
record_failure("concurrent class loading");
925
} else {
926
record_failure("invalid non-klass dependency");
927
}
928
}
929
}
930
931
// ------------------------------------------------------------------
932
// ciEnv::register_method
933
void ciEnv::register_method(ciMethod* target,
934
int entry_bci,
935
CodeOffsets* offsets,
936
int orig_pc_offset,
937
CodeBuffer* code_buffer,
938
int frame_words,
939
OopMapSet* oop_map_set,
940
ExceptionHandlerTable* handler_table,
941
ImplicitExceptionTable* inc_table,
942
AbstractCompiler* compiler,
943
bool has_unsafe_access,
944
bool has_wide_vectors,
945
RTMState rtm_state,
946
const GrowableArrayView<RuntimeStub*>& native_invokers) {
947
VM_ENTRY_MARK;
948
nmethod* nm = NULL;
949
{
950
methodHandle method(THREAD, target->get_Method());
951
952
// We require method counters to store some method state (max compilation levels) required by the compilation policy.
953
if (method->get_method_counters(THREAD) == NULL) {
954
record_failure("can't create method counters");
955
// All buffers in the CodeBuffer are allocated in the CodeCache.
956
// If the code buffer is created on each compile attempt
957
// as in C2, then it must be freed.
958
code_buffer->free_blob();
959
return;
960
}
961
962
// To prevent compile queue updates.
963
MutexLocker locker(THREAD, MethodCompileQueue_lock);
964
965
// Prevent SystemDictionary::add_to_hierarchy from running
966
// and invalidating our dependencies until we install this method.
967
// No safepoints are allowed. Otherwise, class redefinition can occur in between.
968
MutexLocker ml(Compile_lock);
969
NoSafepointVerifier nsv;
970
971
// Change in Jvmti state may invalidate compilation.
972
if (!failing() && jvmti_state_changed()) {
973
record_failure("Jvmti state change invalidated dependencies");
974
}
975
976
// Change in DTrace flags may invalidate compilation.
977
if (!failing() &&
978
( (!dtrace_extended_probes() && ExtendedDTraceProbes) ||
979
(!dtrace_method_probes() && DTraceMethodProbes) ||
980
(!dtrace_alloc_probes() && DTraceAllocProbes) )) {
981
record_failure("DTrace flags change invalidated dependencies");
982
}
983
984
if (!failing() && target->needs_clinit_barrier() &&
985
target->holder()->is_in_error_state()) {
986
record_failure("method holder is in error state");
987
}
988
989
if (!failing()) {
990
if (log() != NULL) {
991
// Log the dependencies which this compilation declares.
992
dependencies()->log_all_dependencies();
993
}
994
995
// Encode the dependencies now, so we can check them right away.
996
dependencies()->encode_content_bytes();
997
998
// Check for {class loads, evolution, breakpoints, ...} during compilation
999
validate_compile_task_dependencies(target);
1000
}
1001
#if INCLUDE_RTM_OPT
1002
if (!failing() && (rtm_state != NoRTM) &&
1003
(method()->method_data() != NULL) &&
1004
(method()->method_data()->rtm_state() != rtm_state)) {
1005
// Preemptive decompile if rtm state was changed.
1006
record_failure("RTM state change invalidated rtm code");
1007
}
1008
#endif
1009
1010
if (failing()) {
1011
// While not a true deoptimization, it is a preemptive decompile.
1012
MethodData* mdo = method()->method_data();
1013
if (mdo != NULL && _inc_decompile_count_on_failure) {
1014
mdo->inc_decompile_count();
1015
}
1016
1017
// All buffers in the CodeBuffer are allocated in the CodeCache.
1018
// If the code buffer is created on each compile attempt
1019
// as in C2, then it must be freed.
1020
code_buffer->free_blob();
1021
return;
1022
}
1023
1024
assert(offsets->value(CodeOffsets::Deopt) != -1, "must have deopt entry");
1025
assert(offsets->value(CodeOffsets::Exceptions) != -1, "must have exception entry");
1026
1027
nm = nmethod::new_nmethod(method,
1028
compile_id(),
1029
entry_bci,
1030
offsets,
1031
orig_pc_offset,
1032
debug_info(), dependencies(), code_buffer,
1033
frame_words, oop_map_set,
1034
handler_table, inc_table,
1035
compiler, task()->comp_level(),
1036
native_invokers);
1037
1038
// Free codeBlobs
1039
code_buffer->free_blob();
1040
1041
if (nm != NULL) {
1042
nm->set_has_unsafe_access(has_unsafe_access);
1043
nm->set_has_wide_vectors(has_wide_vectors);
1044
#if INCLUDE_RTM_OPT
1045
nm->set_rtm_state(rtm_state);
1046
#endif
1047
1048
// Record successful registration.
1049
// (Put nm into the task handle *before* publishing to the Java heap.)
1050
if (task() != NULL) {
1051
task()->set_code(nm);
1052
}
1053
1054
if (entry_bci == InvocationEntryBci) {
1055
if (TieredCompilation) {
1056
// If there is an old version we're done with it
1057
CompiledMethod* old = method->code();
1058
if (TraceMethodReplacement && old != NULL) {
1059
ResourceMark rm;
1060
char *method_name = method->name_and_sig_as_C_string();
1061
tty->print_cr("Replacing method %s", method_name);
1062
}
1063
if (old != NULL) {
1064
old->make_not_used();
1065
}
1066
}
1067
1068
LogTarget(Info, nmethod, install) lt;
1069
if (lt.is_enabled()) {
1070
ResourceMark rm;
1071
char *method_name = method->name_and_sig_as_C_string();
1072
lt.print("Installing method (%d) %s ",
1073
task()->comp_level(), method_name);
1074
}
1075
// Allow the code to be executed
1076
MutexLocker ml(CompiledMethod_lock, Mutex::_no_safepoint_check_flag);
1077
if (nm->make_in_use()) {
1078
method->set_code(method, nm);
1079
}
1080
} else {
1081
LogTarget(Info, nmethod, install) lt;
1082
if (lt.is_enabled()) {
1083
ResourceMark rm;
1084
char *method_name = method->name_and_sig_as_C_string();
1085
lt.print("Installing osr method (%d) %s @ %d",
1086
task()->comp_level(), method_name, entry_bci);
1087
}
1088
MutexLocker ml(CompiledMethod_lock, Mutex::_no_safepoint_check_flag);
1089
if (nm->make_in_use()) {
1090
method->method_holder()->add_osr_nmethod(nm);
1091
}
1092
}
1093
}
1094
} // safepoints are allowed again
1095
1096
if (nm != NULL) {
1097
// JVMTI -- compiled method notification (must be done outside lock)
1098
nm->post_compiled_method_load_event();
1099
} else {
1100
// The CodeCache is full.
1101
record_failure("code cache is full");
1102
}
1103
}
1104
1105
// ------------------------------------------------------------------
1106
// ciEnv::comp_level
1107
int ciEnv::comp_level() {
1108
if (task() == NULL) return CompilationPolicy::highest_compile_level();
1109
return task()->comp_level();
1110
}
1111
1112
// ------------------------------------------------------------------
1113
// ciEnv::compile_id
1114
uint ciEnv::compile_id() {
1115
if (task() == NULL) return 0;
1116
return task()->compile_id();
1117
}
1118
1119
// ------------------------------------------------------------------
1120
// ciEnv::notice_inlined_method()
1121
void ciEnv::notice_inlined_method(ciMethod* method) {
1122
_num_inlined_bytecodes += method->code_size_for_inlining();
1123
}
1124
1125
// ------------------------------------------------------------------
1126
// ciEnv::num_inlined_bytecodes()
1127
int ciEnv::num_inlined_bytecodes() const {
1128
return _num_inlined_bytecodes;
1129
}
1130
1131
// ------------------------------------------------------------------
1132
// ciEnv::record_failure()
1133
void ciEnv::record_failure(const char* reason) {
1134
if (_failure_reason == NULL) {
1135
// Record the first failure reason.
1136
_failure_reason = reason;
1137
}
1138
}
1139
1140
void ciEnv::report_failure(const char* reason) {
1141
EventCompilationFailure event;
1142
if (event.should_commit()) {
1143
CompilerEvent::CompilationFailureEvent::post(event, compile_id(), reason);
1144
}
1145
}
1146
1147
// ------------------------------------------------------------------
1148
// ciEnv::record_method_not_compilable()
1149
void ciEnv::record_method_not_compilable(const char* reason, bool all_tiers) {
1150
int new_compilable =
1151
all_tiers ? MethodCompilable_never : MethodCompilable_not_at_tier ;
1152
1153
// Only note transitions to a worse state
1154
if (new_compilable > _compilable) {
1155
if (log() != NULL) {
1156
if (all_tiers) {
1157
log()->elem("method_not_compilable");
1158
} else {
1159
log()->elem("method_not_compilable_at_tier level='%d'",
1160
current()->task()->comp_level());
1161
}
1162
}
1163
_compilable = new_compilable;
1164
1165
// Reset failure reason; this one is more important.
1166
_failure_reason = NULL;
1167
record_failure(reason);
1168
}
1169
}
1170
1171
// ------------------------------------------------------------------
1172
// ciEnv::record_out_of_memory_failure()
1173
void ciEnv::record_out_of_memory_failure() {
1174
// If memory is low, we stop compiling methods.
1175
record_method_not_compilable("out of memory");
1176
}
1177
1178
ciInstance* ciEnv::unloaded_ciinstance() {
1179
GUARDED_VM_ENTRY(return _factory->get_unloaded_object_constant();)
1180
}
1181
1182
// ------------------------------------------------------------------
1183
// ciEnv::dump_replay_data*
1184
1185
// Don't change thread state and acquire any locks.
1186
// Safe to call from VM error reporter.
1187
1188
void ciEnv::dump_compile_data(outputStream* out) {
1189
CompileTask* task = this->task();
1190
if (task) {
1191
Method* method = task->method();
1192
int entry_bci = task->osr_bci();
1193
int comp_level = task->comp_level();
1194
out->print("compile %s %s %s %d %d",
1195
method->klass_name()->as_quoted_ascii(),
1196
method->name()->as_quoted_ascii(),
1197
method->signature()->as_quoted_ascii(),
1198
entry_bci, comp_level);
1199
if (compiler_data() != NULL) {
1200
if (is_c2_compile(comp_level)) {
1201
#ifdef COMPILER2
1202
// Dump C2 inlining data.
1203
((Compile*)compiler_data())->dump_inline_data(out);
1204
#endif
1205
} else if (is_c1_compile(comp_level)) {
1206
#ifdef COMPILER1
1207
// Dump C1 inlining data.
1208
((Compilation*)compiler_data())->dump_inline_data(out);
1209
#endif
1210
}
1211
}
1212
out->cr();
1213
}
1214
}
1215
1216
void ciEnv::dump_replay_data_unsafe(outputStream* out) {
1217
ResourceMark rm;
1218
#if INCLUDE_JVMTI
1219
out->print_cr("JvmtiExport can_access_local_variables %d", _jvmti_can_access_local_variables);
1220
out->print_cr("JvmtiExport can_hotswap_or_post_breakpoint %d", _jvmti_can_hotswap_or_post_breakpoint);
1221
out->print_cr("JvmtiExport can_post_on_exceptions %d", _jvmti_can_post_on_exceptions);
1222
#endif // INCLUDE_JVMTI
1223
1224
GrowableArray<ciMetadata*>* objects = _factory->get_ci_metadata();
1225
out->print_cr("# %d ciObject found", objects->length());
1226
for (int i = 0; i < objects->length(); i++) {
1227
objects->at(i)->dump_replay_data(out);
1228
}
1229
dump_compile_data(out);
1230
out->flush();
1231
}
1232
1233
void ciEnv::dump_replay_data(outputStream* out) {
1234
GUARDED_VM_ENTRY(
1235
MutexLocker ml(Compile_lock);
1236
dump_replay_data_unsafe(out);
1237
)
1238
}
1239
1240
void ciEnv::dump_replay_data(int compile_id) {
1241
static char buffer[O_BUFLEN];
1242
int ret = jio_snprintf(buffer, O_BUFLEN, "replay_pid%p_compid%d.log", os::current_process_id(), compile_id);
1243
if (ret > 0) {
1244
int fd = os::open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1245
if (fd != -1) {
1246
FILE* replay_data_file = os::open(fd, "w");
1247
if (replay_data_file != NULL) {
1248
fileStream replay_data_stream(replay_data_file, /*need_close=*/true);
1249
dump_replay_data(&replay_data_stream);
1250
tty->print_cr("# Compiler replay data is saved as: %s", buffer);
1251
} else {
1252
tty->print_cr("# Can't open file to dump replay data.");
1253
}
1254
}
1255
}
1256
}
1257
1258
void ciEnv::dump_inline_data(int compile_id) {
1259
static char buffer[O_BUFLEN];
1260
int ret = jio_snprintf(buffer, O_BUFLEN, "inline_pid%p_compid%d.log", os::current_process_id(), compile_id);
1261
if (ret > 0) {
1262
int fd = os::open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1263
if (fd != -1) {
1264
FILE* inline_data_file = os::open(fd, "w");
1265
if (inline_data_file != NULL) {
1266
fileStream replay_data_stream(inline_data_file, /*need_close=*/true);
1267
GUARDED_VM_ENTRY(
1268
MutexLocker ml(Compile_lock);
1269
dump_compile_data(&replay_data_stream);
1270
)
1271
replay_data_stream.flush();
1272
tty->print("# Compiler inline data is saved as: ");
1273
tty->print_cr("%s", buffer);
1274
} else {
1275
tty->print_cr("# Can't open file to dump inline data.");
1276
}
1277
}
1278
}
1279
}
1280
1281