1 /* 2 * Copyright (c) 1999, 2025, 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 "ci/ciCallSite.hpp" 26 #include "ci/ciInstance.hpp" 27 #include "ci/ciInstanceKlass.hpp" 28 #include "ci/ciMemberName.hpp" 29 #include "ci/ciMethod.hpp" 30 #include "ci/ciMethodData.hpp" 31 #include "ci/ciMethodHandle.hpp" 32 #include "ci/ciMethodType.hpp" 33 #include "ci/ciNullObject.hpp" 34 #include "ci/ciObjArray.hpp" 35 #include "ci/ciObjArrayKlass.hpp" 36 #include "ci/ciObject.hpp" 37 #include "ci/ciObjectFactory.hpp" 38 #include "ci/ciReplay.hpp" 39 #include "ci/ciSymbol.hpp" 40 #include "ci/ciSymbols.hpp" 41 #include "ci/ciTypeArray.hpp" 42 #include "ci/ciTypeArrayKlass.hpp" 43 #include "ci/ciUtilities.inline.hpp" 44 #include "classfile/javaClasses.inline.hpp" 45 #include "classfile/vmClasses.hpp" 46 #include "compiler/compiler_globals.hpp" 47 #include "gc/shared/collectedHeap.inline.hpp" 48 #include "memory/allocation.inline.hpp" 49 #include "memory/universe.hpp" 50 #include "oops/oop.inline.hpp" 51 #include "runtime/handles.inline.hpp" 52 #include "runtime/signature.hpp" 53 #include "utilities/macros.hpp" 54 55 // ciObjectFactory 56 // 57 // This class handles requests for the creation of new instances 58 // of ciObject and its subclasses. It contains a caching mechanism 59 // which ensures that for each oop, at most one ciObject is created. 60 // This invariant allows more efficient implementation of ciObject. 61 // 62 // Implementation note: the oop->ciObject mapping is represented as 63 // a table stored in an array. Even though objects are moved 64 // by the garbage collector, the compactor preserves their relative 65 // order; address comparison of oops (in perm space) is safe so long 66 // as we prohibit GC during our comparisons. We currently use binary 67 // search to find the oop in the table, and inserting a new oop 68 // into the table may be costly. If this cost ends up being 69 // problematic the underlying data structure can be switched to some 70 // sort of balanced binary tree. 71 72 GrowableArray<ciMetadata*>* ciObjectFactory::_shared_ci_metadata = nullptr; 73 ciSymbol* ciObjectFactory::_shared_ci_symbols[vmSymbols::number_of_symbols()]; 74 int ciObjectFactory::_shared_ident_limit = 0; 75 volatile bool ciObjectFactory::_initialized = false; 76 77 78 // ------------------------------------------------------------------ 79 // ciObjectFactory::ciObjectFactory 80 ciObjectFactory::ciObjectFactory(Arena* arena, 81 int expected_size) 82 : _arena(arena), 83 _ci_metadata(arena, expected_size, 0, nullptr), 84 _unloaded_methods(arena, 4, 0, nullptr), 85 _unloaded_klasses(arena, 8, 0, nullptr), 86 _unloaded_instances(arena, 4, 0, nullptr), 87 _return_addresses(arena, 8, 0, nullptr), 88 _symbols(arena, 100, 0, nullptr), 89 _next_ident(_shared_ident_limit), 90 _non_perm_count(0) { 91 for (int i = 0; i < NON_PERM_BUCKETS; i++) { 92 _non_perm_bucket[i] = nullptr; 93 } 94 95 // If the shared ci objects exist append them to this factory's objects 96 if (_shared_ci_metadata != nullptr) { 97 _ci_metadata.appendAll(_shared_ci_metadata); 98 } 99 } 100 101 // ------------------------------------------------------------------ 102 // ciObjectFactory::ciObjectFactory 103 void ciObjectFactory::initialize() { 104 ASSERT_IN_VM; 105 JavaThread* thread = JavaThread::current(); 106 HandleMark handle_mark(thread); 107 108 // This Arena is long lived and exists in the resource mark of the 109 // compiler thread that initializes the initial ciObjectFactory which 110 // creates the shared ciObjects that all later ciObjectFactories use. 111 Arena* arena = new (mtCompiler) Arena(mtCompiler); 112 ciEnv initial(arena); 113 ciEnv* env = ciEnv::current(); 114 env->_factory->init_shared_objects(); 115 116 _initialized = true; 117 118 } 119 120 void ciObjectFactory::init_shared_objects() { 121 122 _next_ident = 1; // start numbering CI objects at 1 123 124 { 125 // Create the shared symbols, but not in _shared_ci_metadata. 126 for (auto index : EnumRange<vmSymbolID>{}) { 127 Symbol* vmsym = vmSymbols::symbol_at(index); 128 assert(vmSymbols::find_sid(vmsym) == index, "1-1 mapping"); 129 ciSymbol* sym = new (_arena) ciSymbol(vmsym, index); 130 init_ident_of(sym); 131 _shared_ci_symbols[vmSymbols::as_int(index)] = sym; 132 } 133 #ifdef ASSERT 134 for (auto index : EnumRange<vmSymbolID>{}) { 135 Symbol* vmsym = vmSymbols::symbol_at(index); 136 ciSymbol* sym = vm_symbol_at(index); 137 assert(sym->get_symbol() == vmsym, "oop must match"); 138 } 139 assert(ciSymbols::void_class_signature()->get_symbol() == vmSymbols::void_class_signature(), "spot check"); 140 #endif 141 } 142 143 for (int i = T_BOOLEAN; i <= T_CONFLICT; i++) { 144 BasicType t = (BasicType)i; 145 if (type2name(t) != nullptr && !is_reference_type(t) && 146 t != T_NARROWOOP && t != T_NARROWKLASS) { 147 ciType::_basic_types[t] = new (_arena) ciType(t); 148 init_ident_of(ciType::_basic_types[t]); 149 } 150 } 151 152 ciEnv::_null_object_instance = new (_arena) ciNullObject(); 153 init_ident_of(ciEnv::_null_object_instance); 154 155 #define VM_CLASS_DEFN(name, ignore_s) \ 156 if (vmClasses::name##_is_loaded()) \ 157 ciEnv::_##name = get_metadata(vmClasses::name())->as_instance_klass(); 158 159 VM_CLASSES_DO(VM_CLASS_DEFN) 160 #undef VM_CLASS_DEFN 161 162 for (int len = -1; len != _ci_metadata.length(); ) { 163 len = _ci_metadata.length(); 164 for (int i2 = 0; i2 < len; i2++) { 165 ciMetadata* obj = _ci_metadata.at(i2); 166 assert (obj->is_metadata(), "what else would it be?"); 167 if (obj->is_loaded() && obj->is_instance_klass()) { 168 obj->as_instance_klass()->compute_nonstatic_fields(); 169 obj->as_instance_klass()->transitive_interfaces(); 170 } 171 } 172 } 173 174 ciEnv::_unloaded_cisymbol = ciObjectFactory::get_symbol(vmSymbols::dummy_symbol()); 175 // Create dummy InstanceKlass and ObjArrayKlass object and assign them idents 176 ciEnv::_unloaded_ciinstance_klass = new (_arena) ciInstanceKlass(ciEnv::_unloaded_cisymbol, nullptr); 177 init_ident_of(ciEnv::_unloaded_ciinstance_klass); 178 ciEnv::_unloaded_ciobjarrayklass = new (_arena) ciObjArrayKlass(ciEnv::_unloaded_cisymbol, ciEnv::_unloaded_ciinstance_klass, 1); 179 init_ident_of(ciEnv::_unloaded_ciobjarrayklass); 180 assert(ciEnv::_unloaded_ciobjarrayklass->is_obj_array_klass(), "just checking"); 181 182 get_metadata(Universe::boolArrayKlass()); 183 get_metadata(Universe::charArrayKlass()); 184 get_metadata(Universe::floatArrayKlass()); 185 get_metadata(Universe::doubleArrayKlass()); 186 get_metadata(Universe::byteArrayKlass()); 187 get_metadata(Universe::shortArrayKlass()); 188 get_metadata(Universe::intArrayKlass()); 189 get_metadata(Universe::longArrayKlass()); 190 191 assert(_non_perm_count == 0, "no shared non-perm objects"); 192 193 // The shared_ident_limit is the first ident number that will 194 // be used for non-shared objects. That is, numbers less than 195 // this limit are permanently assigned to shared CI objects, 196 // while the higher numbers are recycled afresh by each new ciEnv. 197 198 _shared_ident_limit = _next_ident; 199 _shared_ci_metadata = &_ci_metadata; 200 } 201 202 203 ciSymbol* ciObjectFactory::get_symbol(Symbol* key) { 204 vmSymbolID sid = vmSymbols::find_sid(key); 205 if (sid != vmSymbolID::NO_SID) { 206 // do not pollute the main cache with it 207 return vm_symbol_at(sid); 208 } 209 210 assert(vmSymbols::find_sid(key) == vmSymbolID::NO_SID, ""); 211 ciSymbol* s = new (arena()) ciSymbol(key, vmSymbolID::NO_SID); 212 _symbols.push(s); 213 return s; 214 } 215 216 // Decrement the refcount when done on symbols referenced by this compilation. 217 void ciObjectFactory::remove_symbols() { 218 for (int i = 0; i < _symbols.length(); i++) { 219 ciSymbol* s = _symbols.at(i); 220 s->get_symbol()->decrement_refcount(); 221 } 222 // Since _symbols is resource allocated we're not allowed to delete it 223 // but it'll go away just the same. 224 } 225 226 // ------------------------------------------------------------------ 227 // ciObjectFactory::get 228 // 229 // Get the ciObject corresponding to some oop. If the ciObject has 230 // already been created, it is returned. Otherwise, a new ciObject 231 // is created. 232 ciObject* ciObjectFactory::get(oop key) { 233 ASSERT_IN_VM; 234 235 assert(Universe::heap()->is_in(key), "must be"); 236 237 NonPermObject* &bucket = find_non_perm(key); 238 if (bucket != nullptr) { 239 return bucket->object(); 240 } 241 242 // The ciObject does not yet exist. Create it and insert it 243 // into the cache. 244 Handle keyHandle(Thread::current(), key); 245 ciObject* new_object = create_new_object(keyHandle()); 246 assert(keyHandle() == new_object->get_oop(), "must be properly recorded"); 247 init_ident_of(new_object); 248 assert(Universe::heap()->is_in(new_object->get_oop()), "must be"); 249 250 // Not a perm-space object. 251 insert_non_perm(bucket, keyHandle(), new_object); 252 return new_object; 253 } 254 255 int ciObjectFactory::metadata_compare(Metadata* const& key, ciMetadata* const& elt) { 256 Metadata* value = elt->constant_encoding(); 257 if (key < value) return -1; 258 else if (key > value) return 1; 259 else return 0; 260 } 261 262 // ------------------------------------------------------------------ 263 // ciObjectFactory::cached_metadata 264 // 265 // Get the ciMetadata corresponding to some Metadata. If the ciMetadata has 266 // already been created, it is returned. Otherwise, null is returned. 267 ciMetadata* ciObjectFactory::cached_metadata(Metadata* key) { 268 ASSERT_IN_VM; 269 270 bool found = false; 271 int index = _ci_metadata.find_sorted<Metadata*, ciObjectFactory::metadata_compare>(key, found); 272 273 if (!found) { 274 return nullptr; 275 } 276 return _ci_metadata.at(index)->as_metadata(); 277 } 278 279 280 // ------------------------------------------------------------------ 281 // ciObjectFactory::get_metadata 282 // 283 // Get the ciMetadata corresponding to some Metadata. If the ciMetadata has 284 // already been created, it is returned. Otherwise, a new ciMetadata 285 // is created. 286 ciMetadata* ciObjectFactory::get_metadata(Metadata* key) { 287 ASSERT_IN_VM; 288 289 if (ReplayCompiles && key->is_klass()) { 290 Klass* k = (Klass*)key; 291 if (k->is_instance_klass() && ciReplay::is_klass_unresolved((InstanceKlass*)k)) { 292 // Klass was unresolved at replay dump time. Simulate this case. 293 return ciEnv::_unloaded_ciinstance_klass; 294 } 295 } 296 297 #ifdef ASSERT 298 if (CIObjectFactoryVerify) { 299 Metadata* last = nullptr; 300 for (int j = 0; j < _ci_metadata.length(); j++) { 301 Metadata* o = _ci_metadata.at(j)->constant_encoding(); 302 assert(last < o, "out of order"); 303 last = o; 304 } 305 } 306 #endif // ASSERT 307 int len = _ci_metadata.length(); 308 bool found = false; 309 int index = _ci_metadata.find_sorted<Metadata*, ciObjectFactory::metadata_compare>(key, found); 310 #ifdef ASSERT 311 if (CIObjectFactoryVerify) { 312 for (int i = 0; i < _ci_metadata.length(); i++) { 313 if (_ci_metadata.at(i)->constant_encoding() == key) { 314 assert(index == i, " bad lookup"); 315 } 316 } 317 } 318 #endif 319 320 if (!found) { 321 // The ciMetadata does not yet exist. Create it and insert it 322 // into the cache. 323 ciMetadata* new_object = create_new_metadata(key); 324 init_ident_of(new_object); 325 assert(new_object->is_metadata(), "must be"); 326 327 if (len != _ci_metadata.length()) { 328 // creating the new object has recursively entered new objects 329 // into the table. We need to recompute our index. 330 index = _ci_metadata.find_sorted<Metadata*, ciObjectFactory::metadata_compare>(key, found); 331 } 332 assert(!found, "no double insert"); 333 _ci_metadata.insert_before(index, new_object); 334 return new_object; 335 } 336 return _ci_metadata.at(index)->as_metadata(); 337 } 338 339 // ------------------------------------------------------------------ 340 // ciObjectFactory::create_new_object 341 // 342 // Create a new ciObject from an oop. 343 // 344 // Implementation note: this functionality could be virtual behavior 345 // of the oop itself. For now, we explicitly marshal the object. 346 ciObject* ciObjectFactory::create_new_object(oop o) { 347 EXCEPTION_CONTEXT; 348 349 if (o->is_instance()) { 350 instanceHandle h_i(THREAD, (instanceOop)o); 351 if (java_lang_invoke_CallSite::is_instance(o)) 352 return new (arena()) ciCallSite(h_i); 353 else if (java_lang_invoke_MemberName::is_instance(o)) 354 return new (arena()) ciMemberName(h_i); 355 else if (java_lang_invoke_MethodHandle::is_instance(o)) 356 return new (arena()) ciMethodHandle(h_i); 357 else if (java_lang_invoke_MethodType::is_instance(o)) 358 return new (arena()) ciMethodType(h_i); 359 else 360 return new (arena()) ciInstance(h_i); 361 } else if (o->is_objArray()) { 362 objArrayHandle h_oa(THREAD, (objArrayOop)o); 363 return new (arena()) ciObjArray(h_oa); 364 } else if (o->is_typeArray()) { 365 typeArrayHandle h_ta(THREAD, (typeArrayOop)o); 366 return new (arena()) ciTypeArray(h_ta); 367 } 368 369 // The oop is of some type not supported by the compiler interface. 370 ShouldNotReachHere(); 371 return nullptr; 372 } 373 374 // ------------------------------------------------------------------ 375 // ciObjectFactory::create_new_metadata 376 // 377 // Create a new ciMetadata from a Metadata*. 378 // 379 // Implementation note: in order to keep Metadata live, an auxiliary ciObject 380 // is used, which points to it's holder. 381 ciMetadata* ciObjectFactory::create_new_metadata(Metadata* o) { 382 EXCEPTION_CONTEXT; 383 384 if (o->is_klass()) { 385 Klass* k = (Klass*)o; 386 if (k->is_instance_klass()) { 387 assert(!ReplayCompiles || ciReplay::no_replay_state() || !ciReplay::is_klass_unresolved((InstanceKlass*)k), "must be whitelisted for replay compilation"); 388 return new (arena()) ciInstanceKlass(k); 389 } else if (k->is_objArray_klass()) { 390 return new (arena()) ciObjArrayKlass(k); 391 } else if (k->is_typeArray_klass()) { 392 return new (arena()) ciTypeArrayKlass(k); 393 } 394 } else if (o->is_method()) { 395 methodHandle h_m(THREAD, (Method*)o); 396 ciEnv *env = CURRENT_THREAD_ENV; 397 ciInstanceKlass* holder = env->get_instance_klass(h_m()->method_holder()); 398 return new (arena()) ciMethod(h_m, holder); 399 } else if (o->is_methodData()) { 400 // Hold methodHandle alive - might not be necessary ??? 401 methodHandle h_m(THREAD, ((MethodData*)o)->method()); 402 return new (arena()) ciMethodData((MethodData*)o); 403 } 404 405 // The Metadata* is of some type not supported by the compiler interface. 406 ShouldNotReachHere(); 407 return nullptr; 408 } 409 410 //------------------------------------------------------------------ 411 // ciObjectFactory::get_unloaded_method 412 // 413 // Get the ciMethod representing an unloaded/unfound method. 414 // 415 // Implementation note: unloaded methods are currently stored in 416 // an unordered array, requiring a linear-time lookup for each 417 // unloaded method. This may need to change. 418 ciMethod* ciObjectFactory::get_unloaded_method(ciInstanceKlass* holder, 419 ciSymbol* name, 420 ciSymbol* signature, 421 ciInstanceKlass* accessor) { 422 assert(accessor != nullptr, "need origin of access"); 423 ciSignature* that = nullptr; 424 for (int i = 0; i < _unloaded_methods.length(); i++) { 425 ciMethod* entry = _unloaded_methods.at(i); 426 if (entry->holder()->equals(holder) && 427 entry->name()->equals(name) && 428 entry->signature()->as_symbol()->equals(signature)) { 429 // Short-circuit slow resolve. 430 if (entry->signature()->accessing_klass() == accessor) { 431 // We've found a match. 432 return entry; 433 } else { 434 // Lazily create ciSignature 435 if (that == nullptr) that = new (arena()) ciSignature(accessor, constantPoolHandle(), signature); 436 if (entry->signature()->equals(that)) { 437 // We've found a match. 438 return entry; 439 } 440 } 441 } 442 } 443 444 // This is a new unloaded method. Create it and stick it in 445 // the cache. 446 ciMethod* new_method = new (arena()) ciMethod(holder, name, signature, accessor); 447 448 init_ident_of(new_method); 449 _unloaded_methods.append(new_method); 450 451 return new_method; 452 } 453 454 //------------------------------------------------------------------ 455 // ciObjectFactory::get_unloaded_klass 456 // 457 // Get a ciKlass representing an unloaded klass. 458 // 459 // Implementation note: unloaded klasses are currently stored in 460 // an unordered array, requiring a linear-time lookup for each 461 // unloaded klass. This may need to change. 462 ciKlass* ciObjectFactory::get_unloaded_klass(ciKlass* accessing_klass, 463 ciSymbol* name, 464 bool create_if_not_found) { 465 EXCEPTION_CONTEXT; 466 oop loader = nullptr; 467 oop domain = nullptr; 468 if (accessing_klass != nullptr) { 469 loader = accessing_klass->loader(); 470 } 471 for (int i = 0; i < _unloaded_klasses.length(); i++) { 472 ciKlass* entry = _unloaded_klasses.at(i); 473 if (entry->name()->equals(name) && 474 entry->loader() == loader) { 475 // We've found a match. 476 return entry; 477 } 478 } 479 480 if (!create_if_not_found) 481 return nullptr; 482 483 // This is a new unloaded klass. Create it and stick it in 484 // the cache. 485 ciKlass* new_klass = nullptr; 486 487 // Two cases: this is an unloaded ObjArrayKlass or an 488 // unloaded InstanceKlass. Deal with both. 489 if (name->char_at(0) == JVM_SIGNATURE_ARRAY) { 490 // Decompose the name.' 491 SignatureStream ss(name->get_symbol(), false); 492 int dimension = ss.skip_array_prefix(); // skip all '['s 493 BasicType element_type = ss.type(); 494 assert(element_type != T_ARRAY, "unsuccessful decomposition"); 495 ciKlass* element_klass = nullptr; 496 if (element_type == T_OBJECT) { 497 ciEnv *env = CURRENT_THREAD_ENV; 498 ciSymbol* ci_name = env->get_symbol(ss.as_symbol()); 499 element_klass = 500 env->get_klass_by_name(accessing_klass, ci_name, false)->as_instance_klass(); 501 } else { 502 assert(dimension > 1, "one dimensional type arrays are always loaded."); 503 504 // The type array itself takes care of one of the dimensions. 505 dimension--; 506 507 // The element klass is a TypeArrayKlass. 508 element_klass = ciTypeArrayKlass::make(element_type); 509 } 510 new_klass = new (arena()) ciObjArrayKlass(name, element_klass, dimension); 511 } else { 512 jobject loader_handle = nullptr; 513 if (accessing_klass != nullptr) { 514 loader_handle = accessing_klass->loader_handle(); 515 } 516 new_klass = new (arena()) ciInstanceKlass(name, loader_handle); 517 } 518 init_ident_of(new_klass); 519 _unloaded_klasses.append(new_klass); 520 521 return new_klass; 522 } 523 524 525 //------------------------------------------------------------------ 526 // ciObjectFactory::get_unloaded_instance 527 // 528 // Get a ciInstance representing an as-yet undetermined instance of a given class. 529 // 530 ciInstance* ciObjectFactory::get_unloaded_instance(ciInstanceKlass* instance_klass) { 531 for (int i = 0; i < _unloaded_instances.length(); i++) { 532 ciInstance* entry = _unloaded_instances.at(i); 533 if (entry->klass()->equals(instance_klass)) { 534 // We've found a match. 535 return entry; 536 } 537 } 538 539 // This is a new unloaded instance. Create it and stick it in 540 // the cache. 541 ciInstance* new_instance = new (arena()) ciInstance(instance_klass); 542 543 init_ident_of(new_instance); 544 _unloaded_instances.append(new_instance); 545 546 // make sure it looks the way we want: 547 assert(!new_instance->is_loaded(), ""); 548 assert(new_instance->klass() == instance_klass, ""); 549 550 return new_instance; 551 } 552 553 554 //------------------------------------------------------------------ 555 // ciObjectFactory::get_unloaded_klass_mirror 556 // 557 // Get a ciInstance representing an unresolved klass mirror. 558 // 559 // Currently, this ignores the parameters and returns a unique unloaded instance. 560 ciInstance* ciObjectFactory::get_unloaded_klass_mirror(ciKlass* type) { 561 assert(ciEnv::_Class_klass != nullptr, ""); 562 return get_unloaded_instance(ciEnv::_Class_klass->as_instance_klass()); 563 } 564 565 //------------------------------------------------------------------ 566 // ciObjectFactory::get_unloaded_method_handle_constant 567 // 568 // Get a ciInstance representing an unresolved method handle constant. 569 // 570 // Currently, this ignores the parameters and returns a unique unloaded instance. 571 ciInstance* ciObjectFactory::get_unloaded_method_handle_constant(ciKlass* holder, 572 ciSymbol* name, 573 ciSymbol* signature, 574 int ref_kind) { 575 assert(ciEnv::_MethodHandle_klass != nullptr, ""); 576 return get_unloaded_instance(ciEnv::_MethodHandle_klass->as_instance_klass()); 577 } 578 579 //------------------------------------------------------------------ 580 // ciObjectFactory::get_unloaded_method_type_constant 581 // 582 // Get a ciInstance representing an unresolved method type constant. 583 // 584 // Currently, this ignores the parameters and returns a unique unloaded instance. 585 ciInstance* ciObjectFactory::get_unloaded_method_type_constant(ciSymbol* signature) { 586 assert(ciEnv::_MethodType_klass != nullptr, ""); 587 return get_unloaded_instance(ciEnv::_MethodType_klass->as_instance_klass()); 588 } 589 590 ciInstance* ciObjectFactory::get_unloaded_object_constant() { 591 assert(ciEnv::_Object_klass != nullptr, ""); 592 return get_unloaded_instance(ciEnv::_Object_klass->as_instance_klass()); 593 } 594 595 //------------------------------------------------------------------ 596 // ciObjectFactory::get_empty_methodData 597 // 598 // Get the ciMethodData representing the methodData for a method with 599 // none. 600 ciMethodData* ciObjectFactory::get_empty_methodData() { 601 ciMethodData* new_methodData = new (arena()) ciMethodData(); 602 init_ident_of(new_methodData); 603 return new_methodData; 604 } 605 606 //------------------------------------------------------------------ 607 // ciObjectFactory::get_return_address 608 // 609 // Get a ciReturnAddress for a specified bci. 610 ciReturnAddress* ciObjectFactory::get_return_address(int bci) { 611 for (int i = 0; i < _return_addresses.length(); i++) { 612 ciReturnAddress* entry = _return_addresses.at(i); 613 if (entry->bci() == bci) { 614 // We've found a match. 615 return entry; 616 } 617 } 618 619 ciReturnAddress* new_ret_addr = new (arena()) ciReturnAddress(bci); 620 init_ident_of(new_ret_addr); 621 _return_addresses.append(new_ret_addr); 622 return new_ret_addr; 623 } 624 625 // ------------------------------------------------------------------ 626 // ciObjectFactory::init_ident_of 627 void ciObjectFactory::init_ident_of(ciBaseObject* obj) { 628 obj->set_ident(_next_ident++); 629 } 630 631 static ciObjectFactory::NonPermObject* emptyBucket = nullptr; 632 633 // ------------------------------------------------------------------ 634 // ciObjectFactory::find_non_perm 635 // 636 // Use a small hash table, hashed on the klass of the key. 637 // If there is no entry in the cache corresponding to this oop, return 638 // the null tail of the bucket into which the oop should be inserted. 639 ciObjectFactory::NonPermObject* &ciObjectFactory::find_non_perm(oop key) { 640 assert(Universe::heap()->is_in(key), "must be"); 641 ciMetadata* klass = get_metadata(key->klass()); 642 NonPermObject* *bp = &_non_perm_bucket[(unsigned) klass->hash() % NON_PERM_BUCKETS]; 643 for (NonPermObject* p; (p = (*bp)) != nullptr; bp = &p->next()) { 644 if (is_equal(p, key)) break; 645 } 646 return (*bp); 647 } 648 649 650 651 // ------------------------------------------------------------------ 652 // Code for for NonPermObject 653 // 654 inline ciObjectFactory::NonPermObject::NonPermObject(ciObjectFactory::NonPermObject* &bucket, oop key, ciObject* object) { 655 assert(ciObjectFactory::is_initialized(), ""); 656 _object = object; 657 _next = bucket; 658 bucket = this; 659 } 660 661 662 663 // ------------------------------------------------------------------ 664 // ciObjectFactory::insert_non_perm 665 // 666 // Insert a ciObject into the non-perm table. 667 void ciObjectFactory::insert_non_perm(ciObjectFactory::NonPermObject* &where, oop key, ciObject* obj) { 668 assert(Universe::heap()->is_in_or_null(key), "must be"); 669 assert(&where != &emptyBucket, "must not try to fill empty bucket"); 670 NonPermObject* p = new (arena()) NonPermObject(where, key, obj); 671 assert(where == p && is_equal(p, key) && p->object() == obj, "entry must match"); 672 assert(find_non_perm(key) == p, "must find the same spot"); 673 ++_non_perm_count; 674 } 675 676 // ------------------------------------------------------------------ 677 // ciObjectFactory::vm_symbol_at 678 // Get the ciSymbol corresponding to some index in vmSymbols. 679 ciSymbol* ciObjectFactory::vm_symbol_at(vmSymbolID sid) { 680 int index = vmSymbols::as_int(sid); 681 return _shared_ci_symbols[index]; 682 } 683 684 // ------------------------------------------------------------------ 685 // ciObjectFactory::metadata_do 686 void ciObjectFactory::metadata_do(MetadataClosure* f) { 687 for (int j = 0; j < _ci_metadata.length(); j++) { 688 Metadata* o = _ci_metadata.at(j)->constant_encoding(); 689 f->do_metadata(o); 690 } 691 } 692 693 // ------------------------------------------------------------------ 694 // ciObjectFactory::print_contents_impl 695 void ciObjectFactory::print_contents_impl() { 696 int len = _ci_metadata.length(); 697 tty->print_cr("ciObjectFactory (%d) meta data contents:", len); 698 for (int i = 0; i < len; i++) { 699 _ci_metadata.at(i)->print(); 700 tty->cr(); 701 } 702 } 703 704 // ------------------------------------------------------------------ 705 // ciObjectFactory::print_contents 706 void ciObjectFactory::print_contents() { 707 print(); 708 tty->cr(); 709 GUARDED_VM_ENTRY(print_contents_impl();) 710 } 711 712 // ------------------------------------------------------------------ 713 // ciObjectFactory::print 714 // 715 // Print debugging information about the object factory 716 void ciObjectFactory::print() { 717 tty->print("<ciObjectFactory oops=%d metadata=%d unloaded_methods=%d unloaded_instances=%d unloaded_klasses=%d>", 718 _non_perm_count, _ci_metadata.length(), _unloaded_methods.length(), 719 _unloaded_instances.length(), 720 _unloaded_klasses.length()); 721 }