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