Skip to content

Commit d8ebe38

Browse files
author
Ashutosh Mehra
committed
8370377: Avoid resolving constant pool entries during preimage generation in the training run
Reviewed-by: adinn, iklam
1 parent a925461 commit d8ebe38

File tree

4 files changed

+102
-61
lines changed

4 files changed

+102
-61
lines changed

src/hotspot/share/cds/aotConstantPoolResolver.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,38 @@ void AOTConstantPoolResolver::preresolve_field_and_method_cp_entries(JavaThread*
225225
Bytecodes::Code raw_bc = bcs.raw_code();
226226
switch (raw_bc) {
227227
case Bytecodes::_getfield:
228+
// no-fast bytecode
229+
case Bytecodes::_nofast_getfield:
230+
// fast bytecodes
231+
case Bytecodes::_fast_agetfield:
232+
case Bytecodes::_fast_bgetfield:
233+
case Bytecodes::_fast_cgetfield:
234+
case Bytecodes::_fast_dgetfield:
235+
case Bytecodes::_fast_fgetfield:
236+
case Bytecodes::_fast_igetfield:
237+
case Bytecodes::_fast_lgetfield:
238+
case Bytecodes::_fast_sgetfield:
239+
raw_bc = Bytecodes::_getfield;
240+
maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD);
241+
if (HAS_PENDING_EXCEPTION) {
242+
CLEAR_PENDING_EXCEPTION; // just ignore
243+
}
244+
break;
245+
228246
case Bytecodes::_putfield:
247+
// no-fast bytecode
248+
case Bytecodes::_nofast_putfield:
249+
// fast bytecodes
250+
case Bytecodes::_fast_aputfield:
251+
case Bytecodes::_fast_bputfield:
252+
case Bytecodes::_fast_zputfield:
253+
case Bytecodes::_fast_cputfield:
254+
case Bytecodes::_fast_dputfield:
255+
case Bytecodes::_fast_fputfield:
256+
case Bytecodes::_fast_iputfield:
257+
case Bytecodes::_fast_lputfield:
258+
case Bytecodes::_fast_sputfield:
259+
raw_bc = Bytecodes::_putfield;
229260
maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD);
230261
if (HAS_PENDING_EXCEPTION) {
231262
CLEAR_PENDING_EXCEPTION; // just ignore

src/hotspot/share/cds/finalImageRecipes.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ void FinalImageRecipes::record_recipes_for_constantpool() {
127127
}
128128

129129
if (cp_indices.length() > 0) {
130+
LogStreamHandle(Trace, aot, resolve) log;
131+
if (log.is_enabled()) {
132+
log.print("ConstantPool entries for %s to be pre-resolved:", k->external_name());
133+
for (int i = 0; i < cp_indices.length(); i++) {
134+
log.print(" %d", cp_indices.at(i));
135+
}
136+
log.print("\n");
137+
}
130138
tmp_cp_recipes.append(ArchiveUtils::archive_array(&cp_indices));
131139
} else {
132140
tmp_cp_recipes.append(nullptr);

src/hotspot/share/oops/constantPool.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -538,18 +538,23 @@ void ConstantPool::remove_resolved_klass_if_non_deterministic(int cp_index) {
538538
assert(ArchiveBuilder::current()->is_in_buffer_space(this), "must be");
539539
assert(tag_at(cp_index).is_klass(), "must be resolved");
540540

541-
Klass* k = resolved_klass_at(cp_index);
542541
bool can_archive;
542+
Klass* k = nullptr;
543543

544-
if (k == nullptr) {
545-
// We'd come here if the referenced class has been excluded via
546-
// SystemDictionaryShared::is_excluded_class(). As a result, ArchiveBuilder
547-
// has cleared the resolved_klasses()->at(...) pointer to null. Thus, we
548-
// need to revert the tag to JVM_CONSTANT_UnresolvedClass.
544+
if (CDSConfig::is_dumping_preimage_static_archive()) {
549545
can_archive = false;
550546
} else {
551-
ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this);
552-
can_archive = AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index);
547+
k = resolved_klass_at(cp_index);
548+
if (k == nullptr) {
549+
// We'd come here if the referenced class has been excluded via
550+
// SystemDictionaryShared::is_excluded_class(). As a result, ArchiveBuilder
551+
// has cleared the resolved_klasses()->at(...) pointer to null. Thus, we
552+
// need to revert the tag to JVM_CONSTANT_UnresolvedClass.
553+
can_archive = false;
554+
} else {
555+
ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this);
556+
can_archive = AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index);
557+
}
553558
}
554559

