1198 // klass in the archive. 1199 Klass *reloc_k = MetaspaceShared::get_relocated_klass(as_Klass(mirror), true); 1200 log_debug(cds, heap, mirror)( 1201 "Relocate mirror metadata field at _klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT, 1202 p2i(as_Klass(mirror)), p2i(reloc_k)); 1203 archived_mirror->metadata_field_put(_klass_offset, reloc_k); 1204 1205 // The field at _array_klass_offset is pointing to the original one dimension 1206 // higher array klass if exists. Relocate the pointer. 1207 Klass *arr = array_klass_acquire(mirror); 1208 if (arr != NULL) { 1209 Klass *reloc_arr = MetaspaceShared::get_relocated_klass(arr, true); 1210 log_debug(cds, heap, mirror)( 1211 "Relocate mirror metadata field at _array_klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT, 1212 p2i(arr), p2i(reloc_arr)); 1213 archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr); 1214 } 1215 return archived_mirror; 1216 } 1217 1218 void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) { 1219 Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset)); 1220 if (k != NULL) { // k is NULL for the primitive classes such as java.lang.Byte::TYPE 1221 archived_mirror->metadata_field_put(_klass_offset, (Klass*)(address(k) + MetaspaceShared::mapping_delta())); 1222 } 1223 1224 Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset)); 1225 if (ak != NULL) { 1226 archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta())); 1227 } 1228 } 1229 1230 1231 // Returns true if the mirror is updated, false if no archived mirror 1232 // data is present. After the archived mirror object is restored, the 1233 // shared klass' _has_raw_archived_mirror flag is cleared. 1234 bool java_lang_Class::restore_archived_mirror(Klass *k, 1235 Handle class_loader, Handle module, 1236 Handle protection_domain, TRAPS) { 1237 // Postpone restoring archived mirror until java.lang.Class is loaded. Please 1238 // see more details in SystemDictionary::resolve_well_known_classes(). 1239 if (!SystemDictionary::Class_klass_loaded()) { 1240 assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized"); 1241 fixup_mirror_list()->push(k); 1242 return true; 1243 } 1244 1245 oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow()); 1246 1247 if (m == NULL) { 1248 return false; 1249 } 1250 1251 log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m)); 1252 update_archived_mirror_native_pointers(m); 1253 1254 // mirror is archived, restore 1255 assert(HeapShared::is_archived_object(m), "must be archived mirror object"); 1256 Handle mirror(THREAD, m); 1257 1258 if (!k->is_array_klass()) { 1259 // - local static final fields with initial values were initialized at dump time 1260 1261 // create the init_lock 1262 typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false)); 1263 set_init_lock(mirror(), r); 1264 1265 if (protection_domain.not_null()) { 1266 set_protection_domain(mirror(), protection_domain()); 1267 } 1268 } 1269 1270 assert(class_loader() == k->class_loader(), "should be same"); 1271 if (class_loader.not_null()) { 1272 set_class_loader(mirror(), class_loader()); 1273 } 1274 1275 k->set_java_mirror(mirror); | 1198 // klass in the archive. 1199 Klass *reloc_k = MetaspaceShared::get_relocated_klass(as_Klass(mirror), true); 1200 log_debug(cds, heap, mirror)( 1201 "Relocate mirror metadata field at _klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT, 1202 p2i(as_Klass(mirror)), p2i(reloc_k)); 1203 archived_mirror->metadata_field_put(_klass_offset, reloc_k); 1204 1205 // The field at _array_klass_offset is pointing to the original one dimension 1206 // higher array klass if exists. Relocate the pointer. 1207 Klass *arr = array_klass_acquire(mirror); 1208 if (arr != NULL) { 1209 Klass *reloc_arr = MetaspaceShared::get_relocated_klass(arr, true); 1210 log_debug(cds, heap, mirror)( 1211 "Relocate mirror metadata field at _array_klass_offset from " PTR_FORMAT " ==> " PTR_FORMAT, 1212 p2i(arr), p2i(reloc_arr)); 1213 archived_mirror->metadata_field_put(_array_klass_offset, reloc_arr); 1214 } 1215 return archived_mirror; 1216 } 1217 1218 void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) { 1219 if (MetaspaceShared::mapping_delta() != 0) { 1220 assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class"); 1221 1222 Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset)); 1223 if (ak != NULL) { 1224 archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta())); 1225 } 1226 } 1227 } 1228 1229 void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) { 1230 if (MetaspaceShared::mapping_delta() != 0) { 1231 Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset)); 1232 archived_mirror->metadata_field_put(_klass_offset, (Klass*)(address(k) + MetaspaceShared::mapping_delta())); 1233 1234 Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset)); 1235 if (ak != NULL) { 1236 archived_mirror->metadata_field_put(_array_klass_offset, (Klass*)(address(ak) + MetaspaceShared::mapping_delta())); 1237 } 1238 } 1239 } 1240 1241 1242 // Returns true if the mirror is updated, false if no archived mirror 1243 // data is present. After the archived mirror object is restored, the 1244 // shared klass' _has_raw_archived_mirror flag is cleared. 1245 bool java_lang_Class::restore_archived_mirror(Klass *k, 1246 Handle class_loader, Handle module, 1247 Handle protection_domain, TRAPS) { 1248 // Postpone restoring archived mirror until java.lang.Class is loaded. Please 1249 // see more details in SystemDictionary::resolve_well_known_classes(). 1250 if (!SystemDictionary::Class_klass_loaded()) { 1251 assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized"); 1252 fixup_mirror_list()->push(k); 1253 return true; 1254 } 1255 1256 oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow()); 1257 if (m == NULL) { 1258 return false; 1259 } 1260 1261 // mirror is archived, restore 1262 log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m)); 1263 assert(HeapShared::is_archived_object(m), "must be archived mirror object"); 1264 update_archived_mirror_native_pointers(m); 1265 assert(as_Klass(m) == k, "must be"); 1266 Handle mirror(THREAD, m); 1267 1268 if (!k->is_array_klass()) { 1269 // - local static final fields with initial values were initialized at dump time 1270 1271 // create the init_lock 1272 typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false)); 1273 set_init_lock(mirror(), r); 1274 1275 if (protection_domain.not_null()) { 1276 set_protection_domain(mirror(), protection_domain()); 1277 } 1278 } 1279 1280 assert(class_loader() == k->class_loader(), "should be same"); 1281 if (class_loader.not_null()) { 1282 set_class_loader(mirror(), class_loader()); 1283 } 1284 1285 k->set_java_mirror(mirror); |