Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/ci/ciEnv.cpp
40930 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
// setup up the proper type to return on OOM
436
ciKlass* fail_type;
437
if (sym->char_at(0) == JVM_SIGNATURE_ARRAY) {
438
fail_type = _unloaded_ciobjarrayklass;
439
} else {
440
fail_type = _unloaded_ciinstance_klass;
441
}
442
Klass* found_klass;
443
{
444
ttyUnlocker ttyul; // release tty lock to avoid ordering problems
445
MutexLocker ml(current, Compile_lock);
446
Klass* kls;
447
if (!require_local) {
448
kls = SystemDictionary::find_constrained_instance_or_array_klass(current, sym, loader);
449
} else {
450
kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain);
451
}
452
found_klass = kls;
453
}
454
455
// If we fail to find an array klass, look again for its element type.
456
// The element type may be available either locally or via constraints.
457
// In either case, if we can find the element type in the system dictionary,
458
// we must build an array type around it. The CI requires array klasses
459
// to be loaded if their element klasses are loaded, except when memory
460
// is exhausted.
461
if (Signature::is_array(sym) &&
462
(sym->char_at(1) == JVM_SIGNATURE_ARRAY || sym->char_at(1) == JVM_SIGNATURE_CLASS)) {
463
// We have an unloaded array.
464
// Build it on the fly if the element class exists.
465
SignatureStream ss(sym, false);
466
ss.skip_array_prefix(1);
467
// Get element ciKlass recursively.
468
ciKlass* elem_klass =
469
get_klass_by_name_impl(accessing_klass,
470
cpool,
471
get_symbol(ss.as_symbol()),
472
require_local);
473
if (elem_klass != NULL && elem_klass->is_loaded()) {
474
// Now make an array for it
475
return ciObjArrayKlass::make_impl(elem_klass);
476
}
477
}
478
479
if (found_klass == NULL && !cpool.is_null() && cpool->has_preresolution()) {
480
// Look inside the constant pool for pre-resolved class entries.
481
for (int i = cpool->length() - 1; i >= 1; i--) {
482
if (cpool->tag_at(i).is_klass()) {
483
Klass* kls = cpool->resolved_klass_at(i);
484
if (kls->name() == sym) {
485
found_klass = kls;
486
break;
487
}
488
}
489
}
490
}
491
492
if (found_klass != NULL) {
493
// Found it. Build a CI handle.
494
return get_klass(found_klass);
495
}
496
497
if (require_local) return NULL;
498
499
// Not yet loaded into the VM, or not governed by loader constraints.
500
// Make a CI representative for it.
501
return get_unloaded_klass(accessing_klass, name);
502
}
503
504
// ------------------------------------------------------------------
505
// ciEnv::get_klass_by_name
506
ciKlass* ciEnv::get_klass_by_name(ciKlass* accessing_klass,
507
ciSymbol* klass_name,
508
bool require_local) {
509
GUARDED_VM_ENTRY(return get_klass_by_name_impl(accessing_klass,
510
constantPoolHandle(),
511
klass_name,
512
require_local);)
513
}
514
515
// ------------------------------------------------------------------
516
// ciEnv::get_klass_by_index_impl
517
//
518
// Implementation of get_klass_by_index.
519
ciKlass* ciEnv::get_klass_by_index_impl(const constantPoolHandle& cpool,
520
int index,
521
bool& is_accessible,
522
ciInstanceKlass* accessor) {
523
EXCEPTION_CONTEXT;
524
Klass* klass = NULL;
525
Symbol* klass_name = NULL;
526
527
if (cpool->tag_at(index).is_symbol()) {
528
klass_name = cpool->symbol_at(index);
529
} else {
530
// Check if it's resolved if it's not a symbol constant pool entry.
531
klass = ConstantPool::klass_at_if_loaded(cpool, index);
532
// Try to look it up by name.
533
if (klass == NULL) {
534
klass_name = cpool->klass_name_at(index);
535
}
536
}
537
538
if (klass == NULL) {
539
// Not found in constant pool. Use the name to do the lookup.
540
ciKlass* k = get_klass_by_name_impl(accessor,
541
cpool,
542
get_symbol(klass_name),
543
false);
544
// Calculate accessibility the hard way.
545
if (!k->is_loaded()) {
546
is_accessible = false;
547
} else if (k->loader() != accessor->loader() &&
548
get_klass_by_name_impl(accessor, cpool, k->name(), true) == NULL) {
549
// Loaded only remotely. Not linked yet.
550
is_accessible = false;
551
} else {
552
// Linked locally, and we must also check public/private, etc.
553
is_accessible = check_klass_accessibility(accessor, k->get_Klass());
554
}
555
return k;
556
}
557
558
// Check for prior unloaded klass. The SystemDictionary's answers
559
// can vary over time but the compiler needs consistency.
560
ciSymbol* name = get_symbol(klass->name());
561
ciKlass* unloaded_klass = check_get_unloaded_klass(accessor, name);
562
if (unloaded_klass != NULL) {
563
is_accessible = false;
564
return unloaded_klass;
565
}
566
567
// It is known to be accessible, since it was found in the constant pool.
568
is_accessible = true;
569
return get_klass(klass);
570
}
571
572
// ------------------------------------------------------------------
573
// ciEnv::get_klass_by_index
574
//
575
// Get a klass from the constant pool.
576
ciKlass* ciEnv::get_klass_by_index(const constantPoolHandle& cpool,
577
int index,
578
bool& is_accessible,
579
ciInstanceKlass* accessor) {
580
GUARDED_VM_ENTRY(return get_klass_by_index_impl(cpool, index, is_accessible, accessor);)
581
}
582
583
// ------------------------------------------------------------------
584
// ciEnv::get_constant_by_index_impl
585
//
586
// Implementation of get_constant_by_index().
587
ciConstant ciEnv::get_constant_by_index_impl(const constantPoolHandle& cpool,
588
int pool_index, int cache_index,
589
ciInstanceKlass* accessor) {
590
bool ignore_will_link;
591
EXCEPTION_CONTEXT;
592
int index = pool_index;
593
if (cache_index >= 0) {
594
assert(index < 0, "only one kind of index at a time");
595
index = cpool->object_to_cp_index(cache_index);
596
oop obj = cpool->resolved_references()->obj_at(cache_index);
597
if (obj != NULL) {
598
if (obj == Universe::the_null_sentinel()) {
599
return ciConstant(T_OBJECT, get_object(NULL));
600
}
601
BasicType bt = T_OBJECT;
602
if (cpool->tag_at(index).is_dynamic_constant())
603
bt = Signature::basic_type(cpool->uncached_signature_ref_at(index));
604
if (is_reference_type(bt)) {
605
} else {
606
// we have to unbox the primitive value
607
if (!is_java_primitive(bt)) return ciConstant();
608
jvalue value;
609
BasicType bt2 = java_lang_boxing_object::get_value(obj, &value);
610
assert(bt2 == bt, "");
611
switch (bt2) {
612
case T_DOUBLE: return ciConstant(value.d);
613
case T_FLOAT: return ciConstant(value.f);
614
case T_LONG: return ciConstant(value.j);
615
case T_INT: return ciConstant(bt2, value.i);
616
case T_SHORT: return ciConstant(bt2, value.s);
617
case T_BYTE: return ciConstant(bt2, value.b);
618
case T_CHAR: return ciConstant(bt2, value.c);
619
case T_BOOLEAN: return ciConstant(bt2, value.z);
620
default: return ciConstant();
621
}
622
}
623
ciObject* ciobj = get_object(obj);
624
if (ciobj->is_array()) {
625
return ciConstant(T_ARRAY, ciobj);
626
} else {
627
assert(ciobj->is_instance(), "should be an instance");
628
return ciConstant(T_OBJECT, ciobj);
629
}
630
}
631
}
632
constantTag tag = cpool->tag_at(index);
633
if (tag.is_int()) {
634
return ciConstant(T_INT, (jint)cpool->int_at(index));
635
} else if (tag.is_long()) {
636
return ciConstant((jlong)cpool->long_at(index));
637
} else if (tag.is_float()) {
638
return ciConstant((jfloat)cpool->float_at(index));
639
} else if (tag.is_double()) {
640
return ciConstant((jdouble)cpool->double_at(index));
641
} else if (tag.is_string()) {
642
oop string = NULL;
643
assert(cache_index >= 0, "should have a cache index");
644
string = cpool->string_at(index, cache_index, THREAD);
645
if (HAS_PENDING_EXCEPTION) {
646
CLEAR_PENDING_EXCEPTION;
647
record_out_of_memory_failure();
648
return ciConstant();
649
}
650
ciObject* constant = get_object(string);
651
if (constant->is_array()) {
652
return ciConstant(T_ARRAY, constant);
653
} else {
654
assert (constant->is_instance(), "must be an instance, or not? ");
655
return ciConstant(T_OBJECT, constant);
656
}
657
} else if (tag.is_unresolved_klass_in_error()) {
658
return ciConstant();
659
} else if (tag.is_klass() || tag.is_unresolved_klass()) {
660
// 4881222: allow ldc to take a class type
661
ciKlass* klass = get_klass_by_index_impl(cpool, index, ignore_will_link, accessor);
662
if (HAS_PENDING_EXCEPTION) {
663
CLEAR_PENDING_EXCEPTION;
664
record_out_of_memory_failure();
665
return ciConstant();
666
}
667
assert (klass->is_instance_klass() || klass->is_array_klass(),
668
"must be an instance or array klass ");
669
return ciConstant(T_OBJECT, klass->java_mirror());
670
} else if (tag.is_method_type()) {
671
// must execute Java code to link this CP entry into cache[i].f1
672
ciSymbol* signature = get_symbol(cpool->method_type_signature_at(index));
673
ciObject* ciobj = get_unloaded_method_type_constant(signature);
674
return ciConstant(T_OBJECT, ciobj);
675
} else if (tag.is_method_handle()) {
676
// must execute Java code to link this CP entry into cache[i].f1
677
int ref_kind = cpool->method_handle_ref_kind_at(index);
678
int callee_index = cpool->method_handle_klass_index_at(index);
679
ciKlass* callee = get_klass_by_index_impl(cpool, callee_index, ignore_will_link, accessor);
680
ciSymbol* name = get_symbol(cpool->method_handle_name_ref_at(index));
681
ciSymbol* signature = get_symbol(cpool->method_handle_signature_ref_at(index));
682
ciObject* ciobj = get_unloaded_method_handle_constant(callee, name, signature, ref_kind);
683
return ciConstant(T_OBJECT, ciobj);
684
} else if (tag.is_dynamic_constant()) {
685
return ciConstant();
686
} else {
687
ShouldNotReachHere();
688
return ciConstant();
689
}
690
}
691
692
// ------------------------------------------------------------------
693
// ciEnv::get_constant_by_index
694
//
695
// Pull a constant out of the constant pool. How appropriate.
696
//
697
// Implementation note: this query is currently in no way cached.
698
ciConstant ciEnv::get_constant_by_index(const constantPoolHandle& cpool,
699
int pool_index, int cache_index,
700
ciInstanceKlass* accessor) {
701
GUARDED_VM_ENTRY(return get_constant_by_index_impl(cpool, pool_index, cache_index, accessor);)
702
}
703
704
// ------------------------------------------------------------------
705
// ciEnv::get_field_by_index_impl
706
//
707
// Implementation of get_field_by_index.
708
//
709
// Implementation note: the results of field lookups are cached
710
// in the accessor klass.
711
ciField* ciEnv::get_field_by_index_impl(ciInstanceKlass* accessor,
712
int index) {
713
ciConstantPoolCache* cache = accessor->field_cache();
714
if (cache == NULL) {
715
ciField* field = new (arena()) ciField(accessor, index);
716
return field;
717
} else {
718
ciField* field = (ciField*)cache->get(index);
719
if (field == NULL) {
720
field = new (arena()) ciField(accessor, index);
721
cache->insert(index, field);
722
}
723
return field;
724
}
725
}
726
727
// ------------------------------------------------------------------
728
// ciEnv::get_field_by_index
729
//
730
// Get a field by index from a klass's constant pool.
731
ciField* ciEnv::get_field_by_index(ciInstanceKlass* accessor,
732
int index) {
733
GUARDED_VM_ENTRY(return get_field_by_index_impl(accessor, index);)
734
}
735
736
// ------------------------------------------------------------------
737
// ciEnv::lookup_method
738
//
739
// Perform an appropriate method lookup based on accessor, holder,
740
// name, signature, and bytecode.
741
Method* ciEnv::lookup_method(ciInstanceKlass* accessor,
742
ciKlass* holder,
743
Symbol* name,
744
Symbol* sig,
745
Bytecodes::Code bc,
746
constantTag tag) {
747
InstanceKlass* accessor_klass = accessor->get_instanceKlass();
748
Klass* holder_klass = holder->get_Klass();
749
750
// Accessibility checks are performed in ciEnv::get_method_by_index_impl.
751
assert(check_klass_accessibility(accessor, holder_klass), "holder not accessible");
752
753
LinkInfo link_info(holder_klass, name, sig, accessor_klass,
754
LinkInfo::AccessCheck::required,
755
LinkInfo::LoaderConstraintCheck::required,
756
tag);
757
switch (bc) {
758
case Bytecodes::_invokestatic:
759
return LinkResolver::resolve_static_call_or_null(link_info);
760
case Bytecodes::_invokespecial:
761
return LinkResolver::resolve_special_call_or_null(link_info);
762
case Bytecodes::_invokeinterface:
763
return LinkResolver::linktime_resolve_interface_method_or_null(link_info);
764
case Bytecodes::_invokevirtual:
765
return LinkResolver::linktime_resolve_virtual_method_or_null(link_info);
766
default:
767
fatal("Unhandled bytecode: %s", Bytecodes::name(bc));
768
return NULL; // silence compiler warnings
769
}
770
}
771
772
773
// ------------------------------------------------------------------
774
// ciEnv::get_method_by_index_impl
775
ciMethod* ciEnv::get_method_by_index_impl(const constantPoolHandle& cpool,
776
int index, Bytecodes::Code bc,
777
ciInstanceKlass* accessor) {
778
assert(cpool.not_null(), "need constant pool");
779
assert(accessor != NULL, "need origin of access");
780
if (bc == Bytecodes::_invokedynamic) {
781
ConstantPoolCacheEntry* cpce = cpool->invokedynamic_cp_cache_entry_at(index);
782
bool is_resolved = !cpce->is_f1_null();
783
// FIXME: code generation could allow for null (unlinked) call site
784
// The call site could be made patchable as follows:
785
// Load the appendix argument from the constant pool.
786
// Test the appendix argument and jump to a known deopt routine if it is null.
787
// Jump through a patchable call site, which is initially a deopt routine.
788
// Patch the call site to the nmethod entry point of the static compiled lambda form.
789
// As with other two-component call sites, both values must be independently verified.
790
791
if (is_resolved) {
792
// Get the invoker Method* from the constant pool.
793
// (The appendix argument, if any, will be noted in the method's signature.)
794
Method* adapter = cpce->f1_as_method();
795
return get_method(adapter);
796
}
797
798
// Fake a method that is equivalent to a declared method.
799
ciInstanceKlass* holder = get_instance_klass(vmClasses::MethodHandle_klass());
800
ciSymbol* name = ciSymbols::invokeBasic_name();
801
ciSymbol* signature = get_symbol(cpool->signature_ref_at(index));
802
return get_unloaded_method(holder, name, signature, accessor);
803
} else {
804
const int holder_index = cpool->klass_ref_index_at(index);
805
bool holder_is_accessible;
806
ciKlass* holder = get_klass_by_index_impl(cpool, holder_index, holder_is_accessible, accessor);
807
808
// Get the method's name and signature.
809
Symbol* name_sym = cpool->name_ref_at(index);
810
Symbol* sig_sym = cpool->signature_ref_at(index);
811
812
if (cpool->has_preresolution()
813
|| ((holder == ciEnv::MethodHandle_klass() || holder == ciEnv::VarHandle_klass()) &&
814
MethodHandles::is_signature_polymorphic_name(holder->get_Klass(), name_sym))) {
815
// Short-circuit lookups for JSR 292-related call sites.
816
// That is, do not rely only on name-based lookups, because they may fail
817
// if the names are not resolvable in the boot class loader (7056328).
818
switch (bc) {
819
case Bytecodes::_invokevirtual:
820
case Bytecodes::_invokeinterface:
821
case Bytecodes::_invokespecial:
822
case Bytecodes::_invokestatic:
823
{
824
Method* m = ConstantPool::method_at_if_loaded(cpool, index);
825
if (m != NULL) {
826
return get_method(m);
827
}
828
}
829
break;
830
default:
831
break;
832
}
833
}
834
835
if (holder_is_accessible) { // Our declared holder is loaded.
836
constantTag tag = cpool->tag_ref_at(index);
837
assert(accessor->get_instanceKlass() == cpool->pool_holder(), "not the pool holder?");
838
Method* m = lookup_method(accessor, holder, name_sym, sig_sym, bc, tag);
839
if (m != NULL &&
840
(bc == Bytecodes::_invokestatic
841
? m->method_holder()->is_not_initialized()
842
: !m->method_holder()->is_loaded())) {
843
m = NULL;
844
}
845
#ifdef ASSERT
846
if (m != NULL && ReplayCompiles && !ciReplay::is_loaded(m)) {
847
m = NULL;
848
}
849
#endif
850
if (m != NULL) {
851
// We found the method.
852
return get_method(m);
853
}
854
}
855
856
// Either the declared holder was not loaded, or the method could
857
// not be found. Create a dummy ciMethod to represent the failed
858
// lookup.
859
ciSymbol* name = get_symbol(name_sym);
860
ciSymbol* signature = get_symbol(sig_sym);
861
return get_unloaded_method(holder, name, signature, accessor);
862
}
863
}
864
865
866
// ------------------------------------------------------------------
867
// ciEnv::get_instance_klass_for_declared_method_holder
868
ciInstanceKlass* ciEnv::get_instance_klass_for_declared_method_holder(ciKlass* method_holder) {
869
// For the case of <array>.clone(), the method holder can be a ciArrayKlass
870
// instead of a ciInstanceKlass. For that case simply pretend that the
871
// declared holder is Object.clone since that's where the call will bottom out.
872
// A more correct fix would trickle out through many interfaces in CI,
873
// requiring ciInstanceKlass* to become ciKlass* and many more places would
874
// require checks to make sure the expected type was found. Given that this
875
// only occurs for clone() the more extensive fix seems like overkill so
876
// instead we simply smear the array type into Object.
877
guarantee(method_holder != NULL, "no method holder");
878
if (method_holder->is_instance_klass()) {
879
return method_holder->as_instance_klass();
880
} else if (method_holder->is_array_klass()) {
881
return current()->Object_klass();
882
} else {
883
ShouldNotReachHere();
884
}
885
return NULL;
886
}
887
888
889
// ------------------------------------------------------------------
890
// ciEnv::get_method_by_index
891
ciMethod* ciEnv::get_method_by_index(const constantPoolHandle& cpool,
892
int index, Bytecodes::Code bc,
893
ciInstanceKlass* accessor) {
894
GUARDED_VM_ENTRY(return get_method_by_index_impl(cpool, index, bc, accessor);)
895
}
896
897
898
// ------------------------------------------------------------------
899
// ciEnv::name_buffer
900
char *ciEnv::name_buffer(int req_len) {
901
if (_name_buffer_len < req_len) {
902
if (_name_buffer == NULL) {
903
_name_buffer = (char*)arena()->Amalloc(sizeof(char)*req_len);
904
_name_buffer_len = req_len;
905
} else {
906
_name_buffer =
907
(char*)arena()->Arealloc(_name_buffer, _name_buffer_len, req_len);
908
_name_buffer_len = req_len;
909
}
910
}
911
return _name_buffer;
912
}
913
914
// ------------------------------------------------------------------
915
// ciEnv::is_in_vm
916
bool ciEnv::is_in_vm() {
917
return JavaThread::current()->thread_state() == _thread_in_vm;
918
}
919
920
// ------------------------------------------------------------------
921
// ciEnv::validate_compile_task_dependencies
922
//
923
// Check for changes during compilation (e.g. class loads, evolution,
924
// breakpoints, call site invalidation).
925
void ciEnv::validate_compile_task_dependencies(ciMethod* target) {
926
if (failing()) return; // no need for further checks
927
928
Dependencies::DepType result = dependencies()->validate_dependencies(_task);
929
if (result != Dependencies::end_marker) {
930
if (result == Dependencies::call_site_target_value) {
931
_inc_decompile_count_on_failure = false;
932
record_failure("call site target change");
933
} else if (Dependencies::is_klass_type(result)) {
934
record_failure("concurrent class loading");
935
} else {
936
record_failure("invalid non-klass dependency");
937
}
938
}
939
}
940
941
// ------------------------------------------------------------------
942
// ciEnv::register_method
943
void ciEnv::register_method(ciMethod* target,
944
int entry_bci,
945
CodeOffsets* offsets,
946
int orig_pc_offset,
947
CodeBuffer* code_buffer,
948
int frame_words,
949
OopMapSet* oop_map_set,
950
ExceptionHandlerTable* handler_table,
951
ImplicitExceptionTable* inc_table,
952
AbstractCompiler* compiler,
953
bool has_unsafe_access,
954
bool has_wide_vectors,
955
RTMState rtm_state,
956
const GrowableArrayView<RuntimeStub*>& native_invokers) {
957
VM_ENTRY_MARK;
958
nmethod* nm = NULL;
959
{
960
methodHandle method(THREAD, target->get_Method());
961
962
// We require method counters to store some method state (max compilation levels) required by the compilation policy.
963
if (method->get_method_counters(THREAD) == NULL) {
964
record_failure("can't create method counters");
965
// All buffers in the CodeBuffer are allocated in the CodeCache.
966
// If the code buffer is created on each compile attempt
967
// as in C2, then it must be freed.
968
code_buffer->free_blob();
969
return;
970
}
971
972
// To prevent compile queue updates.
973
MutexLocker locker(THREAD, MethodCompileQueue_lock);
974
975
// Prevent SystemDictionary::add_to_hierarchy from running
976
// and invalidating our dependencies until we install this method.
977
// No safepoints are allowed. Otherwise, class redefinition can occur in between.
978
MutexLocker ml(Compile_lock);
979
NoSafepointVerifier nsv;
980
981
// Change in Jvmti state may invalidate compilation.
982
if (!failing() && jvmti_state_changed()) {
983
record_failure("Jvmti state change invalidated dependencies");
984
}
985
986
// Change in DTrace flags may invalidate compilation.
987
if (!failing() &&
988
( (!dtrace_extended_probes() && ExtendedDTraceProbes) ||
989
(!dtrace_method_probes() && DTraceMethodProbes) ||
990
(!dtrace_alloc_probes() && DTraceAllocProbes) )) {
991
record_failure("DTrace flags change invalidated dependencies");
992
}
993
994
if (!failing() && target->needs_clinit_barrier() &&
995
target->holder()->is_in_error_state()) {
996
record_failure("method holder is in error state");
997
}
998
999
if (!failing()) {
1000
if (log() != NULL) {
1001
// Log the dependencies which this compilation declares.
1002
dependencies()->log_all_dependencies();
1003
}
1004
1005
// Encode the dependencies now, so we can check them right away.
1006
dependencies()->encode_content_bytes();
1007
1008
// Check for {class loads, evolution, breakpoints, ...} during compilation
1009
validate_compile_task_dependencies(target);
1010
}
1011
#if INCLUDE_RTM_OPT
1012
if (!failing() && (rtm_state != NoRTM) &&
1013
(method()->method_data() != NULL) &&
1014
(method()->method_data()->rtm_state() != rtm_state)) {
1015
// Preemptive decompile if rtm state was changed.
1016
record_failure("RTM state change invalidated rtm code");
1017
}
1018
#endif
1019
1020
if (failing()) {
1021
// While not a true deoptimization, it is a preemptive decompile.
1022
MethodData* mdo = method()->method_data();
1023
if (mdo != NULL && _inc_decompile_count_on_failure) {
1024
mdo->inc_decompile_count();
1025
}
1026
1027
// All buffers in the CodeBuffer are allocated in the CodeCache.
1028
// If the code buffer is created on each compile attempt
1029
// as in C2, then it must be freed.
1030
code_buffer->free_blob();
1031
return;
1032
}
1033
1034
assert(offsets->value(CodeOffsets::Deopt) != -1, "must have deopt entry");
1035
assert(offsets->value(CodeOffsets::Exceptions) != -1, "must have exception entry");
1036
1037
nm = nmethod::new_nmethod(method,
1038
compile_id(),
1039
entry_bci,
1040
offsets,
1041
orig_pc_offset,
1042
debug_info(), dependencies(), code_buffer,
1043
frame_words, oop_map_set,
1044
handler_table, inc_table,
1045
compiler, task()->comp_level(),
1046
native_invokers);
1047
1048
// Free codeBlobs
1049
code_buffer->free_blob();
1050
1051
if (nm != NULL) {
1052
nm->set_has_unsafe_access(has_unsafe_access);
1053
nm->set_has_wide_vectors(has_wide_vectors);
1054
#if INCLUDE_RTM_OPT
1055
nm->set_rtm_state(rtm_state);
1056
#endif
1057
1058
// Record successful registration.
1059
// (Put nm into the task handle *before* publishing to the Java heap.)
1060
if (task() != NULL) {
1061
task()->set_code(nm);
1062
}
1063
1064
if (entry_bci == InvocationEntryBci) {
1065
if (TieredCompilation) {
1066
// If there is an old version we're done with it
1067
CompiledMethod* old = method->code();
1068
if (TraceMethodReplacement && old != NULL) {
1069
ResourceMark rm;
1070
char *method_name = method->name_and_sig_as_C_string();
1071
tty->print_cr("Replacing method %s", method_name);
1072
}
1073
if (old != NULL) {
1074
old->make_not_used();
1075
}
1076
}
1077
1078
LogTarget(Info, nmethod, install) lt;
1079
if (lt.is_enabled()) {
1080
ResourceMark rm;
1081
char *method_name = method->name_and_sig_as_C_string();
1082
lt.print("Installing method (%d) %s ",
1083
task()->comp_level(), method_name);
1084
}
1085
// Allow the code to be executed
1086
MutexLocker ml(CompiledMethod_lock, Mutex::_no_safepoint_check_flag);
1087
if (nm->make_in_use()) {
1088
method->set_code(method, nm);
1089
}
1090
} else {
1091
LogTarget(Info, nmethod, install) lt;
1092
if (lt.is_enabled()) {
1093
ResourceMark rm;
1094
char *method_name = method->name_and_sig_as_C_string();
1095
lt.print("Installing osr method (%d) %s @ %d",
1096
task()->comp_level(), method_name, entry_bci);
1097
}
1098
MutexLocker ml(CompiledMethod_lock, Mutex::_no_safepoint_check_flag);
1099
if (nm->make_in_use()) {
1100
method->method_holder()->add_osr_nmethod(nm);
1101
}
1102
}
1103
}
1104
} // safepoints are allowed again
1105
1106
if (nm != NULL) {
1107
// JVMTI -- compiled method notification (must be done outside lock)
1108
nm->post_compiled_method_load_event();
1109
} else {
1110
// The CodeCache is full.
1111
record_failure("code cache is full");
1112
}
1113
}
1114
1115
// ------------------------------------------------------------------
1116
// ciEnv::comp_level
1117
int ciEnv::comp_level() {
1118
if (task() == NULL) return CompilationPolicy::highest_compile_level();
1119
return task()->comp_level();
1120
}
1121
1122
// ------------------------------------------------------------------
1123
// ciEnv::compile_id
1124
uint ciEnv::compile_id() {
1125
if (task() == NULL) return 0;
1126
return task()->compile_id();
1127
}
1128
1129
// ------------------------------------------------------------------
1130
// ciEnv::notice_inlined_method()
1131
void ciEnv::notice_inlined_method(ciMethod* method) {
1132
_num_inlined_bytecodes += method->code_size_for_inlining();
1133
}
1134
1135
// ------------------------------------------------------------------
1136
// ciEnv::num_inlined_bytecodes()
1137
int ciEnv::num_inlined_bytecodes() const {
1138
return _num_inlined_bytecodes;
1139
}
1140
1141
// ------------------------------------------------------------------
1142
// ciEnv::record_failure()
1143
void ciEnv::record_failure(const char* reason) {
1144
if (_failure_reason == NULL) {
1145
// Record the first failure reason.
1146
_failure_reason = reason;
1147
}
1148
}
1149
1150
void ciEnv::report_failure(const char* reason) {
1151
EventCompilationFailure event;
1152
if (event.should_commit()) {
1153
CompilerEvent::CompilationFailureEvent::post(event, compile_id(), reason);
1154
}
1155
}
1156
1157
// ------------------------------------------------------------------
1158
// ciEnv::record_method_not_compilable()
1159
void ciEnv::record_method_not_compilable(const char* reason, bool all_tiers) {
1160
int new_compilable =
1161
all_tiers ? MethodCompilable_never : MethodCompilable_not_at_tier ;
1162
1163
// Only note transitions to a worse state
1164
if (new_compilable > _compilable) {
1165
if (log() != NULL) {
1166
if (all_tiers) {
1167
log()->elem("method_not_compilable");
1168
} else {
1169
log()->elem("method_not_compilable_at_tier level='%d'",
1170
current()->task()->comp_level());
1171
}
1172
}
1173
_compilable = new_compilable;
1174
1175
// Reset failure reason; this one is more important.
1176
_failure_reason = NULL;
1177
record_failure(reason);
1178
}
1179
}
1180
1181
// ------------------------------------------------------------------
1182
// ciEnv::record_out_of_memory_failure()
1183
void ciEnv::record_out_of_memory_failure() {
1184
// If memory is low, we stop compiling methods.
1185
record_method_not_compilable("out of memory");
1186
}
1187
1188
ciInstance* ciEnv::unloaded_ciinstance() {
1189
GUARDED_VM_ENTRY(return _factory->get_unloaded_object_constant();)
1190
}
1191
1192
// ------------------------------------------------------------------
1193
// ciEnv::dump_replay_data*
1194
1195
// Don't change thread state and acquire any locks.
1196
// Safe to call from VM error reporter.
1197
1198
void ciEnv::dump_compile_data(outputStream* out) {
1199
CompileTask* task = this->task();
1200
if (task) {
1201
Method* method = task->method();
1202
int entry_bci = task->osr_bci();
1203
int comp_level = task->comp_level();
1204
out->print("compile %s %s %s %d %d",
1205
method->klass_name()->as_quoted_ascii(),
1206
method->name()->as_quoted_ascii(),
1207
method->signature()->as_quoted_ascii(),
1208
entry_bci, comp_level);
1209
if (compiler_data() != NULL) {
1210
if (is_c2_compile(comp_level)) {
1211
#ifdef COMPILER2
1212
// Dump C2 inlining data.
1213
((Compile*)compiler_data())->dump_inline_data(out);
1214
#endif
1215
} else if (is_c1_compile(comp_level)) {
1216
#ifdef COMPILER1
1217
// Dump C1 inlining data.
1218
((Compilation*)compiler_data())->dump_inline_data(out);
1219
#endif
1220
}
1221
}
1222
out->cr();
1223
}
1224
}
1225
1226
void ciEnv::dump_replay_data_unsafe(outputStream* out) {
1227
ResourceMark rm;
1228
#if INCLUDE_JVMTI
1229
out->print_cr("JvmtiExport can_access_local_variables %d", _jvmti_can_access_local_variables);
1230
out->print_cr("JvmtiExport can_hotswap_or_post_breakpoint %d", _jvmti_can_hotswap_or_post_breakpoint);
1231
out->print_cr("JvmtiExport can_post_on_exceptions %d", _jvmti_can_post_on_exceptions);
1232
#endif // INCLUDE_JVMTI
1233
1234
GrowableArray<ciMetadata*>* objects = _factory->get_ci_metadata();
1235
out->print_cr("# %d ciObject found", objects->length());
1236
for (int i = 0; i < objects->length(); i++) {
1237
objects->at(i)->dump_replay_data(out);
1238
}
1239
dump_compile_data(out);
1240
out->flush();
1241
}
1242
1243
void ciEnv::dump_replay_data(outputStream* out) {
1244
GUARDED_VM_ENTRY(
1245
MutexLocker ml(Compile_lock);
1246
dump_replay_data_unsafe(out);
1247
)
1248
}
1249
1250
void ciEnv::dump_replay_data(int compile_id) {
1251
static char buffer[O_BUFLEN];
1252
int ret = jio_snprintf(buffer, O_BUFLEN, "replay_pid%p_compid%d.log", os::current_process_id(), compile_id);
1253
if (ret > 0) {
1254
int fd = os::open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1255
if (fd != -1) {
1256
FILE* replay_data_file = os::open(fd, "w");
1257
if (replay_data_file != NULL) {
1258
fileStream replay_data_stream(replay_data_file, /*need_close=*/true);
1259
dump_replay_data(&replay_data_stream);
1260
tty->print_cr("# Compiler replay data is saved as: %s", buffer);
1261
} else {
1262
tty->print_cr("# Can't open file to dump replay data.");
1263
}
1264
}
1265
}
1266
}
1267
1268
void ciEnv::dump_inline_data(int compile_id) {
1269
static char buffer[O_BUFLEN];
1270
int ret = jio_snprintf(buffer, O_BUFLEN, "inline_pid%p_compid%d.log", os::current_process_id(), compile_id);
1271
if (ret > 0) {
1272
int fd = os::open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1273
if (fd != -1) {
1274
FILE* inline_data_file = os::open(fd, "w");
1275
if (inline_data_file != NULL) {
1276
fileStream replay_data_stream(inline_data_file, /*need_close=*/true);
1277
GUARDED_VM_ENTRY(
1278
MutexLocker ml(Compile_lock);
1279
dump_compile_data(&replay_data_stream);
1280
)
1281
replay_data_stream.flush();
1282
tty->print("# Compiler inline data is saved as: ");
1283
tty->print_cr("%s", buffer);
1284
} else {
1285
tty->print_cr("# Can't open file to dump inline data.");
1286
}
1287
}
1288
}
1289
}
1290
1291