@@ -325,7 +325,7 @@ objArrayOop ConstantPool::prepare_resolved_references_for_archiving() {
325
325
for (int i = 0 ; i < method_entries->length (); i++) {
326
326
ResolvedMethodEntry* rme = method_entries->adr_at (i);
327
327
if (rme->is_resolved (Bytecodes::_invokehandle) && rme->has_appendix () &&
328
- can_archive_resolved_method (rme)) {
328
+ cache ()-> can_archive_resolved_method (rme)) {
329
329
int rr_index = rme->resolved_references_index ();
330
330
keep_resolved_refs.at_put (rr_index, true );
331
331
}
@@ -497,7 +497,7 @@ void ConstantPool::remove_unshareable_entries() {
497
497
break ;
498
498
case JVM_CONSTANT_UnresolvedClassInError:
499
499
tag_at_put (cp_index, JVM_CONSTANT_UnresolvedClass);
500
- ArchiveBuilder::alloc_stats ()->record_klass_cp_entry (false , false );
500
+ ArchiveBuilder::alloc_stats ()->record_klass_cp_entry (false , true );
501
501
break ;
502
502
case JVM_CONSTANT_MethodHandleInError:
503
503
tag_at_put (cp_index, JVM_CONSTANT_MethodHandle);
@@ -518,9 +518,7 @@ void ConstantPool::remove_unshareable_entries() {
518
518
519
519
if (cache () != nullptr ) {
520
520
// cache() is null if this class is not yet linked.
521
- remove_resolved_field_entries_if_non_deterministic ();
522
- remove_resolved_method_entries_if_non_deterministic ();
523
- remove_resolved_indy_entries_if_non_deterministic ();
521
+ cache ()->remove_unshareable_info ();
524
522
}
525
523
}
526
524
@@ -565,191 +563,6 @@ void ConstantPool::remove_resolved_klass_if_non_deterministic(int cp_index) {
565
563
566
564
ArchiveBuilder::alloc_stats ()->record_klass_cp_entry (can_archive, /* reverted=*/ !can_archive);
567
565
}
568
-
569
- void ConstantPool::remove_resolved_field_entries_if_non_deterministic () {
570
- ConstantPool* src_cp = ArchiveBuilder::current ()->get_source_addr (this );
571
- Array<ResolvedFieldEntry>* field_entries = cache ()->resolved_field_entries ();
572
- if (field_entries != nullptr ) {
573
- for (int i = 0 ; i < field_entries->length (); i++) {
574
- ResolvedFieldEntry* rfi = field_entries->adr_at (i);
575
- int cp_index = rfi->constant_pool_index ();
576
- bool archived = false ;
577
- bool resolved = rfi->is_resolved (Bytecodes::_getstatic) ||
578
- rfi->is_resolved (Bytecodes::_putstatic) ||
579
- rfi->is_resolved (Bytecodes::_putfield) ||
580
- rfi->is_resolved (Bytecodes::_putfield);
581
- if (resolved && ClassPrelinker::is_resolution_deterministic (src_cp, cp_index)) {
582
- rfi->mark_and_relocate ();
583
- archived = true ;
584
- } else {
585
- rfi->remove_unshareable_info ();
586
- }
587
- if (resolved) {
588
- LogStreamHandle (Trace, cds, resolve) log ;
589
- if (log .is_enabled ()) {
590
- ResourceMark rm;
591
- int klass_cp_index = uncached_klass_ref_index_at (cp_index);
592
- Symbol* klass_name = klass_name_at (klass_cp_index);
593
- Symbol* name = uncached_name_ref_at (cp_index);
594
- Symbol* signature = uncached_signature_ref_at (cp_index);
595
- log .print (" %s field CP entry [%3d]: %s %s %s.%s:%s" ,
596
- (archived ? " archived" : " reverted" ),
597
- cp_index,
598
- pool_holder ()->name ()->as_C_string (),
599
- (archived ? " =>" : " " ),
600
- klass_name->as_C_string (), name->as_C_string (), signature->as_C_string ());
601
- }
602
- }
603
- ArchiveBuilder::alloc_stats ()->record_field_cp_entry (archived, resolved && !archived);
604
- }
605
- }
606
- }
607
-
608
- void ConstantPool::remove_resolved_method_entries_if_non_deterministic () {
609
- ConstantPool* src_cp = ArchiveBuilder::current ()->get_source_addr (this );
610
- Array<ResolvedMethodEntry>* method_entries = cache ()->resolved_method_entries ();
611
- if (method_entries != nullptr ) {
612
- for (int i = 0 ; i < method_entries->length (); i++) {
613
- ResolvedMethodEntry* rme = method_entries->adr_at (i);
614
- int cp_index = rme->constant_pool_index ();
615
- bool archived = false ;
616
- bool resolved = rme->is_resolved (Bytecodes::_invokevirtual) ||
617
- rme->is_resolved (Bytecodes::_invokespecial) ||
618
- rme->is_resolved (Bytecodes::_invokestatic) ||
619
- rme->is_resolved (Bytecodes::_invokeinterface) ||
620
- rme->is_resolved (Bytecodes::_invokehandle);
621
- if (resolved && can_archive_resolved_method (rme)) {
622
- rme->mark_and_relocate (src_cp);
623
- archived = true ;
624
- } else {
625
- rme->remove_unshareable_info ();
626
- }
627
- if (resolved) {
628
- LogStreamHandle (Trace, cds, resolve) log ;
629
- if (log .is_enabled ()) {
630
- ResourceMark rm;
631
- int klass_cp_index = uncached_klass_ref_index_at (cp_index);
632
- Symbol* klass_name = klass_name_at (klass_cp_index);
633
- Symbol* name = uncached_name_ref_at (cp_index);
634
- Symbol* signature = uncached_signature_ref_at (cp_index);
635
- log .print (" %s%s method CP entry [%3d]: %s %s.%s:%s" ,
636
- (archived ? " archived" : " reverted" ),
637
- (rme->is_resolved (Bytecodes::_invokeinterface) ? " interface" : " " ),
638
- cp_index,
639
- pool_holder ()->name ()->as_C_string (),
640
- klass_name->as_C_string (), name->as_C_string (), signature->as_C_string ());
641
- if (archived) {
642
- Klass* resolved_klass = resolved_klass_at (klass_cp_index);
643
- log .print (" => %s%s" ,
644
- resolved_klass->name ()->as_C_string (),
645
- (rme->is_resolved (Bytecodes::_invokestatic) ? " *** static" : " " ));
646
- }
647
- }
648
- }
649
- ArchiveBuilder::alloc_stats ()->record_method_cp_entry (archived, resolved && !archived);
650
- }
651
- }
652
- }
653
-
654
- void ConstantPool::remove_resolved_indy_entries_if_non_deterministic () {
655
- ConstantPool* src_cp = ArchiveBuilder::current ()->get_source_addr (this );
656
- Array<ResolvedIndyEntry>* indy_entries = cache ()->resolved_indy_entries ();
657
- if (indy_entries != nullptr ) {
658
- for (int i = 0 ; i < indy_entries->length (); i++) {
659
- ResolvedIndyEntry* rei = indy_entries->adr_at (i);
660
- int cp_index = rei->constant_pool_index ();
661
- bool archived = false ;
662
- bool resolved = rei->is_resolved ();
663
- if (resolved && ClassPrelinker::is_resolution_deterministic (src_cp, cp_index)) {
664
- rei->mark_and_relocate ();
665
- archived = true ;
666
- } else {
667
- rei->remove_unshareable_info ();
668
- }
669
- if (resolved) {
670
- LogStreamHandle (Trace, cds, resolve) log ;
671
- if (log .is_enabled ()) {
672
- ResourceMark rm;
673
- int bsm = bootstrap_method_ref_index_at (cp_index);
674
- int bsm_ref = method_handle_index_at (bsm);
675
- Symbol* bsm_name = uncached_name_ref_at (bsm_ref);
676
- Symbol* bsm_signature = uncached_signature_ref_at (bsm_ref);
677
- Symbol* bsm_klass = klass_name_at (uncached_klass_ref_index_at (bsm_ref));
678
- log .print (" %s indy CP entry [%3d]: %s (%d)" ,
679
- (archived ? " archived" : " reverted" ),
680
- cp_index, pool_holder ()->name ()->as_C_string (), i);
681
- log .print (" %s %s.%s:%s" , (archived ? " =>" : " " ), bsm_klass->as_C_string (), bsm_name->as_C_string (), bsm_signature->as_C_string ());
682
- }
683
- }
684
- ArchiveBuilder::alloc_stats ()->record_indy_cp_entry (archived, resolved && !archived);
685
- }
686
- }
687
- }
688
-
689
- bool ConstantPool::can_archive_invokehandle (ResolvedMethodEntry* rme) {
690
- assert (rme->is_resolved (Bytecodes::_invokehandle), " sanity" );
691
-
692
- int cp_index = rme->constant_pool_index ();
693
- int klass_cp_index = uncached_klass_ref_index_at (cp_index);
694
- Klass* resolved_klass = resolved_klass_at (klass_cp_index);
695
- if (!resolved_klass->is_instance_klass ()) {
696
- // FIXME: can this ever happen?
697
- return false ;
698
- }
699
- // FIXME -- any class referenced by the archived CP entries should be added to ArchiveBuilder::classes, or should be
700
- // filtered out.
701
- return true ;
702
- }
703
-
704
- bool ConstantPool::can_archive_resolved_method (ResolvedMethodEntry* method_entry) {
705
- if (!(pool_holder ()->is_shared_boot_class () || pool_holder ()->is_shared_platform_class () ||
706
- pool_holder ()->is_shared_app_class ())) {
707
- // Archiving resolved cp entries for classes from non-builtin loaders
708
- // is not yet supported.
709
- return false ;
710
- }
711
-
712
- if (CDSConfig::is_dumping_dynamic_archive ()) {
713
- // InstanceKlass::methods() is has been resorted. We need to
714
- // update the vtable_index in method_entry (not implemented)
715
- return false ;
716
- }
717
-
718
- if (!method_entry->is_resolved (Bytecodes::_invokevirtual)) {
719
- if (method_entry->method () == nullptr ) {
720
- return false ;
721
- }
722
- if (method_entry->method ()->is_continuation_native_intrinsic ()) {
723
- return false ; // FIXME: corresponding stub is generated on demand during method resolution (see LinkResolver::resolve_static_call).
724
- }
725
- }
726
-
727
- int cp_index = method_entry->constant_pool_index ();
728
- ConstantPool* src_cp = ArchiveBuilder::current ()->get_source_addr (this );
729
- assert (src_cp->tag_at (cp_index).is_method () || src_cp->tag_at (cp_index).is_interface_method (), " sanity" );
730
-
731
- if (!ClassPrelinker::is_resolution_deterministic (src_cp, cp_index)) {
732
- return false ;
733
- }
734
-
735
- if (method_entry->is_resolved (Bytecodes::_invokehandle)) {
736
- if (!ArchiveInvokeDynamic) {
737
- // invokehandle depends on archived MethodType and LambdaForms.
738
- return false ;
739
- } else if (!can_archive_invokehandle (method_entry)) {
740
- return false ;
741
- }
742
- } else if (method_entry->is_resolved (Bytecodes::_invokestatic) ||
743
- method_entry->is_resolved (Bytecodes::_invokeinterface) ||
744
- method_entry->is_resolved (Bytecodes::_invokevirtual) ||
745
- method_entry->is_resolved (Bytecodes::_invokespecial)) {
746
- // OK
747
- } else {
748
- return false ; // just to be safe.
749
- }
750
-
751
- return true ;
752
- }
753
566
#endif // INCLUDE_CDS
754
567
755
568
int ConstantPool::cp_to_object_index (int cp_index) {
0 commit comments