ciObjectFactory.cpp revision 6853:91eeb8807a03
1/* 2 * Copyright (c) 1999, 2014, 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.hpp" 43#include "classfile/systemDictionary.hpp" 44#include "gc_interface/collectedHeap.inline.hpp" 45#include "memory/allocation.inline.hpp" 46#include "oops/oop.inline.hpp" 47#include "oops/oop.inline2.hpp" 48#include "runtime/fieldType.hpp" 49#if INCLUDE_ALL_GCS 50# include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" 51#endif 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 70GrowableArray<ciMetadata*>* ciObjectFactory::_shared_ci_metadata = NULL; 71ciSymbol* ciObjectFactory::_shared_ci_symbols[vmSymbols::SID_LIMIT]; 72int ciObjectFactory::_shared_ident_limit = 0; 73volatile bool ciObjectFactory::_initialized = false; 74 75 76// ------------------------------------------------------------------ 77// ciObjectFactory::ciObjectFactory 78ciObjectFactory::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 107void 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 124void 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 && t != T_OBJECT && t != T_ARRAY && t != T_NARROWOOP && t != T_NARROWKLASS) { 153 ciType::_basic_types[t] = new (_arena) ciType(t); 154 init_ident_of(ciType::_basic_types[t]); 155 } 156 } 157 158 ciEnv::_null_object_instance = new (_arena) ciNullObject(); 159 init_ident_of(ciEnv::_null_object_instance); 160 161#define WK_KLASS_DEFN(name, ignore_s, opt) \ 162 if (SystemDictionary::name() != NULL) \ 163 ciEnv::_##name = get_metadata(SystemDictionary::name())->as_instance_klass(); 164 165 WK_KLASSES_DO(WK_KLASS_DEFN) 166#undef WK_KLASS_DEFN 167 168 for (int len = -1; len != _ci_metadata->length(); ) { 169 len = _ci_metadata->length(); 170 for (int i2 = 0; i2 < len; i2++) { 171 ciMetadata* obj = _ci_metadata->at(i2); 172 assert (obj->is_metadata(), "what else would it be?"); 173 if (obj->is_loaded() && obj->is_instance_klass()) { 174 obj->as_instance_klass()->compute_nonstatic_fields(); 175 } 176 } 177 } 178 179 ciEnv::_unloaded_cisymbol = ciObjectFactory::get_symbol(vmSymbols::dummy_symbol()); 180 // Create dummy InstanceKlass and ObjArrayKlass object and assign them idents 181 ciEnv::_unloaded_ciinstance_klass = new (_arena) ciInstanceKlass(ciEnv::_unloaded_cisymbol, NULL, NULL); 182 init_ident_of(ciEnv::_unloaded_ciinstance_klass); 183 ciEnv::_unloaded_ciobjarrayklass = new (_arena) ciObjArrayKlass(ciEnv::_unloaded_cisymbol, ciEnv::_unloaded_ciinstance_klass, 1); 184 init_ident_of(ciEnv::_unloaded_ciobjarrayklass); 185 assert(ciEnv::_unloaded_ciobjarrayklass->is_obj_array_klass(), "just checking"); 186 187 get_metadata(Universe::boolArrayKlassObj()); 188 get_metadata(Universe::charArrayKlassObj()); 189 get_metadata(Universe::singleArrayKlassObj()); 190 get_metadata(Universe::doubleArrayKlassObj()); 191 get_metadata(Universe::byteArrayKlassObj()); 192 get_metadata(Universe::shortArrayKlassObj()); 193 get_metadata(Universe::intArrayKlassObj()); 194 get_metadata(Universe::longArrayKlassObj()); 195 196 197 198 assert(_non_perm_count == 0, "no shared non-perm objects"); 199 200 // The shared_ident_limit is the first ident number that will 201 // be used for non-shared objects. That is, numbers less than 202 // this limit are permanently assigned to shared CI objects, 203 // while the higher numbers are recycled afresh by each new ciEnv. 204 205 _shared_ident_limit = _next_ident; 206 _shared_ci_metadata = _ci_metadata; 207} 208 209 210ciSymbol* ciObjectFactory::get_symbol(Symbol* key) { 211 vmSymbols::SID sid = vmSymbols::find_sid(key); 212 if (sid != vmSymbols::NO_SID) { 213 // do not pollute the main cache with it 214 return vm_symbol_at(sid); 215 } 216 217 assert(vmSymbols::find_sid(key) == vmSymbols::NO_SID, ""); 218 ciSymbol* s = new (arena()) ciSymbol(key, vmSymbols::NO_SID); 219 _symbols->push(s); 220 return s; 221} 222 223// Decrement the refcount when done on symbols referenced by this compilation. 224void ciObjectFactory::remove_symbols() { 225 for (int i = 0; i < _symbols->length(); i++) { 226 ciSymbol* s = _symbols->at(i); 227 s->get_symbol()->decrement_refcount(); 228 } 229 // Since _symbols is resource allocated we're not allowed to delete it 230 // but it'll go away just the same. 231} 232 233// ------------------------------------------------------------------ 234// ciObjectFactory::get 235// 236// Get the ciObject corresponding to some oop. If the ciObject has 237// already been created, it is returned. Otherwise, a new ciObject 238// is created. 239ciObject* ciObjectFactory::get(oop key) { 240 ASSERT_IN_VM; 241 242 assert(key == NULL || Universe::heap()->is_in_reserved(key), "must be"); 243 244 NonPermObject* &bucket = find_non_perm(key); 245 if (bucket != NULL) { 246 return bucket->object(); 247 } 248 249 // The ciObject does not yet exist. Create it and insert it 250 // into the cache. 251 Handle keyHandle(key); 252 ciObject* new_object = create_new_object(keyHandle()); 253 assert(keyHandle() == new_object->get_oop(), "must be properly recorded"); 254 init_ident_of(new_object); 255 assert(Universe::heap()->is_in_reserved(new_object->get_oop()), "must be"); 256 257 // Not a perm-space object. 258 insert_non_perm(bucket, keyHandle(), new_object); 259 return new_object; 260} 261 262// ------------------------------------------------------------------ 263// ciObjectFactory::get 264// 265// Get the ciObject corresponding to some oop. If the ciObject has 266// already been created, it is returned. Otherwise, a new ciObject 267// is created. 268ciMetadata* ciObjectFactory::get_metadata(Metadata* key) { 269 ASSERT_IN_VM; 270 271#ifdef ASSERT 272 if (CIObjectFactoryVerify) { 273 Metadata* last = NULL; 274 for (int j = 0; j< _ci_metadata->length(); j++) { 275 Metadata* o = _ci_metadata->at(j)->constant_encoding(); 276 assert(last < o, "out of order"); 277 last = o; 278 } 279 } 280#endif // ASSERT 281 int len = _ci_metadata->length(); 282 int index = find(key, _ci_metadata); 283#ifdef ASSERT 284 if (CIObjectFactoryVerify) { 285 for (int i=0; i<_ci_metadata->length(); i++) { 286 if (_ci_metadata->at(i)->constant_encoding() == key) { 287 assert(index == i, " bad lookup"); 288 } 289 } 290 } 291#endif 292 if (!is_found_at(index, key, _ci_metadata)) { 293 // The ciObject does not yet exist. Create it and insert it 294 // into the cache. 295 ciMetadata* new_object = create_new_object(key); 296 init_ident_of(new_object); 297 assert(new_object->is_metadata(), "must be"); 298 299 if (len != _ci_metadata->length()) { 300 // creating the new object has recursively entered new objects 301 // into the table. We need to recompute our index. 302 index = find(key, _ci_metadata); 303 } 304 assert(!is_found_at(index, key, _ci_metadata), "no double insert"); 305 insert(index, new_object, _ci_metadata); 306 return new_object; 307 } 308 return _ci_metadata->at(index)->as_metadata(); 309} 310 311// ------------------------------------------------------------------ 312// ciObjectFactory::create_new_object 313// 314// Create a new ciObject from an oop. 315// 316// Implementation note: this functionality could be virtual behavior 317// of the oop itself. For now, we explicitly marshal the object. 318ciObject* ciObjectFactory::create_new_object(oop o) { 319 EXCEPTION_CONTEXT; 320 321 if (o->is_instance()) { 322 instanceHandle h_i(THREAD, (instanceOop)o); 323 if (java_lang_invoke_CallSite::is_instance(o)) 324 return new (arena()) ciCallSite(h_i); 325 else if (java_lang_invoke_MemberName::is_instance(o)) 326 return new (arena()) ciMemberName(h_i); 327 else if (java_lang_invoke_MethodHandle::is_instance(o)) 328 return new (arena()) ciMethodHandle(h_i); 329 else if (java_lang_invoke_MethodType::is_instance(o)) 330 return new (arena()) ciMethodType(h_i); 331 else 332 return new (arena()) ciInstance(h_i); 333 } else if (o->is_objArray()) { 334 objArrayHandle h_oa(THREAD, (objArrayOop)o); 335 return new (arena()) ciObjArray(h_oa); 336 } else if (o->is_typeArray()) { 337 typeArrayHandle h_ta(THREAD, (typeArrayOop)o); 338 return new (arena()) ciTypeArray(h_ta); 339 } 340 341 // The oop is of some type not supported by the compiler interface. 342 ShouldNotReachHere(); 343 return NULL; 344} 345 346// ------------------------------------------------------------------ 347// ciObjectFactory::create_new_object 348// 349// Create a new ciObject from a Metadata*. 350// 351// Implementation note: this functionality could be virtual behavior 352// of the oop itself. For now, we explicitly marshal the object. 353ciMetadata* ciObjectFactory::create_new_object(Metadata* o) { 354 EXCEPTION_CONTEXT; 355 356 if (o->is_klass()) { 357 KlassHandle h_k(THREAD, (Klass*)o); 358 Klass* k = (Klass*)o; 359 if (k->oop_is_instance()) { 360 return new (arena()) ciInstanceKlass(h_k); 361 } else if (k->oop_is_objArray()) { 362 return new (arena()) ciObjArrayKlass(h_k); 363 } else if (k->oop_is_typeArray()) { 364 return new (arena()) ciTypeArrayKlass(h_k); 365 } 366 } else if (o->is_method()) { 367 methodHandle h_m(THREAD, (Method*)o); 368 return new (arena()) ciMethod(h_m); 369 } else if (o->is_methodData()) { 370 // Hold methodHandle alive - might not be necessary ??? 371 methodHandle h_m(THREAD, ((MethodData*)o)->method()); 372 return new (arena()) ciMethodData((MethodData*)o); 373 } 374 375 // The oop is of some type not supported by the compiler interface. 376 ShouldNotReachHere(); 377 return NULL; 378} 379 380// ------------------------------------------------------------------ 381// ciObjectFactory::ensure_metadata_alive 382// 383// Ensure that the metadata wrapped by the ciMetadata is kept alive by GC. 384// This is primarily useful for metadata which is considered as weak roots 385// by the GC but need to be strong roots if reachable from a current compilation. 386// 387void ciObjectFactory::ensure_metadata_alive(ciMetadata* m) { 388 ASSERT_IN_VM; // We're handling raw oops here. 389 390#if INCLUDE_ALL_GCS 391 if (!UseG1GC) { 392 return; 393 } 394 Klass* metadata_owner_klass; 395 if (m->is_klass()) { 396 metadata_owner_klass = m->as_klass()->get_Klass(); 397 } else if (m->is_method()) { 398 metadata_owner_klass = m->as_method()->get_Method()->constants()->pool_holder(); 399 } else { 400 fatal("Not implemented for other types of metadata"); 401 } 402 403 oop metadata_holder = metadata_owner_klass->klass_holder(); 404 if (metadata_holder != NULL) { 405 G1SATBCardTableModRefBS::enqueue(metadata_holder); 406 } 407 408#endif 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. 419ciMethod* ciObjectFactory::get_unloaded_method(ciInstanceKlass* holder, 420 ciSymbol* name, 421 ciSymbol* signature, 422 ciInstanceKlass* accessor) { 423 ciSignature* that = NULL; 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 == NULL) 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. 462ciKlass* ciObjectFactory::get_unloaded_klass(ciKlass* accessing_klass, 463 ciSymbol* name, 464 bool create_if_not_found) { 465 EXCEPTION_CONTEXT; 466 oop loader = NULL; 467 oop domain = NULL; 468 if (accessing_klass != NULL) { 469 loader = accessing_klass->loader(); 470 domain = accessing_klass->protection_domain(); 471 } 472 for (int i=0; i<_unloaded_klasses->length(); i++) { 473 ciKlass* entry = _unloaded_klasses->at(i); 474 if (entry->name()->equals(name) && 475 entry->loader() == loader && 476 entry->protection_domain() == domain) { 477 // We've found a match. 478 return entry; 479 } 480 } 481 482 if (!create_if_not_found) 483 return NULL; 484 485 // This is a new unloaded klass. Create it and stick it in 486 // the cache. 487 ciKlass* new_klass = NULL; 488 489 // Two cases: this is an unloaded ObjArrayKlass or an 490 // unloaded InstanceKlass. Deal with both. 491 if (name->byte_at(0) == '[') { 492 // Decompose the name.' 493 FieldArrayInfo fd; 494 BasicType element_type = FieldType::get_array_info(name->get_symbol(), 495 fd, THREAD); 496 if (HAS_PENDING_EXCEPTION) { 497 CLEAR_PENDING_EXCEPTION; 498 CURRENT_THREAD_ENV->record_out_of_memory_failure(); 499 return ciEnv::_unloaded_ciobjarrayklass; 500 } 501 int dimension = fd.dimension(); 502 assert(element_type != T_ARRAY, "unsuccessful decomposition"); 503 ciKlass* element_klass = NULL; 504 if (element_type == T_OBJECT) { 505 ciEnv *env = CURRENT_THREAD_ENV; 506 ciSymbol* ci_name = env->get_symbol(fd.object_key()); 507 element_klass = 508 env->get_klass_by_name(accessing_klass, ci_name, false)->as_instance_klass(); 509 } else { 510 assert(dimension > 1, "one dimensional type arrays are always loaded."); 511 512 // The type array itself takes care of one of the dimensions. 513 dimension--; 514 515 // The element klass is a TypeArrayKlass. 516 element_klass = ciTypeArrayKlass::make(element_type); 517 } 518 new_klass = new (arena()) ciObjArrayKlass(name, element_klass, dimension); 519 } else { 520 jobject loader_handle = NULL; 521 jobject domain_handle = NULL; 522 if (accessing_klass != NULL) { 523 loader_handle = accessing_klass->loader_handle(); 524 domain_handle = accessing_klass->protection_domain_handle(); 525 } 526 new_klass = new (arena()) ciInstanceKlass(name, loader_handle, domain_handle); 527 } 528 init_ident_of(new_klass); 529 _unloaded_klasses->append(new_klass); 530 531 return new_klass; 532} 533 534 535//------------------------------------------------------------------ 536// ciObjectFactory::get_unloaded_instance 537// 538// Get a ciInstance representing an as-yet undetermined instance of a given class. 539// 540ciInstance* ciObjectFactory::get_unloaded_instance(ciInstanceKlass* instance_klass) { 541 for (int i=0; i<_unloaded_instances->length(); i++) { 542 ciInstance* entry = _unloaded_instances->at(i); 543 if (entry->klass()->equals(instance_klass)) { 544 // We've found a match. 545 return entry; 546 } 547 } 548 549 // This is a new unloaded instance. Create it and stick it in 550 // the cache. 551 ciInstance* new_instance = new (arena()) ciInstance(instance_klass); 552 553 init_ident_of(new_instance); 554 _unloaded_instances->append(new_instance); 555 556 // make sure it looks the way we want: 557 assert(!new_instance->is_loaded(), ""); 558 assert(new_instance->klass() == instance_klass, ""); 559 560 return new_instance; 561} 562 563 564//------------------------------------------------------------------ 565// ciObjectFactory::get_unloaded_klass_mirror 566// 567// Get a ciInstance representing an unresolved klass mirror. 568// 569// Currently, this ignores the parameters and returns a unique unloaded instance. 570ciInstance* ciObjectFactory::get_unloaded_klass_mirror(ciKlass* type) { 571 assert(ciEnv::_Class_klass != NULL, ""); 572 return get_unloaded_instance(ciEnv::_Class_klass->as_instance_klass()); 573} 574 575//------------------------------------------------------------------ 576// ciObjectFactory::get_unloaded_method_handle_constant 577// 578// Get a ciInstance representing an unresolved method handle constant. 579// 580// Currently, this ignores the parameters and returns a unique unloaded instance. 581ciInstance* ciObjectFactory::get_unloaded_method_handle_constant(ciKlass* holder, 582 ciSymbol* name, 583 ciSymbol* signature, 584 int ref_kind) { 585 if (ciEnv::_MethodHandle_klass == NULL) return NULL; 586 return get_unloaded_instance(ciEnv::_MethodHandle_klass->as_instance_klass()); 587} 588 589//------------------------------------------------------------------ 590// ciObjectFactory::get_unloaded_method_type_constant 591// 592// Get a ciInstance representing an unresolved method type constant. 593// 594// Currently, this ignores the parameters and returns a unique unloaded instance. 595ciInstance* ciObjectFactory::get_unloaded_method_type_constant(ciSymbol* signature) { 596 if (ciEnv::_MethodType_klass == NULL) return NULL; 597 return get_unloaded_instance(ciEnv::_MethodType_klass->as_instance_klass()); 598} 599 600ciInstance* ciObjectFactory::get_unloaded_object_constant() { 601 if (ciEnv::_Object_klass == NULL) return NULL; 602 return get_unloaded_instance(ciEnv::_Object_klass->as_instance_klass()); 603} 604 605//------------------------------------------------------------------ 606// ciObjectFactory::get_empty_methodData 607// 608// Get the ciMethodData representing the methodData for a method with 609// none. 610ciMethodData* ciObjectFactory::get_empty_methodData() { 611 ciMethodData* new_methodData = new (arena()) ciMethodData(); 612 init_ident_of(new_methodData); 613 return new_methodData; 614} 615 616//------------------------------------------------------------------ 617// ciObjectFactory::get_return_address 618// 619// Get a ciReturnAddress for a specified bci. 620ciReturnAddress* ciObjectFactory::get_return_address(int bci) { 621 for (int i=0; i<_return_addresses->length(); i++) { 622 ciReturnAddress* entry = _return_addresses->at(i); 623 if (entry->bci() == bci) { 624 // We've found a match. 625 return entry; 626 } 627 } 628 629 ciReturnAddress* new_ret_addr = new (arena()) ciReturnAddress(bci); 630 init_ident_of(new_ret_addr); 631 _return_addresses->append(new_ret_addr); 632 return new_ret_addr; 633} 634 635// ------------------------------------------------------------------ 636// ciObjectFactory::init_ident_of 637void ciObjectFactory::init_ident_of(ciBaseObject* obj) { 638 obj->set_ident(_next_ident++); 639} 640 641// ------------------------------------------------------------------ 642// ciObjectFactory::find 643// 644// Use binary search to find the position of this oop in the cache. 645// If there is no entry in the cache corresponding to this oop, return 646// the position at which the oop should be inserted. 647int ciObjectFactory::find(Metadata* key, GrowableArray<ciMetadata*>* objects) { 648 int min = 0; 649 int max = objects->length()-1; 650 651 // print_contents(); 652 653 while (max >= min) { 654 int mid = (max + min) / 2; 655 Metadata* value = objects->at(mid)->constant_encoding(); 656 if (value < key) { 657 min = mid + 1; 658 } else if (value > key) { 659 max = mid - 1; 660 } else { 661 return mid; 662 } 663 } 664 return min; 665} 666 667// ------------------------------------------------------------------ 668// ciObjectFactory::is_found_at 669// 670// Verify that the binary seach found the given key. 671bool ciObjectFactory::is_found_at(int index, Metadata* key, GrowableArray<ciMetadata*>* objects) { 672 return (index < objects->length() && 673 objects->at(index)->constant_encoding() == key); 674} 675 676 677// ------------------------------------------------------------------ 678// ciObjectFactory::insert 679// 680// Insert a ciObject into the table at some index. 681void ciObjectFactory::insert(int index, ciMetadata* obj, GrowableArray<ciMetadata*>* objects) { 682 int len = objects->length(); 683 if (len == index) { 684 objects->append(obj); 685 } else { 686 objects->append(objects->at(len-1)); 687 int pos; 688 for (pos = len-2; pos >= index; pos--) { 689 objects->at_put(pos+1,objects->at(pos)); 690 } 691 objects->at_put(index, obj); 692 } 693} 694 695static ciObjectFactory::NonPermObject* emptyBucket = NULL; 696 697// ------------------------------------------------------------------ 698// ciObjectFactory::find_non_perm 699// 700// Use a small hash table, hashed on the klass of the key. 701// If there is no entry in the cache corresponding to this oop, return 702// the null tail of the bucket into which the oop should be inserted. 703ciObjectFactory::NonPermObject* &ciObjectFactory::find_non_perm(oop key) { 704 assert(Universe::heap()->is_in_reserved_or_null(key), "must be"); 705 ciMetadata* klass = get_metadata(key->klass()); 706 NonPermObject* *bp = &_non_perm_bucket[(unsigned) klass->hash() % NON_PERM_BUCKETS]; 707 for (NonPermObject* p; (p = (*bp)) != NULL; bp = &p->next()) { 708 if (is_equal(p, key)) break; 709 } 710 return (*bp); 711} 712 713 714 715// ------------------------------------------------------------------ 716// Code for for NonPermObject 717// 718inline ciObjectFactory::NonPermObject::NonPermObject(ciObjectFactory::NonPermObject* &bucket, oop key, ciObject* object) { 719 assert(ciObjectFactory::is_initialized(), ""); 720 _object = object; 721 _next = bucket; 722 bucket = this; 723} 724 725 726 727// ------------------------------------------------------------------ 728// ciObjectFactory::insert_non_perm 729// 730// Insert a ciObject into the non-perm table. 731void ciObjectFactory::insert_non_perm(ciObjectFactory::NonPermObject* &where, oop key, ciObject* obj) { 732 assert(Universe::heap()->is_in_reserved_or_null(key), "must be"); 733 assert(&where != &emptyBucket, "must not try to fill empty bucket"); 734 NonPermObject* p = new (arena()) NonPermObject(where, key, obj); 735 assert(where == p && is_equal(p, key) && p->object() == obj, "entry must match"); 736 assert(find_non_perm(key) == p, "must find the same spot"); 737 ++_non_perm_count; 738} 739 740// ------------------------------------------------------------------ 741// ciObjectFactory::vm_symbol_at 742// Get the ciSymbol corresponding to some index in vmSymbols. 743ciSymbol* ciObjectFactory::vm_symbol_at(int index) { 744 assert(index >= vmSymbols::FIRST_SID && index < vmSymbols::SID_LIMIT, "oob"); 745 return _shared_ci_symbols[index]; 746} 747 748// ------------------------------------------------------------------ 749// ciObjectFactory::metadata_do 750void ciObjectFactory::metadata_do(void f(Metadata*)) { 751 if (_ci_metadata == NULL) return; 752 for (int j = 0; j< _ci_metadata->length(); j++) { 753 Metadata* o = _ci_metadata->at(j)->constant_encoding(); 754 f(o); 755 } 756} 757 758// ------------------------------------------------------------------ 759// ciObjectFactory::print_contents_impl 760void ciObjectFactory::print_contents_impl() { 761 int len = _ci_metadata->length(); 762 tty->print_cr("ciObjectFactory (%d) meta data contents:", len); 763 for (int i=0; i<len; i++) { 764 _ci_metadata->at(i)->print(); 765 tty->cr(); 766 } 767} 768 769// ------------------------------------------------------------------ 770// ciObjectFactory::print_contents 771void ciObjectFactory::print_contents() { 772 print(); 773 tty->cr(); 774 GUARDED_VM_ENTRY(print_contents_impl();) 775} 776 777// ------------------------------------------------------------------ 778// ciObjectFactory::print 779// 780// Print debugging information about the object factory 781void ciObjectFactory::print() { 782 tty->print("<ciObjectFactory oops=%d metadata=%d unloaded_methods=%d unloaded_instances=%d unloaded_klasses=%d>", 783 _non_perm_count, _ci_metadata->length(), _unloaded_methods->length(), 784 _unloaded_instances->length(), 785 _unloaded_klasses->length()); 786} 787