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