555560
if (!can_archive) {

src/hotspot/share/oops/cpCache.cpp

Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -430,26 +430,25 @@ void ConstantPoolCache::remove_resolved_field_entries_if_non_deterministic() {
430430
bool archived = false;
431431
bool resolved = rfi->is_resolved(Bytecodes::_getfield) ||
432432
rfi->is_resolved(Bytecodes::_putfield);
433-
if (resolved && AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) {
433+
if (resolved && !CDSConfig::is_dumping_preimage_static_archive()
434+
&& AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) {
434435
rfi->mark_and_relocate();
435436
archived = true;
436437
} else {
437438
rfi->remove_unshareable_info();
438439
}
439-
if (resolved) {
440-
LogStreamHandle(Trace, aot, resolve) log;
441-
if (log.is_enabled()) {
442-
ResourceMark rm;
443-
int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
444-
Symbol* klass_name = cp->klass_name_at(klass_cp_index);
445-
Symbol* name = cp->uncached_name_ref_at(cp_index);
446-
Symbol* signature = cp->uncached_signature_ref_at(cp_index);
447-
log.print("%s field CP entry [%3d]: %s => %s.%s:%s",
448-
(archived ? "archived" : "reverted"),
449-
cp_index,
450-
cp->pool_holder()->name()->as_C_string(),
451-
klass_name->as_C_string(), name->as_C_string(), signature->as_C_string());
452-
}
440+
LogStreamHandle(Trace, aot, resolve) log;
441+
if (log.is_enabled()) {
442+
ResourceMark rm;
443+
int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
444+
Symbol* klass_name = cp->klass_name_at(klass_cp_index);
445+
Symbol* name = cp->uncached_name_ref_at(cp_index);
446+
Symbol* signature = cp->uncached_signature_ref_at(cp_index);
447+
log.print("%s field CP entry [%3d]: %s => %s.%s:%s",
448+
(archived ? "archived" : "reverted"),
449+
cp_index,
450+
cp->pool_holder()->name()->as_C_string(),
451+
klass_name->as_C_string(), name->as_C_string(), signature->as_C_string());
453452
}
454453
ArchiveBuilder::alloc_stats()->record_field_cp_entry(archived, resolved && !archived);
455454
}
@@ -470,32 +469,31 @@ void ConstantPoolCache::remove_resolved_method_entries_if_non_deterministic() {
470469
// Just for safety -- this should not happen, but do not archive if we ever see this.
471470
resolved &= !(rme->is_resolved(Bytecodes::_invokestatic));
472471

473-
if (resolved && can_archive_resolved_method(src_cp, rme)) {
472+
if (resolved && !CDSConfig::is_dumping_preimage_static_archive()
473+
&& can_archive_resolved_method(src_cp, rme)) {
474474
rme->mark_and_relocate(src_cp);
475475
archived = true;
476476
} else {
477477
rme->remove_unshareable_info();
478478
}
479-
if (resolved) {
480-
LogStreamHandle(Trace, aot, resolve) log;
481-
if (log.is_enabled()) {
482-
ResourceMark rm;
483-
int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
484-
Symbol* klass_name = cp->klass_name_at(klass_cp_index);
485-
Symbol* name = cp->uncached_name_ref_at(cp_index);
486-
Symbol* signature = cp->uncached_signature_ref_at(cp_index);
487-
log.print("%s%s method CP entry [%3d]: %s %s.%s:%s",
488-
(archived ? "archived" : "reverted"),
489-
(rme->is_resolved(Bytecodes::_invokeinterface) ? " interface" : ""),
490-
cp_index,
491-
cp->pool_holder()->name()->as_C_string(),
492-
klass_name->as_C_string(), name->as_C_string(), signature->as_C_string());
493-
if (archived) {
494-
Klass* resolved_klass = cp->resolved_klass_at(klass_cp_index);
495-
log.print(" => %s%s",
496-
resolved_klass->name()->as_C_string(),
497-
(rme->is_resolved(Bytecodes::_invokestatic) ? " *** static" : ""));
498-
}
479+
LogStreamHandle(Trace, aot, resolve) log;
480+
if (log.is_enabled()) {
481+
ResourceMark rm;
482+
int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
483+
Symbol* klass_name = cp->klass_name_at(klass_cp_index);
484+
Symbol* name = cp->uncached_name_ref_at(cp_index);
485+
Symbol* signature = cp->uncached_signature_ref_at(cp_index);
486+
log.print("%s%s method CP entry [%3d]: %s %s.%s:%s",
487+
(archived ? "archived" : "reverted"),
488+
(rme->is_resolved(Bytecodes::_invokeinterface) ? " interface" : ""),
489+
cp_index,
490+
cp->pool_holder()->name()->as_C_string(),
491+
klass_name->as_C_string(), name->as_C_string(), signature->as_C_string());
492+
if (archived) {
493+
Klass* resolved_klass = cp->resolved_klass_at(klass_cp_index);
494+
log.print(" => %s%s",
495+
resolved_klass->name()->as_C_string(),
496+
(rme->is_resolved(Bytecodes::_invokestatic) ? " *** static" : ""));
499497
}
500498
ArchiveBuilder::alloc_stats()->record_method_cp_entry(archived, resolved && !archived);
501499
}
@@ -510,29 +508,28 @@ void ConstantPoolCache::remove_resolved_indy_entries_if_non_deterministic() {
510508
int cp_index = rei->constant_pool_index();
511509
bool archived = false;
512510
bool resolved = rei->is_resolved();
513-
if (resolved && AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) {
511+
if (resolved && !CDSConfig::is_dumping_preimage_static_archive()
512+
&& AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) {
514513
rei->mark_and_relocate();
515514
archived = true;
516515
} else {
517516
rei->remove_unshareable_info();
518517
}
519-
if (resolved) {
520-
LogStreamHandle(Trace, aot, resolve) log;
521-
if (log.is_enabled()) {
522-
ResourceMark rm;
523-
int bsm = cp->bootstrap_method_ref_index_at(cp_index);
524-
int bsm_ref = cp->method_handle_index_at(bsm);
525-
Symbol* bsm_name = cp->uncached_name_ref_at(bsm_ref);
526-
Symbol* bsm_signature = cp->uncached_signature_ref_at(bsm_ref);
527-
Symbol* bsm_klass = cp->klass_name_at(cp->uncached_klass_ref_index_at(bsm_ref));
528-
log.print("%s indy CP entry [%3d]: %s (%d)",
529-
(archived ? "archived" : "reverted"),
530-
cp_index, cp->pool_holder()->name()->as_C_string(), i);
531-
log.print(" %s %s.%s:%s", (archived ? "=>" : " "), bsm_klass->as_C_string(),
532-
bsm_name->as_C_string(), bsm_signature->as_C_string());
533-
}
534-
ArchiveBuilder::alloc_stats()->record_indy_cp_entry(archived, resolved && !archived);
518+
LogStreamHandle(Trace, aot, resolve) log;
519+
if (log.is_enabled()) {
520+
ResourceMark rm;
521+
int bsm = cp->bootstrap_method_ref_index_at(cp_index);
522+
int bsm_ref = cp->method_handle_index_at(bsm);
523+
Symbol* bsm_name = cp->uncached_name_ref_at(bsm_ref);
524+
Symbol* bsm_signature = cp->uncached_signature_ref_at(bsm_ref);
525+
Symbol* bsm_klass = cp->klass_name_at(cp->uncached_klass_ref_index_at(bsm_ref));
526+
log.print("%s indy CP entry [%3d]: %s (%d)",
527+
(archived ? "archived" : "reverted"),
528+
cp_index, cp->pool_holder()->name()->as_C_string(), i);
529+
log.print(" %s %s.%s:%s", (archived ? "=>" : " "), bsm_klass->as_C_string(),
530+
bsm_name->as_C_string(), bsm_signature->as_C_string());
535531
}
532+
ArchiveBuilder::alloc_stats()->record_indy_cp_entry(archived, resolved && !archived);
536533
}
537534
}
538535

0 commit comments

Comments
 (0)