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