src/share/vm/oops/instanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/oops/instanceKlass.cpp

src/share/vm/oops/instanceKlass.cpp

Print this page

        

*** 21,32 **** --- 21,34 ---- * questions. * */ #include "precompiled.hpp" + #include "aot/aotLoader.hpp" #include "classfile/classFileParser.hpp" #include "classfile/classFileStream.hpp" + #include "classfile/classLoader.hpp" #include "classfile/javaClasses.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/systemDictionaryShared.hpp" #include "classfile/verifier.hpp" #include "classfile/vmSymbols.hpp"
*** 142,152 **** InstanceKlass* InstanceKlass::allocate_instance_klass(const ClassFileParser& parser, TRAPS) { const int size = InstanceKlass::size(parser.vtable_size(), parser.itable_size(), nonstatic_oop_map_size(parser.total_oop_map_count()), parser.is_interface(), ! parser.is_anonymous()); const Symbol* const class_name = parser.class_name(); assert(class_name != NULL, "invariant"); ClassLoaderData* loader_data = parser.loader_data(); assert(loader_data != NULL, "invariant"); --- 144,155 ---- InstanceKlass* InstanceKlass::allocate_instance_klass(const ClassFileParser& parser, TRAPS) { const int size = InstanceKlass::size(parser.vtable_size(), parser.itable_size(), nonstatic_oop_map_size(parser.total_oop_map_count()), parser.is_interface(), ! parser.is_anonymous(), ! should_store_fingerprint()); const Symbol* const class_name = parser.class_name(); assert(class_name != NULL, "invariant"); ClassLoaderData* loader_data = parser.loader_data(); assert(loader_data != NULL, "invariant");
*** 785,794 **** --- 788,800 ---- THROW_OOP(e()); } } + // Look for aot compiled methods for this klass, including class initializer. + AOTLoader::load_for_klass(this_k, THREAD); + // Step 8 { assert(THREAD->is_Java_thread(), "non-JavaThread in initialize_impl"); JavaThread* jt = (JavaThread*)THREAD; DTRACE_CLASSINIT_PROBE_WAIT(clinit, this_k(), -1,wait);
*** 1948,1957 **** --- 1954,2030 ---- mdo->clean_method_data(is_alive); } } } + bool InstanceKlass::supers_have_passed_fingerprint_checks() { + if (java_super() != NULL && !java_super()->has_passed_fingerprint_check()) { + ResourceMark rm; + log_trace(class, fingerprint)("%s : super %s not fingerprinted", external_name(), java_super()->external_name()); + return false; + } + + Array<Klass*>* local_interfaces = this->local_interfaces(); + if (local_interfaces != NULL) { + int length = local_interfaces->length(); + for (int i = 0; i < length; i++) { + InstanceKlass* intf = InstanceKlass::cast(local_interfaces->at(i)); + if (!intf->has_passed_fingerprint_check()) { + ResourceMark rm; + log_trace(class, fingerprint)("%s : interface %s not fingerprinted", external_name(), intf->external_name()); + return false; + } + } + } + + return true; + } + + bool InstanceKlass::should_store_fingerprint() { + #if INCLUDE_AOT + // We store the fingerprint into the InstanceKlass only in the following 2 cases: + if (EnableJVMCI && !UseJVMCICompiler) { + // (1) We are running AOT to generate a shared library. + return true; + } + if (DumpSharedSpaces) { + // (2) We are running -Xshare:dump to create a shared archive + return true; + } + #endif + + // In all other cases we might set the _misc_has_passed_fingerprint_check bit, + // but do not store the 64-bit fingerprint to save space. + return false; + } + + bool InstanceKlass::has_stored_fingerprint() const { + #if INCLUDE_AOT + return should_store_fingerprint() || is_shared(); + #else + return false; + #endif + } + + uint64_t InstanceKlass::get_stored_fingerprint() const { + if (has_stored_fingerprint()) { + address adr = adr_fingerprint(); + assert(adr != NULL, "sanity"); + return (uint64_t)Bytes::get_native_u8(adr); // adr may not be 64-bit aligned + } + return 0; + } + + void InstanceKlass::store_fingerprint(uint64_t fingerprint) { + assert(should_store_fingerprint(), "must be"); + address adr = adr_fingerprint(); + assert(adr != NULL, "sanity"); + Bytes::put_native_u8(adr, (u8)fingerprint); // adr may not be 64-bit aligned + + ResourceMark rm; + log_trace(class, fingerprint)("stored as " PTR64_FORMAT " for class %s", fingerprint, external_name()); + } static void remove_unshareable_in_class(Klass* k) { // remove klass's unshareable info k->remove_unshareable_info(); }
src/share/vm/oops/instanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File