< prev index next >

src/hotspot/share/ci/ciField.cpp

Print this page

 53 // This allows non-static field lists to be cached on shared types.
 54 // Because the _type field is lazily initialized, however, there is a
 55 // special restriction that a shared field cannot cache an unshared type.
 56 // This puts a small performance penalty on shared fields with unshared
 57 // types, such as StackTraceElement[] Throwable.stackTrace.
 58 // (Throwable is shared because ClassCastException is shared, but
 59 // StackTraceElement is not presently shared.)
 60 
 61 // It is not a vicious circularity for a ciField to recursively create
 62 // the ciSymbols necessary to represent its name and signature.
 63 // Therefore, these items are created eagerly, and the name and signature
 64 // of a shared field are themselves shared symbols.  This somewhat
 65 // pollutes the set of shared CI objects:  It grows from 50 to 93 items,
 66 // with all of the additional 43 being uninteresting shared ciSymbols.
 67 // This adds at most one step to the binary search, an amount which
 68 // decreases for complex compilation tasks.
 69 
 70 // ------------------------------------------------------------------
 71 // ciField::ciField
 72 ciField::ciField(ciInstanceKlass* klass, int index, Bytecodes::Code bc) :
 73     _known_to_link_with_put(nullptr), _known_to_link_with_get(nullptr) {
 74   ASSERT_IN_VM;
 75   CompilerThread *THREAD = CompilerThread::current();
 76 
 77   assert(ciObjectFactory::is_initialized(), "not a shared field");
 78 
 79   assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constant-pool");
 80 
 81   constantPoolHandle cpool(THREAD, klass->get_instanceKlass()->constants());
 82 
 83   // Get the field's name, signature, and type.
 84   Symbol* name  = cpool->name_ref_at(index, bc);
 85   _name = ciEnv::current(THREAD)->get_symbol(name);
 86 
 87   int nt_index = cpool->name_and_type_ref_index_at(index, bc);
 88   int sig_index = cpool->signature_ref_index_at(nt_index);
 89   Symbol* signature = cpool->symbol_at(sig_index);
 90   _signature = ciEnv::current(THREAD)->get_symbol(signature);
 91 
 92   BasicType field_type = Signature::basic_type(signature);
 93 
 94   // If the field is a pointer type, get the klass of the
 95   // field.
 96   if (is_reference_type(field_type)) {
 97     bool ignore;
 98     // This is not really a class reference; the index always refers to the
 99     // field's type signature, as a symbol.  Linkage checks do not apply.
100     _type = ciEnv::current(THREAD)->get_klass_by_index(cpool, sig_index, ignore, klass);
101   } else {
102     _type = ciType::make(field_type);
103   }
104 



105   // Get the field's declared holder.
106   //
107   // Note: we actually create a ciInstanceKlass for this klass,
108   // even though we may not need to.
109   int holder_index = cpool->klass_ref_index_at(index, bc);
110   bool holder_is_accessible;
111 
112   ciKlass* generic_declared_holder = ciEnv::current(THREAD)->get_klass_by_index(cpool, holder_index,
113                                                                                 holder_is_accessible,
114                                                                                 klass);
115 
116   if (generic_declared_holder->is_array_klass()) {
117     // If the declared holder of the field is an array class, assume that
118     // the canonical holder of that field is java.lang.Object. Arrays
119     // do not have fields; java.lang.Object is the only supertype of an
120     // array type that can declare fields and is therefore the canonical
121     // holder of the array type.
122     //
123     // Furthermore, the compilers assume that java.lang.Object does not
124     // have any fields. Therefore, the field is not looked up. Instead,

196   _name = env->get_symbol(fd->name());
197   _signature = env->get_symbol(fd->signature());
198 
199   BasicType field_type = fd->field_type();
200 
201   // If the field is a pointer type, get the klass of the
202   // field.
203   if (is_reference_type(field_type)) {
204     _type = nullptr;  // must call compute_type on first access
205   } else {
206     _type = ciType::make(field_type);
207   }
208 
209   initialize_from(fd);
210 
211   // Either (a) it is marked shared, or else (b) we are done bootstrapping.
212   assert(is_shared() || ciObjectFactory::is_initialized(),
213          "bootstrap classes must not create & cache unshared fields");
214 }
215 


























216 static bool trust_final_non_static_fields(ciInstanceKlass* holder) {
217   if (holder == nullptr)
218     return false;
219   if (holder->name() == ciSymbols::java_lang_System())
220     // Never trust strangely unstable finals:  System.out, etc.
221     return false;
222   // Even if general trusting is disabled, trust system-built closures in these packages.
223   if (holder->is_in_package("java/lang/invoke") || holder->is_in_package("sun/invoke") ||
224       holder->is_in_package("java/lang/reflect") || holder->is_in_package("jdk/internal/reflect") ||
225       holder->is_in_package("jdk/internal/foreign/layout") || holder->is_in_package("jdk/internal/foreign") ||
226       holder->is_in_package("jdk/internal/vm/vector") || holder->is_in_package("jdk/incubator/vector") ||
227       holder->is_in_package("java/lang"))
228     return true;
229   // Trust hidden classes. They are created via Lookup.defineHiddenClass and
230   // can't be serialized, so there is no hacking of finals going on with them.
231   if (holder->is_hidden())
232     return true;



233   // Trust final fields in all boxed classes
234   if (holder->is_box_klass())
235     return true;
236   // Trust final fields in records
237   if (holder->is_record())
238     return true;
239   // Trust final fields in String
240   if (holder->name() == ciSymbols::java_lang_String())
241     return true;
242   // Trust Atomic*FieldUpdaters: they are very important for performance, and make up one
243   // more reason not to use Unsafe, if their final fields are trusted. See more in JDK-8140483.
244   if (holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicIntegerFieldUpdater_Impl() ||
245       holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicLongFieldUpdater_CASUpdater() ||
246       holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicLongFieldUpdater_LockedUpdater() ||
247       holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicReferenceFieldUpdater_Impl()) {
248     return true;
249   }
250   return TrustFinalNonStaticFields;
251 }
252 
253 void ciField::initialize_from(fieldDescriptor* fd) {
254   // Get the flags, offset, and canonical holder of the field.
255   _flags = ciFlags(fd->access_flags(), fd->field_flags().is_stable(), fd->field_status().is_initialized_final_update());
256   _offset = fd->offset();
257   Klass* field_holder = fd->field_holder();
258   assert(field_holder != nullptr, "null field_holder");
259   _holder = CURRENT_ENV->get_instance_klass(field_holder);









260 
261   // Check to see if the field is constant.
262   Klass* k = _holder->get_Klass();
263   bool is_stable_field = FoldStableValues && is_stable();
264   if ((is_final() && !has_initialized_final_update()) || is_stable_field) {
265     if (is_static()) {
266       // This field just may be constant.  The only case where it will
267       // not be constant is when the field is a *special* static & final field
268       // whose value may change.  The three examples are java.lang.System.in,
269       // java.lang.System.out, and java.lang.System.err.
270       assert(vmClasses::System_klass() != nullptr, "Check once per vm");
271       if (k == vmClasses::System_klass()) {
272         // Check offsets for case 2: System.in, System.out, or System.err
273         if (_offset == java_lang_System::in_offset()  ||
274             _offset == java_lang_System::out_offset() ||
275             _offset == java_lang_System::err_offset()) {
276           _is_constant = false;
277           return;
278         }
279       }

322 // Get the constant value of non-static final field in the given object.
323 ciConstant ciField::constant_value_of(ciObject* object) {
324   assert(!is_static() && is_constant(), "only if field is non-static constant");
325   assert(object->is_instance(), "must be instance");
326   ciConstant field_value = object->as_instance()->field_value(this);
327   if (FoldStableValues && is_stable() && field_value.is_null_or_zero()) {
328     return ciConstant();
329   }
330   return field_value;
331 }
332 
333 // ------------------------------------------------------------------
334 // ciField::compute_type
335 //
336 // Lazily compute the type, if it is an instance klass.
337 ciType* ciField::compute_type() {
338   GUARDED_VM_ENTRY(return compute_type_impl();)
339 }
340 
341 ciType* ciField::compute_type_impl() {
342   ciKlass* type = CURRENT_ENV->get_klass_by_name_impl(_holder, constantPoolHandle(), _signature, false);


343   if (!type->is_primitive_type() && is_shared()) {
344     // We must not cache a pointer to an unshared type, in a shared field.
345     bool type_is_also_shared = false;
346     if (type->is_type_array_klass()) {
347       type_is_also_shared = true;  // int[] etc. are explicitly bootstrapped
348     } else if (type->is_instance_klass()) {
349       type_is_also_shared = type->as_instance_klass()->is_shared();
350     } else {
351       // Currently there is no 'shared' query for array types.
352       type_is_also_shared = !ciObjectFactory::is_initialized();
353     }
354     if (!type_is_also_shared)
355       return type;              // Bummer.
356   }
357   _type = type;
358   return type;
359 }
360 
361 
362 // ------------------------------------------------------------------

435 // ------------------------------------------------------------------
436 // ciField::print
437 void ciField::print() {
438   tty->print("<ciField name=");
439   _holder->print_name();
440   tty->print(".");
441   _name->print_symbol();
442   tty->print(" signature=");
443   _signature->print_symbol();
444   tty->print(" offset=%d type=", _offset);
445   if (_type != nullptr)
446     _type->print_name();
447   else
448     tty->print("(reference)");
449   tty->print(" flags=%04x", flags().as_int());
450   tty->print(" is_constant=%s", bool_to_str(_is_constant));
451   if (_is_constant && is_static()) {
452     tty->print(" constant_value=");
453     _constant_value.print();
454   }



455   tty->print(">");
456 }
457 
458 // ------------------------------------------------------------------
459 // ciField::print_name_on
460 //
461 // Print the name of this field
462 void ciField::print_name_on(outputStream* st) {
463   name()->print_symbol_on(st);
464 }

 53 // This allows non-static field lists to be cached on shared types.
 54 // Because the _type field is lazily initialized, however, there is a
 55 // special restriction that a shared field cannot cache an unshared type.
 56 // This puts a small performance penalty on shared fields with unshared
 57 // types, such as StackTraceElement[] Throwable.stackTrace.
 58 // (Throwable is shared because ClassCastException is shared, but
 59 // StackTraceElement is not presently shared.)
 60 
 61 // It is not a vicious circularity for a ciField to recursively create
 62 // the ciSymbols necessary to represent its name and signature.
 63 // Therefore, these items are created eagerly, and the name and signature
 64 // of a shared field are themselves shared symbols.  This somewhat
 65 // pollutes the set of shared CI objects:  It grows from 50 to 93 items,
 66 // with all of the additional 43 being uninteresting shared ciSymbols.
 67 // This adds at most one step to the binary search, an amount which
 68 // decreases for complex compilation tasks.
 69 
 70 // ------------------------------------------------------------------
 71 // ciField::ciField
 72 ciField::ciField(ciInstanceKlass* klass, int index, Bytecodes::Code bc) :
 73   _original_holder(nullptr), _is_flat(false), _known_to_link_with_put(nullptr), _known_to_link_with_get(nullptr) {
 74   ASSERT_IN_VM;
 75   CompilerThread *THREAD = CompilerThread::current();
 76 
 77   assert(ciObjectFactory::is_initialized(), "not a shared field");
 78 
 79   assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constant-pool");
 80 
 81   constantPoolHandle cpool(THREAD, klass->get_instanceKlass()->constants());
 82 
 83   // Get the field's name, signature, and type.
 84   Symbol* name  = cpool->name_ref_at(index, bc);
 85   _name = ciEnv::current(THREAD)->get_symbol(name);
 86 
 87   int nt_index = cpool->name_and_type_ref_index_at(index, bc);
 88   int sig_index = cpool->signature_ref_index_at(nt_index);
 89   Symbol* signature = cpool->symbol_at(sig_index);
 90   _signature = ciEnv::current(THREAD)->get_symbol(signature);
 91 
 92   BasicType field_type = Signature::basic_type(signature);
 93 
 94   // If the field is a pointer type, get the klass of the
 95   // field.
 96   if (is_reference_type(field_type)) {
 97     bool ignore;
 98     // This is not really a class reference; the index always refers to the
 99     // field's type signature, as a symbol.  Linkage checks do not apply.
100     _type = ciEnv::current(THREAD)->get_klass_by_index(cpool, sig_index, ignore, klass);
101   } else {
102     _type = ciType::make(field_type);
103   }
104 
105   _is_null_free = false;
106   _null_marker_offset = -1;
107 
108   // Get the field's declared holder.
109   //
110   // Note: we actually create a ciInstanceKlass for this klass,
111   // even though we may not need to.
112   int holder_index = cpool->klass_ref_index_at(index, bc);
113   bool holder_is_accessible;
114 
115   ciKlass* generic_declared_holder = ciEnv::current(THREAD)->get_klass_by_index(cpool, holder_index,
116                                                                                 holder_is_accessible,
117                                                                                 klass);
118 
119   if (generic_declared_holder->is_array_klass()) {
120     // If the declared holder of the field is an array class, assume that
121     // the canonical holder of that field is java.lang.Object. Arrays
122     // do not have fields; java.lang.Object is the only supertype of an
123     // array type that can declare fields and is therefore the canonical
124     // holder of the array type.
125     //
126     // Furthermore, the compilers assume that java.lang.Object does not
127     // have any fields. Therefore, the field is not looked up. Instead,

199   _name = env->get_symbol(fd->name());
200   _signature = env->get_symbol(fd->signature());
201 
202   BasicType field_type = fd->field_type();
203 
204   // If the field is a pointer type, get the klass of the
205   // field.
206   if (is_reference_type(field_type)) {
207     _type = nullptr;  // must call compute_type on first access
208   } else {
209     _type = ciType::make(field_type);
210   }
211 
212   initialize_from(fd);
213 
214   // Either (a) it is marked shared, or else (b) we are done bootstrapping.
215   assert(is_shared() || ciObjectFactory::is_initialized(),
216          "bootstrap classes must not create & cache unshared fields");
217 }
218 
219 // Special copy constructor used to flatten inline type fields by
220 // copying the fields of the inline type to a new holder klass.
221 ciField::ciField(ciField* field, ciInstanceKlass* holder, int offset, bool is_final) {
222   assert(field->holder()->is_inlinetype() || field->holder()->is_abstract(), "should only be used for inline type field flattening");
223   // Set the is_final flag
224   jint final = is_final ? JVM_ACC_FINAL : ~JVM_ACC_FINAL;
225   AccessFlags flags(field->flags().as_int() & final);
226   _flags = ciFlags(flags);
227   _holder = holder;
228   _offset = offset;
229   // Copy remaining fields
230   _name = field->_name;
231   _signature = field->_signature;
232   _type = field->_type;
233   // Trust final flat fields
234   _is_constant = is_final;
235   _known_to_link_with_put = field->_known_to_link_with_put;
236   _known_to_link_with_get = field->_known_to_link_with_get;
237   _constant_value = field->_constant_value;
238   assert(!field->is_flat(), "field must not be flat");
239   _is_flat = false;
240   _is_null_free = field->_is_null_free;
241   _null_marker_offset = field->_null_marker_offset;
242   _original_holder = (field->_original_holder != nullptr) ? field->_original_holder : field->_holder;
243 }
244 
245 static bool trust_final_non_static_fields(ciInstanceKlass* holder) {
246   if (holder == nullptr)
247     return false;
248   if (holder->name() == ciSymbols::java_lang_System())
249     // Never trust strangely unstable finals:  System.out, etc.
250     return false;
251   // Even if general trusting is disabled, trust system-built closures in these packages.
252   if (holder->is_in_package("java/lang/invoke") || holder->is_in_package("sun/invoke") ||
253       holder->is_in_package("java/lang/reflect") || holder->is_in_package("jdk/internal/reflect") ||
254       holder->is_in_package("jdk/internal/foreign/layout") || holder->is_in_package("jdk/internal/foreign") ||
255       holder->is_in_package("jdk/internal/vm/vector") || holder->is_in_package("jdk/incubator/vector") ||
256       holder->is_in_package("java/lang"))
257     return true;
258   // Trust hidden classes. They are created via Lookup.defineHiddenClass and
259   // can't be serialized, so there is no hacking of finals going on with them.
260   if (holder->is_hidden())
261     return true;
262   // Trust final fields in inline type buffers
263   if (holder->is_inlinetype())
264     return true;
265   // Trust final fields in all boxed classes
266   if (holder->is_box_klass())
267     return true;
268   // Trust final fields in records
269   if (holder->is_record())
270     return true;
271   // Trust final fields in String
272   if (holder->name() == ciSymbols::java_lang_String())
273     return true;
274   // Trust Atomic*FieldUpdaters: they are very important for performance, and make up one
275   // more reason not to use Unsafe, if their final fields are trusted. See more in JDK-8140483.
276   if (holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicIntegerFieldUpdater_Impl() ||
277       holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicLongFieldUpdater_CASUpdater() ||
278       holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicLongFieldUpdater_LockedUpdater() ||
279       holder->name() == ciSymbols::java_util_concurrent_atomic_AtomicReferenceFieldUpdater_Impl()) {
280     return true;
281   }
282   return TrustFinalNonStaticFields;
283 }
284 
285 void ciField::initialize_from(fieldDescriptor* fd) {
286   // Get the flags, offset, and canonical holder of the field.
287   _flags = ciFlags(fd->access_flags(), fd->field_flags().is_stable(), fd->field_status().is_initialized_final_update());
288   _offset = fd->offset();
289   InstanceKlass* field_holder = fd->field_holder();
290   assert(field_holder != nullptr, "null field_holder");
291   _holder = CURRENT_ENV->get_instance_klass(field_holder);
292   _is_flat = fd->is_flat();
293   _is_null_free = fd->is_null_free_inline_type();
294   if (fd->has_null_marker()) {
295     InlineLayoutInfo* li = field_holder->inline_layout_info_adr(fd->index());
296     _null_marker_offset = li->null_marker_offset();
297   } else {
298     _null_marker_offset = -1;
299   }
300   _original_holder = nullptr;
301 
302   // Check to see if the field is constant.
303   Klass* k = _holder->get_Klass();
304   bool is_stable_field = FoldStableValues && is_stable();
305   if ((is_final() && !has_initialized_final_update()) || is_stable_field) {
306     if (is_static()) {
307       // This field just may be constant.  The only case where it will
308       // not be constant is when the field is a *special* static & final field
309       // whose value may change.  The three examples are java.lang.System.in,
310       // java.lang.System.out, and java.lang.System.err.
311       assert(vmClasses::System_klass() != nullptr, "Check once per vm");
312       if (k == vmClasses::System_klass()) {
313         // Check offsets for case 2: System.in, System.out, or System.err
314         if (_offset == java_lang_System::in_offset()  ||
315             _offset == java_lang_System::out_offset() ||
316             _offset == java_lang_System::err_offset()) {
317           _is_constant = false;
318           return;
319         }
320       }

363 // Get the constant value of non-static final field in the given object.
364 ciConstant ciField::constant_value_of(ciObject* object) {
365   assert(!is_static() && is_constant(), "only if field is non-static constant");
366   assert(object->is_instance(), "must be instance");
367   ciConstant field_value = object->as_instance()->field_value(this);
368   if (FoldStableValues && is_stable() && field_value.is_null_or_zero()) {
369     return ciConstant();
370   }
371   return field_value;
372 }
373 
374 // ------------------------------------------------------------------
375 // ciField::compute_type
376 //
377 // Lazily compute the type, if it is an instance klass.
378 ciType* ciField::compute_type() {
379   GUARDED_VM_ENTRY(return compute_type_impl();)
380 }
381 
382 ciType* ciField::compute_type_impl() {
383   // Use original holder for fields that came in through flattening
384   ciKlass* accessing_klass = (_original_holder != nullptr) ? _original_holder : _holder;
385   ciKlass* type = CURRENT_ENV->get_klass_by_name_impl(accessing_klass, constantPoolHandle(), _signature, false);
386   if (!type->is_primitive_type() && is_shared()) {
387     // We must not cache a pointer to an unshared type, in a shared field.
388     bool type_is_also_shared = false;
389     if (type->is_type_array_klass()) {
390       type_is_also_shared = true;  // int[] etc. are explicitly bootstrapped
391     } else if (type->is_instance_klass()) {
392       type_is_also_shared = type->as_instance_klass()->is_shared();
393     } else {
394       // Currently there is no 'shared' query for array types.
395       type_is_also_shared = !ciObjectFactory::is_initialized();
396     }
397     if (!type_is_also_shared)
398       return type;              // Bummer.
399   }
400   _type = type;
401   return type;
402 }
403 
404 
405 // ------------------------------------------------------------------

478 // ------------------------------------------------------------------
479 // ciField::print
480 void ciField::print() {
481   tty->print("<ciField name=");
482   _holder->print_name();
483   tty->print(".");
484   _name->print_symbol();
485   tty->print(" signature=");
486   _signature->print_symbol();
487   tty->print(" offset=%d type=", _offset);
488   if (_type != nullptr)
489     _type->print_name();
490   else
491     tty->print("(reference)");
492   tty->print(" flags=%04x", flags().as_int());
493   tty->print(" is_constant=%s", bool_to_str(_is_constant));
494   if (_is_constant && is_static()) {
495     tty->print(" constant_value=");
496     _constant_value.print();
497   }
498   tty->print(" is_flat=%s", bool_to_str(_is_flat));
499   tty->print(" is_null_free=%s", bool_to_str(_is_null_free));
500   tty->print(" null_marker_offset=%d", _null_marker_offset);
501   tty->print(">");
502 }
503 
504 // ------------------------------------------------------------------
505 // ciField::print_name_on
506 //
507 // Print the name of this field
508 void ciField::print_name_on(outputStream* st) {
509   name()->print_symbol_on(st);
510 }
< prev index next >