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