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