678 }
679 if (SystemDictionaryShared::is_builtin_loader(src->pool_holder()->class_loader_data())) {
680 _scratch_objects_table->set_oop(src, dest);
681 }
682 }
683
684 objArrayOop HeapShared::scratch_resolved_references(ConstantPool* src) {
685 return (objArrayOop)_scratch_objects_table->get_oop(src);
686 }
687
688 void HeapShared::init_dumping() {
689 _scratch_objects_table = new (mtClass)MetaspaceObjToOopHandleTable();
690 _pending_roots = new GrowableArrayCHeap<oop, mtClassShared>(500);
691 _pending_roots->append(nullptr); // root index 0 represents a null oop
692 }
693
694 void HeapShared::init_scratch_objects_for_basic_type_mirrors(TRAPS) {
695 for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
696 BasicType bt = (BasicType)i;
697 if (!is_reference_type(bt)) {
698 oop m = java_lang_Class::create_basic_type_mirror(type2name(bt), bt, CHECK);
699 _scratch_basic_type_mirrors[i] = OopHandle(Universe::vm_global(), m);
700 }
701 }
702 }
703
704 // Given java_mirror that represents a (primitive or reference) type T,
705 // return the "scratch" version that represents the same type T. Note
706 // that java_mirror will be returned if the mirror is already a scratch mirror.
707 //
708 // See java_lang_Class::create_scratch_mirror() for more info.
709 oop HeapShared::scratch_java_mirror(oop java_mirror) {
710 assert(java_lang_Class::is_instance(java_mirror), "must be");
711
712 for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
713 BasicType bt = (BasicType)i;
714 if (!is_reference_type(bt)) {
715 if (_scratch_basic_type_mirrors[i].resolve() == java_mirror) {
716 return java_mirror;
717 }
718 }
849 }
850
851 oop class_data = java_lang_Class::class_data(orig_mirror);
852 java_lang_Class::set_class_data(m, class_data);
853 if (class_data != nullptr) {
854 bool success = archive_reachable_objects_from(1, _dump_time_special_subgraph, class_data);
855 assert(success, "sanity");
856 }
857
858 if (log_is_enabled(Debug, aot, init)) {
859 ResourceMark rm;
860 log_debug(aot, init)("copied %3d field(s) in aot-initialized mirror %s%s%s", nfields, ik->external_name(),
861 ik->is_hidden() ? " (hidden)" : "",
862 ik->is_enum_subclass() ? " (enum)" : "");
863 }
864 }
865
866 void HeapShared::copy_java_mirror(oop orig_mirror, oop scratch_m) {
867 // We need to retain the identity_hash, because it may have been used by some hashtables
868 // in the shared heap.
869 if (!orig_mirror->fast_no_hash_check()) {
870 intptr_t src_hash = orig_mirror->identity_hash();
871 if (UseCompactObjectHeaders) {
872 narrowKlass nk = CompressedKlassPointers::encode(orig_mirror->klass());
873 scratch_m->set_mark(markWord::prototype().set_narrow_klass(nk).copy_set_hash(src_hash));
874 } else {
875 scratch_m->set_mark(markWord::prototype().copy_set_hash(src_hash));
876 }
877 assert(scratch_m->mark().is_unlocked(), "sanity");
878
879 DEBUG_ONLY(intptr_t archived_hash = scratch_m->identity_hash());
880 assert(src_hash == archived_hash, "Different hash codes: original " INTPTR_FORMAT ", archived " INTPTR_FORMAT, src_hash, archived_hash);
881 }
882
883 if (CDSConfig::is_dumping_aot_linked_classes()) {
884 java_lang_Class::set_module(scratch_m, java_lang_Class::module(orig_mirror));
885 java_lang_Class::set_protection_domain(scratch_m, java_lang_Class::protection_domain(orig_mirror));
886 }
887 }
888
889 static objArrayOop get_archived_resolved_references(InstanceKlass* src_ik) {
890 if (SystemDictionaryShared::is_builtin_loader(src_ik->class_loader_data())) {
891 objArrayOop rr = src_ik->constants()->resolved_references_or_null();
892 if (rr != nullptr && !HeapShared::is_too_large_to_archive(rr)) {
893 return HeapShared::scratch_resolved_references(src_ik->constants());
894 }
895 }
896 return nullptr;
897 }
898
899 int HeapShared::archive_exception_instance(oop exception) {
900 bool success = archive_reachable_objects_from(1, _dump_time_special_subgraph, exception);
|
678 }
679 if (SystemDictionaryShared::is_builtin_loader(src->pool_holder()->class_loader_data())) {
680 _scratch_objects_table->set_oop(src, dest);
681 }
682 }
683
684 objArrayOop HeapShared::scratch_resolved_references(ConstantPool* src) {
685 return (objArrayOop)_scratch_objects_table->get_oop(src);
686 }
687
688 void HeapShared::init_dumping() {
689 _scratch_objects_table = new (mtClass)MetaspaceObjToOopHandleTable();
690 _pending_roots = new GrowableArrayCHeap<oop, mtClassShared>(500);
691 _pending_roots->append(nullptr); // root index 0 represents a null oop
692 }
693
694 void HeapShared::init_scratch_objects_for_basic_type_mirrors(TRAPS) {
695 for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
696 BasicType bt = (BasicType)i;
697 if (!is_reference_type(bt)) {
698 oop m = java_lang_Class::create_basic_type_mirror(type2name(bt), bt, true, CHECK);
699 _scratch_basic_type_mirrors[i] = OopHandle(Universe::vm_global(), m);
700 }
701 }
702 }
703
704 // Given java_mirror that represents a (primitive or reference) type T,
705 // return the "scratch" version that represents the same type T. Note
706 // that java_mirror will be returned if the mirror is already a scratch mirror.
707 //
708 // See java_lang_Class::create_scratch_mirror() for more info.
709 oop HeapShared::scratch_java_mirror(oop java_mirror) {
710 assert(java_lang_Class::is_instance(java_mirror), "must be");
711
712 for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
713 BasicType bt = (BasicType)i;
714 if (!is_reference_type(bt)) {
715 if (_scratch_basic_type_mirrors[i].resolve() == java_mirror) {
716 return java_mirror;
717 }
718 }
849 }
850
851 oop class_data = java_lang_Class::class_data(orig_mirror);
852 java_lang_Class::set_class_data(m, class_data);
853 if (class_data != nullptr) {
854 bool success = archive_reachable_objects_from(1, _dump_time_special_subgraph, class_data);
855 assert(success, "sanity");
856 }
857
858 if (log_is_enabled(Debug, aot, init)) {
859 ResourceMark rm;
860 log_debug(aot, init)("copied %3d field(s) in aot-initialized mirror %s%s%s", nfields, ik->external_name(),
861 ik->is_hidden() ? " (hidden)" : "",
862 ik->is_enum_subclass() ? " (enum)" : "");
863 }
864 }
865
866 void HeapShared::copy_java_mirror(oop orig_mirror, oop scratch_m) {
867 // We need to retain the identity_hash, because it may have been used by some hashtables
868 // in the shared heap.
869 assert(!UseCompactObjectHeaders || scratch_m->mark().is_not_hashed_expanded(), "scratch mirror must have not-hashed-expanded state");
870 assert(!UseCompactObjectHeaders || !orig_mirror->mark().is_not_hashed_expanded(), "must not be not-hashed-expanded");
871 if (!orig_mirror->fast_no_hash_check()) {
872 intptr_t orig_mark = orig_mirror->mark().value();
873 intptr_t src_hash = orig_mirror->identity_hash();
874 if (UseCompactObjectHeaders) {
875 // We leave the cases not_hashed/not_hashed_expanded as they are.
876 assert(orig_mirror->mark().is_hashed_not_expanded() || orig_mirror->mark().is_hashed_expanded(), "must be hashed");
877 Klass* orig_klass = orig_mirror->klass();
878 narrowKlass nk = CompressedKlassPointers::encode(orig_klass);
879 markWord mark = markWord::prototype().set_narrow_klass(nk);
880 mark = mark.copy_hashctrl_from(orig_mirror->mark());
881 if (mark.is_hashed_not_expanded()) {
882 scratch_m->set_mark(scratch_m->initialize_hash_if_necessary(orig_mirror, orig_klass, mark));
883 } else {
884 assert(mark.is_hashed_expanded(), "must be hashed & moved");
885 int offset = orig_klass->hash_offset_in_bytes(orig_mirror, mark);
886 assert(offset >= 4, "hash offset must not be in header");
887 scratch_m->int_field_put(offset, (jint) src_hash);
888 scratch_m->set_mark(mark);
889 }
890 assert(scratch_m->mark().is_hashed_expanded(), "must be hashed & moved");
891 assert(scratch_m->mark().is_not_hashed_expanded() || scratch_m->mark().is_hashed_expanded(), "must be not hashed and expanded");
892 } else {
893 scratch_m->set_mark(markWord::prototype().copy_set_hash(src_hash));
894 DEBUG_ONLY(intptr_t archived_hash = scratch_m->identity_hash());
895 assert(src_hash == archived_hash, "Different hash codes: original " INTPTR_FORMAT ", archived " INTPTR_FORMAT, src_hash, archived_hash);
896 }
897 assert(scratch_m->mark().is_unlocked(), "sanity");
898 }
899
900 if (CDSConfig::is_dumping_aot_linked_classes()) {
901 java_lang_Class::set_module(scratch_m, java_lang_Class::module(orig_mirror));
902 java_lang_Class::set_protection_domain(scratch_m, java_lang_Class::protection_domain(orig_mirror));
903 }
904 }
905
906 static objArrayOop get_archived_resolved_references(InstanceKlass* src_ik) {
907 if (SystemDictionaryShared::is_builtin_loader(src_ik->class_loader_data())) {
908 objArrayOop rr = src_ik->constants()->resolved_references_or_null();
909 if (rr != nullptr && !HeapShared::is_too_large_to_archive(rr)) {
910 return HeapShared::scratch_resolved_references(src_ik->constants());
911 }
912 }
913 return nullptr;
914 }
915
916 int HeapShared::archive_exception_instance(oop exception) {
917 bool success = archive_reachable_objects_from(1, _dump_time_special_subgraph, exception);
|